dbms: Server: feature development [#METR-14875]

This commit is contained in:
Alexey Arno 2015-02-18 18:11:47 +03:00
parent 78032d69e1
commit bdd85805f2
3 changed files with 12 additions and 13 deletions

View File

@ -32,7 +32,7 @@ class LogicalExpressionsOptimizer final
{
public:
/// Конструктор. Принимает корень DAG запроса.
LogicalExpressionsOptimizer(ASTPtr root_);
LogicalExpressionsOptimizer(ASTSelectQuery * select_query_);
/** Заменить все довольно длинные однородные OR-цепочки expr = x1 OR ... OR expr = xN
* на выражения expr IN (x1, ..., xN).
@ -69,7 +69,6 @@ private:
void fixBrokenOrExpressions();
private:
ASTPtr root;
ASTSelectQuery * select_query;
/// Информация про OR-цепочки внутри запроса.
DisjunctiveEqualitiesMap disjunctive_equalities_map;

View File

@ -77,7 +77,7 @@ void ExpressionAnalyzer::init()
LOG_DEBUG(&Logger::get("ExpressionAnalyzer"), "######################################");
}
LogicalExpressionsOptimizer logical_expressions_optimizer(ast);
LogicalExpressionsOptimizer logical_expressions_optimizer(select_query);
logical_expressions_optimizer.optimizeDisjunctiveEqualityChains();
{

View File

@ -34,8 +34,8 @@ bool operator<(const OrWithExpression & lhs, const OrWithExpression & rhs)
return false;
}
LogicalExpressionsOptimizer::LogicalExpressionsOptimizer(ASTPtr root_)
: root(root_), select_query(typeid_cast<ASTSelectQuery *>(&*root))
LogicalExpressionsOptimizer::LogicalExpressionsOptimizer(ASTSelectQuery * select_query_)
: select_query(select_query_)
{
}
@ -58,21 +58,21 @@ void LogicalExpressionsOptimizer::optimizeDisjunctiveEqualityChains()
void LogicalExpressionsOptimizer::collectDisjunctiveEqualityChains()
{
using Edge = std::pair<ASTPtr, ASTPtr>;
using Edge = std::pair<IAST *, IAST *>;
std::deque<Edge> to_visit;
to_visit.push_back(Edge(ASTPtr(), root));
to_visit.push_back(Edge(nullptr, select_query));
while (!to_visit.empty())
{
auto edge = to_visit.front();
auto & from_node = edge.first;
auto & to_node = edge.second;
auto from_node = edge.first;
auto to_node = edge.second;
to_visit.pop_front();
bool found_chain = false;
auto function = typeid_cast<ASTFunction *>(&*to_node);
auto function = typeid_cast<ASTFunction *>(to_node);
if ((function != nullptr) && (function->name == "or") && (function->children.size() == 1))
{
auto expression_list = typeid_cast<ASTExpressionList *>(&*(function->children[0]));
@ -101,14 +101,14 @@ void LogicalExpressionsOptimizer::collectDisjunctiveEqualityChains()
}
}
if (!from_node.isNull() && found_chain)
or_parent_map[function].push_back(from_node.get());
if ((from_node != nullptr) && found_chain)
or_parent_map[function].push_back(from_node);
}
if (!found_chain)
for (auto & child : to_node->children)
if (typeid_cast<ASTSelectQuery *>(&*child) == nullptr)
to_visit.push_back(Edge(to_node, child));
to_visit.push_back(Edge(to_node, child.get()));
}
for (auto & chain : disjunctive_equalities_map)