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-09-04 05:14:52 +00:00
|
|
|
|
Block projectResult(Block & block, bool without_duplicates = false, 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-09-04 05:14:52 +00:00
|
|
|
|
|
2011-08-09 19:19:25 +00:00
|
|
|
|
|
2011-08-28 08:50:27 +00:00
|
|
|
|
/** Для узлов - звёздочек - раскрыть их в список всех столбцов.
|
|
|
|
|
* Для узлов - литералов - прописать их типы данных.
|
2011-08-09 19:19:25 +00:00
|
|
|
|
* Для узлов - функций - прописать ссылки на функции и заменить имена на канонические.
|
|
|
|
|
* Для узлов - идентификаторов - прописать ссылки на их типы.
|
|
|
|
|
*/
|
2011-08-28 08:50:27 +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-09-04 05:14:52 +00:00
|
|
|
|
void collectFinalColumns(ASTPtr ast, Block & src, Block & dst, bool without_duplicates, 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
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|