mirror of https://gitee.com/bigwinds/arangodb
Removed debug output and activated the first tests for subquery execution
This commit is contained in:
parent
a4cd7b0ee6
commit
6268679d50
|
@ -168,7 +168,6 @@ std::pair<ExecutionState, SharedAqlItemBlockPtr> ExecutionBlockImpl<Executor>::g
|
||||||
TRI_ASSERT(newBlock->size() > 0);
|
TRI_ASSERT(newBlock->size() > 0);
|
||||||
TRI_ASSERT(newBlock->size() <= atMost);
|
TRI_ASSERT(newBlock->size() <= atMost);
|
||||||
_outputItemRow = createOutputRow(newBlock);
|
_outputItemRow = createOutputRow(newBlock);
|
||||||
LOG_DEVEL << typeid(_executor).name() << "outreg on block: " << newBlock->getNrRegs();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ExecutionState state = ExecutionState::HASMORE;
|
ExecutionState state = ExecutionState::HASMORE;
|
||||||
|
@ -178,14 +177,11 @@ std::pair<ExecutionState, SharedAqlItemBlockPtr> ExecutionBlockImpl<Executor>::g
|
||||||
|
|
||||||
// The loop has to be entered at least once!
|
// The loop has to be entered at least once!
|
||||||
TRI_ASSERT(!_outputItemRow->isFull());
|
TRI_ASSERT(!_outputItemRow->isFull());
|
||||||
while (!_outputItemRow->isFull()) {
|
while (!_outputItemRow->isFull() && _state != InternalState::DONE) {
|
||||||
// Assert that write-head is always pointing to a free row
|
// Assert that write-head is always pointing to a free row
|
||||||
TRI_ASSERT(!_outputItemRow->produced());
|
TRI_ASSERT(!_outputItemRow->produced());
|
||||||
switch (_state) {
|
switch (_state) {
|
||||||
case InternalState::FETCH_DATA: {
|
case InternalState::FETCH_DATA: {
|
||||||
LOG_DEVEL << typeid(_executor).name() << ": fetching data";
|
|
||||||
LOG_DEVEL << typeid(_executor).name()
|
|
||||||
<< "outreg before produce: " << _outputItemRow->getNrRegisters();
|
|
||||||
std::tie(state, executorStats) = _executor.produceRows(*_outputItemRow);
|
std::tie(state, executorStats) = _executor.produceRows(*_outputItemRow);
|
||||||
// Count global but executor-specific statistics, like number of
|
// Count global but executor-specific statistics, like number of
|
||||||
// filtered rows.
|
// filtered rows.
|
||||||
|
@ -204,7 +200,6 @@ std::pair<ExecutionState, SharedAqlItemBlockPtr> ExecutionBlockImpl<Executor>::g
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case InternalState::FETCH_SHADOWROWS: {
|
case InternalState::FETCH_SHADOWROWS: {
|
||||||
LOG_DEVEL << typeid(_executor).name() << ": fetching shadow rows";
|
|
||||||
ShadowAqlItemRow shadowRow{CreateInvalidShadowRowHint{}};
|
ShadowAqlItemRow shadowRow{CreateInvalidShadowRowHint{}};
|
||||||
// TODO: Add lazy evaluation in case of LIMIT "lying" on done
|
// TODO: Add lazy evaluation in case of LIMIT "lying" on done
|
||||||
std::tie(state, shadowRow) = _rowFetcher.fetchShadowRow();
|
std::tie(state, shadowRow) = _rowFetcher.fetchShadowRow();
|
||||||
|
@ -217,7 +212,6 @@ std::pair<ExecutionState, SharedAqlItemBlockPtr> ExecutionBlockImpl<Executor>::g
|
||||||
_state = InternalState::DONE;
|
_state = InternalState::DONE;
|
||||||
}
|
}
|
||||||
if (shadowRow.isInitialized()) {
|
if (shadowRow.isInitialized()) {
|
||||||
LOG_DEVEL << typeid(_executor).name() << ": copy shadow rows";
|
|
||||||
_outputItemRow->copyRow(shadowRow);
|
_outputItemRow->copyRow(shadowRow);
|
||||||
TRI_ASSERT(_outputItemRow->produced());
|
TRI_ASSERT(_outputItemRow->produced());
|
||||||
_outputItemRow->advanceRow();
|
_outputItemRow->advanceRow();
|
||||||
|
@ -231,19 +225,11 @@ std::pair<ExecutionState, SharedAqlItemBlockPtr> ExecutionBlockImpl<Executor>::g
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case InternalState::DONE: {
|
case InternalState::DONE: {
|
||||||
TRI_ASSERT(state == ExecutionState::DONE);
|
TRI_ASSERT(false); // Invalid state
|
||||||
LOG_DEVEL << typeid(_executor).name() << ": DONE";
|
|
||||||
auto outputBlock = _outputItemRow->stealBlock();
|
|
||||||
// This is not strictly necessary here, as we shouldn't be called
|
|
||||||
// again after DONE.
|
|
||||||
_outputItemRow.reset();
|
|
||||||
return {ExecutionState::DONE, std::move(outputBlock)};
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TRI_ASSERT(_state != InternalState::DONE);
|
|
||||||
// When we're passing blocks through we have no control over the size of the
|
// When we're passing blocks through we have no control over the size of the
|
||||||
// output block.
|
// output block.
|
||||||
// Plus, the ConstrainedSortExecutor will report an expectedNumberOfRows
|
// Plus, the ConstrainedSortExecutor will report an expectedNumberOfRows
|
||||||
|
@ -266,9 +252,11 @@ std::pair<ExecutionState, SharedAqlItemBlockPtr> ExecutionBlockImpl<Executor>::g
|
||||||
|
|
||||||
auto outputBlock = _outputItemRow->stealBlock();
|
auto outputBlock = _outputItemRow->stealBlock();
|
||||||
// we guarantee that we do return a valid pointer in the HASMORE case.
|
// we guarantee that we do return a valid pointer in the HASMORE case.
|
||||||
TRI_ASSERT(outputBlock != nullptr);
|
// But we might return a nullptr in DONE case
|
||||||
|
TRI_ASSERT(outputBlock != nullptr || _state == InternalState::DONE);
|
||||||
_outputItemRow.reset();
|
_outputItemRow.reset();
|
||||||
return {ExecutionState::HASMORE, std::move(outputBlock)};
|
return {(_state == InternalState::DONE ? ExecutionState::DONE : ExecutionState::HASMORE),
|
||||||
|
std::move(outputBlock)};
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Executor>
|
template <class Executor>
|
||||||
|
@ -785,7 +773,6 @@ SharedAqlItemBlockPtr ExecutionBlockImpl<Executor>::requestBlock(size_t nrItems,
|
||||||
/// @brief reset all internal states after processing a shadow row.
|
/// @brief reset all internal states after processing a shadow row.
|
||||||
template <class Executor>
|
template <class Executor>
|
||||||
void ExecutionBlockImpl<Executor>::resetAfterShadowRow() {
|
void ExecutionBlockImpl<Executor>::resetAfterShadowRow() {
|
||||||
LOG_DEVEL << "Reset after shadowRow";
|
|
||||||
// cppcheck-suppress unreadVariable
|
// cppcheck-suppress unreadVariable
|
||||||
constexpr bool customInit = hasInitializeCursor<decltype(_executor)>::value;
|
constexpr bool customInit = hasInitializeCursor<decltype(_executor)>::value;
|
||||||
InitializeCursor<customInit>::init(_executor, _rowFetcher, _infos);
|
InitializeCursor<customInit>::init(_executor, _rowFetcher, _infos);
|
||||||
|
|
|
@ -197,24 +197,18 @@ class SpliceSubqueryNodeOptimizerRuleTest : public ::testing::Test {
|
||||||
|
|
||||||
// First test original Query (rule-disabled)
|
// First test original Query (rule-disabled)
|
||||||
{
|
{
|
||||||
LOG_DEVEL << "Disabled rule";
|
|
||||||
auto queryResult =
|
auto queryResult =
|
||||||
arangodb::tests::executeQuery(server.getSystemDatabase(), query,
|
arangodb::tests::executeQuery(server.getSystemDatabase(), query,
|
||||||
bindParameters, disableRuleOptions());
|
bindParameters, disableRuleOptions());
|
||||||
compareQueryResultToSlice(queryResult, false, expected);
|
compareQueryResultToSlice(queryResult, false, expected);
|
||||||
LOG_DEVEL << "...";
|
|
||||||
LOG_DEVEL << "...";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Second test optimized Query (rule-enabled)
|
// Second test optimized Query (rule-enabled)
|
||||||
{
|
{
|
||||||
LOG_DEVEL << "Enabled rule";
|
|
||||||
auto queryResult =
|
auto queryResult =
|
||||||
arangodb::tests::executeQuery(server.getSystemDatabase(), query,
|
arangodb::tests::executeQuery(server.getSystemDatabase(), query,
|
||||||
bindParameters, enableRuleOptions());
|
bindParameters, enableRuleOptions());
|
||||||
compareQueryResultToSlice(queryResult, true, expected);
|
compareQueryResultToSlice(queryResult, true, expected);
|
||||||
LOG_DEVEL << "...";
|
|
||||||
LOG_DEVEL << "...";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -242,7 +236,7 @@ TEST_F(SpliceSubqueryNodeOptimizerRuleTest, splice_subquery_single_input) {
|
||||||
verifyQueryResult(query, expected->slice());
|
verifyQueryResult(query, expected->slice());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpliceSubqueryNodeOptimizerRuleTest, DISABLED_splice_subquery_plan) {
|
TEST_F(SpliceSubqueryNodeOptimizerRuleTest, splice_subquery_plan) {
|
||||||
auto query = R"aql(FOR d IN 1..2
|
auto query = R"aql(FOR d IN 1..2
|
||||||
LET first =
|
LET first =
|
||||||
(FOR e IN 1..2 FILTER d == e RETURN e)
|
(FOR e IN 1..2 FILTER d == e RETURN e)
|
||||||
|
@ -253,7 +247,7 @@ TEST_F(SpliceSubqueryNodeOptimizerRuleTest, DISABLED_splice_subquery_plan) {
|
||||||
verifyQueryResult(query, expected->slice());
|
verifyQueryResult(query, expected->slice());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpliceSubqueryNodeOptimizerRuleTest, DISABLED_splice_subquery_in_subquery_plan) {
|
TEST_F(SpliceSubqueryNodeOptimizerRuleTest, splice_subquery_in_subquery_plan) {
|
||||||
auto query = R"aql(FOR d IN 1..2
|
auto query = R"aql(FOR d IN 1..2
|
||||||
LET first = (FOR e IN 1..2
|
LET first = (FOR e IN 1..2
|
||||||
LET second = (FOR f IN 1..2 RETURN f)
|
LET second = (FOR f IN 1..2 RETURN f)
|
||||||
|
@ -268,7 +262,7 @@ TEST_F(SpliceSubqueryNodeOptimizerRuleTest, DISABLED_splice_subquery_in_subquery
|
||||||
verifyQueryResult(query, expected->slice());
|
verifyQueryResult(query, expected->slice());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SpliceSubqueryNodeOptimizerRuleTest, DISABLED_splice_subquery_after_subquery_plan) {
|
TEST_F(SpliceSubqueryNodeOptimizerRuleTest, splice_subquery_after_subquery_plan) {
|
||||||
auto query = R"aql(FOR d IN 1..2
|
auto query = R"aql(FOR d IN 1..2
|
||||||
LET first = (FOR e IN 1..2 FILTER d == e RETURN e)
|
LET first = (FOR e IN 1..2 FILTER d == e RETURN e)
|
||||||
LET second = (FOR e IN 1..2 FILTER d != e RETURN e)
|
LET second = (FOR e IN 1..2 FILTER d != e RETURN e)
|
||||||
|
|
Loading…
Reference in New Issue