ClickHouse/dbms/include/DB/Interpreters/Expression.h

88 lines
3.5 KiB
C
Raw Normal View History

2011-08-09 19:19:25 +00:00
#pragma once
2011-08-13 23:03:07 +00:00
#include <set>
2011-08-09 19:19:25 +00:00
#include <Poco/SharedPtr.h>
#include <DB/Parsers/IAST.h>
#include <DB/Interpreters/Context.h>
namespace DB
{
/** Интерпретирует выражение из синтаксического дерева,
* в котором присутствуют имена столбцов, константы и обычные функции.
*/
class Expression
{
public:
2011-08-12 18:27:39 +00:00
Expression(ASTPtr ast_, const Context & context_) : ast(ast_), context(context_)
2011-08-09 19:19:25 +00:00
{
2011-08-12 18:27:39 +00:00
addSemantic(ast);
checkTypes(ast);
glueTree(ast);
2011-08-09 19:19:25 +00:00
}
2011-08-28 05:13:24 +00:00
/** Получить список столбцов, которых необходимо прочитать из таблицы, чтобы выполнить выражение.
*/
Names getRequiredColumns();
2011-08-09 19:19:25 +00:00
/** Выполнить выражение над блоком. Блок должен содержать все столбцы - идентификаторы.
2011-08-12 18:27:39 +00:00
* Функция добавляет в блок новые столбцы - результаты вычислений.
2011-08-28 02:22:23 +00:00
* part_id - какую часть выражения вычислять.
2011-08-09 19:19:25 +00:00
*/
2011-08-28 02:22:23 +00:00
void execute(Block & block, unsigned part_id = 0);
/** Взять из блока с промежуточными результатами вычислений только столбцы, представляющие собой конечный результат.
* Вернуть новый блок, в котором эти столбцы расположены в правильном порядке.
*/
2011-08-28 05:13:24 +00:00
Block projectResult(Block & block, unsigned part_id = 0);
2011-08-09 19:19:25 +00:00
2011-08-14 00:49:30 +00:00
/** Получить список типов столбцов результата.
*/
DataTypes getReturnTypes();
2011-08-09 19:19:25 +00:00
private:
2011-08-12 18:27:39 +00:00
ASTPtr ast;
const Context & context;
2011-08-09 19:19:25 +00:00
2011-08-28 05:13:24 +00:00
typedef std::set<String> NamesSet;
NamesSet required_columns;
2011-08-09 19:19:25 +00:00
2011-08-13 21:05:18 +00:00
/** Для узлов - литералов - прописать их типы данных.
2011-08-09 19:19:25 +00:00
* Для узлов - функций - прописать ссылки на функции и заменить имена на канонические.
* Для узлов - идентификаторов - прописать ссылки на их типы.
*/
2011-08-12 18:27:39 +00:00
void addSemantic(ASTPtr ast);
2011-08-09 19:19:25 +00:00
/** Проверить, что все функции применимы.
*/
2011-08-12 18:27:39 +00:00
void checkTypes(ASTPtr ast);
2011-08-09 19:19:25 +00:00
/** Склеить одинаковые узлы в синтаксическом дереве (превращая его в направленный ациклический граф).
* Это означает, в том числе то, что функции с одними и теми же аргументами, будут выполняться только один раз.
* Например, выражение rand(), rand() вернёт два идентичных столбца.
* Поэтому, все функции, в которых такое поведение нежелательно, должны содержать дополнительный параметр "тег".
*/
2011-08-12 18:27:39 +00:00
void glueTree(ASTPtr ast);
typedef std::map<String, ASTPtr> Subtrees;
void glueTreeImpl(ASTPtr ast, Subtrees & Subtrees);
/** Прописать во всех узлах, что они ещё не вычислены.
*/
2011-08-28 02:22:23 +00:00
void setNotCalculated(ASTPtr ast, unsigned part_id);
2011-08-12 18:27:39 +00:00
2011-08-28 02:22:23 +00:00
void executeImpl(ASTPtr ast, Block & block, unsigned part_id);
2011-08-13 23:03:07 +00:00
2011-08-28 05:13:24 +00:00
void collectFinalColumns(ASTPtr ast, Block & src, Block & dst, unsigned part_id);
2011-08-14 00:49:30 +00:00
void getReturnTypesImpl(ASTPtr ast, DataTypes & res);
2011-08-09 19:19:25 +00:00
};
}