#pragma once #include #include #include namespace DB { using Poco::SharedPtr; /** Выполняет над блоком вычисление некоторого выражения. * Выражение состоит из идентификаторов столбцов из блока, констант, обычных функций. * Например: hits * 2 + 3, instr("yandex", url) * Выражение не меняет количество строк в потоке, и обрабатывает каждую строку независимо от других. */ class ExpressionBlockInputStream : public IProfilingBlockInputStream { public: ExpressionBlockInputStream(BlockInputStreamPtr input_, ExpressionActionsPtr expression_) : expression(expression_) { children.push_back(input_); } String getName() const override { return "ExpressionBlockInputStream"; } String getID() const override { std::stringstream res; res << "Expression(" << children.back()->getID() << ", " << expression->getID() << ")"; return res.str(); } const Block & getTotals() override { if (IProfilingBlockInputStream * child = dynamic_cast(&*children.back())) { totals = child->getTotals(); if (totals) expression->execute(totals); } return totals; } protected: Block readImpl() override { Block res = children.back()->read(); if (!res) return res; expression->execute(res); return res; } private: ExpressionActionsPtr expression; }; }