#pragma once #include #include #include namespace DB { using Poco::SharedPtr; /** Выполняет над блоком вычисление некоторого выражения. * Выражение состоит из идентификаторов столбцов из блока, констант, обычных функций. * Например: hits * 2 + 3, instr("yandex", url) * Выражение не меняет количество строк в потоке, и обрабатывает каждую строку независимо от других. * part_id - идентификатор части выражения, которую надо вычислять. * Например, может потребоваться вычислить только часть выражения в секции WHERE. * clear_temporaries - удалить временные столбцы из блока, которые больше не понадобятся ни для каких вычислений. */ class ExpressionBlockInputStream : public IProfilingBlockInputStream { public: ExpressionBlockInputStream(BlockInputStreamPtr input_, ExpressionPtr expression_, unsigned part_id_ = 0, bool clear_temporaries_ = false) : input(input_), expression(expression_), part_id(part_id_), clear_temporaries(clear_temporaries_) { children.push_back(input); } String getName() const { return "ExpressionBlockInputStream"; } BlockInputStreamPtr clone() { return new ExpressionBlockInputStream(input, expression, part_id); } protected: Block readImpl() { Block res = input->read(); if (!res) return res; expression->execute(res, part_id); if (clear_temporaries) expression->clearTemporaries(res); return res; } private: BlockInputStreamPtr input; ExpressionPtr expression; unsigned part_id; bool clear_temporaries; }; }