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

123 lines
5.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>
2011-09-24 20:32:41 +00:00
#include <DB/Interpreters/Aggregator.h>
2011-08-09 19:19:25 +00:00
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-11-06 04:21:09 +00:00
createAliasesDict(ast);
2011-08-12 18:27:39 +00:00
addSemantic(ast);
glueTree(ast);
2011-08-09 19:19:25 +00:00
}
2011-08-28 05:13:24 +00:00
/** Получить список столбцов, которых необходимо прочитать из таблицы, чтобы выполнить выражение.
*/
Names getRequiredColumns();
2011-09-25 03:37:09 +00:00
/** Прописать во всех узлах, что они ещё не вычислены.
* Вызывайте в начале серии вычислений, для каждого блока.
*/
void setNotCalculated(unsigned part_id = 0, ASTPtr subtree = NULL);
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-11-06 04:21:09 +00:00
* Переименовать их в алиасы, если они заданы и если параметр without_duplicates_and_aliases = false.
2011-08-28 02:22:23 +00:00
* Вернуть новый блок, в котором эти столбцы расположены в правильном порядке.
*/
2011-11-06 04:21:09 +00:00
Block projectResult(Block & block, bool without_duplicates_and_aliases = false, unsigned part_id = 0, ASTPtr subtree = NULL);
2011-08-09 19:19:25 +00:00
2011-08-14 00:49:30 +00:00
/** Получить список типов столбцов результата.
*/
DataTypes getReturnTypes();
2011-10-30 05:19:41 +00:00
/** Получить блок-образец, содержащий имена и типы столбцов результата.
*/
Block getSampleBlock();
2011-09-24 20:32:41 +00:00
/** Получить список ключей агрегирования и описаний агрегатных функций, если в запросе есть GROUP BY.
*/
void getAggregateInfo(Names & key_names, AggregateDescriptions & aggregates);
2011-09-25 03:37:09 +00:00
/** Есть ли в выражении агрегатные функции.
*/
bool hasAggregates();
/** Пометить то, что должно быть вычислено до агрегирования одним part_id,
* а то, что должно быть вычислено после агрегирования, а также сами агрегатные функции - другим part_id.
*/
void markBeforeAndAfterAggregation(unsigned before_part_id, unsigned after_part_id);
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-11-03 20:30:12 +00:00
2011-11-06 04:21:09 +00:00
typedef std::map<String, ASTPtr> Aliases;
Aliases aliases;
2011-11-03 20:30:12 +00:00
NamesAndTypesList::const_iterator findColumn(const String & name);
2011-11-06 04:21:09 +00:00
/** Создать словарь алиасов.
*/
void createAliasesDict(ASTPtr & ast);
2011-08-28 08:50:27 +00:00
/** Для узлов - звёздочек - раскрыть их в список всех столбцов.
* Для узлов - литералов - прописать их типы данных.
2011-09-25 05:07:47 +00:00
* Для узлов - функций - прописать ссылки на функции, заменить имена на канонические, прописать и проверить типы.
2011-08-09 19:19:25 +00:00
* Для узлов - идентификаторов - прописать ссылки на их типы.
2011-09-25 05:07:47 +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
/** Склеить одинаковые узлы в синтаксическом дереве (превращая его в направленный ациклический граф).
* Это означает, в том числе то, что функции с одними и теми же аргументами, будут выполняться только один раз.
* Например, выражение 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 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-09-24 20:32:41 +00:00
2011-10-30 05:19:41 +00:00
void getSampleBlockImpl(ASTPtr ast, Block & res);
2011-09-25 03:37:09 +00:00
void getAggregateInfoImpl(ASTPtr ast, Names & key_names, AggregateDescriptions & aggregates, NamesSet & processed);
bool hasAggregatesImpl(ASTPtr ast);
void markBeforeAndAfterAggregationImpl(ASTPtr ast, unsigned before_part_id, unsigned after_part_id, bool below = false);
2011-08-09 19:19:25 +00:00
};
}