dbms: development [#CONV-2944].

This commit is contained in:
Alexey Milovidov 2011-08-09 19:19:25 +00:00
parent 9f5cc680a4
commit 568a4de64c
2 changed files with 80 additions and 0 deletions

View File

@ -0,0 +1,27 @@
#pragma once
#include <map>
#include <Poco/SharedPtr.h>
#include <DB/Core/NamesAndTypes.h>
#include <DB/Functions/IFunction.h>
namespace DB
{
using Poco::SharedPtr;
typedef std::map<String, SharedPtr<IFunction> > Functions;
/** Набор известных объектов, которые могут быть использованы в запросе.
*/
struct Context
{
Functions functions;
NamesAndTypes columns;
};
}

View File

@ -0,0 +1,53 @@
#pragma once
#include <Poco/SharedPtr.h>
#include <DB/Parsers/IAST.h>
#include <DB/Interpreters/Context.h>
namespace DB
{
/** Интерпретирует выражение из синтаксического дерева,
* в котором присутствуют имена столбцов, константы и обычные функции.
*/
class Expression
{
public:
Expression(IAST & ast_, const Context & context_) : ast(ast_), context(context_)
{
addSemantic();
checkTypes();
glueTree();
}
/** Выполнить выражение над блоком. Блок должен содержать все столбцы - идентификаторы.
*/
void execute(Block & block);
private:
IAST & ast;
Context & context;
/** Для узлов - литералов, создать соответствующие столбцы-константы и типы данных.
* Для узлов - функций - прописать ссылки на функции и заменить имена на канонические.
* Для узлов - идентификаторов - прописать ссылки на их типы.
*/
void addSemantic();
/** Проверить, что все функции применимы.
*/
void checkTypes();
/** Склеить одинаковые узлы в синтаксическом дереве (превращая его в направленный ациклический граф).
* Это означает, в том числе то, что функции с одними и теми же аргументами, будут выполняться только один раз.
* Например, выражение rand(), rand() вернёт два идентичных столбца.
* Поэтому, все функции, в которых такое поведение нежелательно, должны содержать дополнительный параметр "тег".
*/
void glueTree();
};
}