dbms: Server: updated unit test [#METR-14875]

This commit is contained in:
Alexey Arno 2015-02-26 23:19:51 +03:00
parent 09317ca19c
commit b22532a35a

View File

@ -5,7 +5,6 @@
#include <DB/Interpreters/Settings.h> #include <DB/Interpreters/Settings.h>
#include <iostream> #include <iostream>
#include <deque>
#include <vector> #include <vector>
#include <utility> #include <utility>
#include <string> #include <string>
@ -25,8 +24,6 @@ using TestResult = std::pair<bool, std::string>;
void reorder(DB::IAST * ast) void reorder(DB::IAST * ast)
{ {
using namespace DB;
auto & children = ast->children; auto & children = ast->children;
if (children.empty()) if (children.empty())
return; return;
@ -34,7 +31,7 @@ void reorder(DB::IAST * ast)
for (auto & child : children) for (auto & child : children)
reorder(&*child); reorder(&*child);
std::sort(children.begin(), children.end(), [](const ASTPtr & lhs, const ASTPtr & rhs) std::sort(children.begin(), children.end(), [](const DB::ASTPtr & lhs, const DB::ASTPtr & rhs)
{ {
return lhs->getTreeID() < rhs->getTreeID(); return lhs->getTreeID() < rhs->getTreeID();
}); });
@ -42,82 +39,47 @@ void reorder(DB::IAST * ast)
bool equals(const DB::ASTPtr & lhs, const DB::ASTPtr & rhs) bool equals(const DB::ASTPtr & lhs, const DB::ASTPtr & rhs)
{ {
using namespace DB; DB::ASTPtr lhs_reordered = lhs->clone();
ASTPtr lhs_reordered = lhs->clone();
reorder(&*lhs_reordered); reorder(&*lhs_reordered);
ASTPtr rhs_reordered = rhs->clone(); DB::ASTPtr rhs_reordered = rhs->clone();
reorder(&*rhs_reordered); reorder(&*rhs_reordered);
std::deque<const IAST *> to_visit_left; return lhs_reordered->getTreeID() == rhs_reordered->getTreeID();
std::deque<const IAST *> to_visit_right;
to_visit_left.push_back(&*lhs_reordered);
to_visit_right.push_back(&*rhs_reordered);
while (!to_visit_left.empty())
{
auto node_left = to_visit_left.back();
to_visit_left.pop_back();
if (to_visit_right.empty())
return false;
auto node_right = to_visit_right.back();
to_visit_right.pop_back();
if (node_left->getTreeID() != node_right->getTreeID())
return false;
if (node_left->children.size() != node_right->children.size())
return false;
for (auto & child : node_left->children)
to_visit_left.push_back(&*child);
for (auto & child : node_right->children)
to_visit_right.push_back(&*child);
}
return true;
} }
bool parse(DB::ASTPtr & ast, const std::string & query) bool parse(DB::ASTPtr & ast, const std::string & query)
{ {
using namespace DB; DB::ParserSelectQuery parser;
ParserSelectQuery parser;
const char * pos = &query[0]; const char * pos = &query[0];
const char * end = &query[0] + query.size(); const char * end = &query[0] + query.size();
Expected expected = ""; DB::Expected expected = "";
return parser.parse(pos, end, ast, expected); return parser.parse(pos, end, ast, expected);
} }
TestResult check(const TestEntry & entry) TestResult check(const TestEntry & entry)
{ {
using namespace DB;
try try
{ {
ASTPtr ast_input; DB::ASTPtr ast_input;
if (!parse(ast_input, entry.input)) if (!parse(ast_input, entry.input))
return TestResult(false, "parse error"); return TestResult(false, "parse error");
auto select_query = typeid_cast<ASTSelectQuery *>(&*ast_input); auto select_query = typeid_cast<DB::ASTSelectQuery *>(&*ast_input);
Settings settings; DB::Settings settings;
settings.optimize_min_equality_disjunction_chain_length = entry.limit; settings.optimize_min_equality_disjunction_chain_length = entry.limit;
LogicalExpressionsOptimizer optimizer(select_query, settings); DB::LogicalExpressionsOptimizer optimizer(select_query, settings);
optimizer.optimizeDisjunctiveEqualityChains(); optimizer.optimizeDisjunctiveEqualityChains();
ASTPtr ast_expected; DB::ASTPtr ast_expected;
if (!parse(ast_expected, entry.expected_output)) if (!parse(ast_expected, entry.expected_output))
return TestResult(false, "parse error"); return TestResult(false, "parse error");
bool res = equals(ast_input, ast_expected); bool res = equals(ast_input, ast_expected);
std::string output = queryToString(ast_input); std::string output = DB::queryToString(ast_input);
return TestResult(res, output); return TestResult(res, output);
} }