ClickHouse/dbms/include/DB/Parsers/ASTJoin.h

77 lines
2.7 KiB
C
Raw Normal View History

#pragma once
#include <DB/Parsers/IAST.h>
namespace DB
{
/** [GLOBAL] ANY|ALL INNER|LEFT JOIN (subquery) USING (tuple)
* Замечание: ARRAY JOIN к этому не относится.
*/
class ASTJoin : public IAST
{
public:
/// Алгоритм работы при распределённой обработке запроса.
enum Locality
{
Local, /// Выполнить JOIN, используя соответствующие данные в пределах каждого удалённого сервера.
Global /// Собрать соединяемые данные со всех удалённых серверов, объединить их, затем отправить на каждый удалённый сервер.
};
/// Оптимизация JOIN-а для большинства простых случаев.
enum Strictness
{
Any, /// Если в "правой" таблице несколько подходящих строк - выбрать из них одну, любую.
All /// Если в "правой" таблице несколько подходящих строк - размножить строки по ним (обычная семантика JOIN-а).
};
/// Способ соединения.
enum Kind
{
Inner, /// Оставить только записи, для которых в "правой" таблице есть соответствующая.
Left /// Если в "правой" таблице нет соответствующих записей, заполнить столбцы значениями "по-умолчанию".
};
Locality locality = Local;
Strictness strictness = Any;
Kind kind = Inner;
ASTPtr table; /// "Правая" таблица для соединения - подзапрос или имя таблицы.
ASTPtr using_expr_list; /// По каким столбцам выполнять соединение.
ASTJoin() {}
ASTJoin(StringRange range_) : IAST(range_) {}
2014-06-12 23:21:38 +00:00
/** Получить текст, который идентифицирует этот элемент. */
2014-06-12 23:21:38 +00:00
String getID() const
{
String res;
{
WriteBufferFromString wb(res);
if (locality == Global)
writeString("Global", wb);
writeString(strictness == Any ? "Any" : "All", wb);
writeString(kind == Inner ? "Inner" : "Left", wb);
writeString("Join", wb);
}
return res;
};
ASTPtr clone() const
{
ASTJoin * res = new ASTJoin(*this);
res->children.clear();
if (table) { res->table = table->clone(); res->children.push_back(res->table); }
if (using_expr_list) { res->using_expr_list = using_expr_list->clone(); res->children.push_back(res->using_expr_list); }
return res;
}
};
}