8000 Feature/aql subquery operations stack materialize executor by hkernbach · Pull Request #11192 · arangodb/arangodb · GitHub
[go: up one dir, main page]

Skip to content

Feature/aql subquery operations stack materialize executor #11192

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prev Previous commit
Next Next commit
removed comment, fixed a logical loop error
  • Loading branch information
hkernbach committed Feb 28, 2020
commit 8eca56fa86ffd27a8acbf98c22e2da1fd49036d4
41 changes: 20 additions & 21 deletions arangod/Aql/MaterializeExecutor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,32 +104,32 @@ std::tuple<ExecutorState, NoStats, AqlCall> arangodb::aql::MaterializeExecutor<T

while (inputRange.hasDataRow() && !output.isFull()) {
bool written = false;

// some micro-optimization
auto& callback = _readDocumentContext._callback;
auto docRegId = _readDocumentContext._infos->inputNonMaterializedDocRegId();
T collectionSource = _readDocumentContext._infos->collectionSource();
auto* trx = _readDocumentContext._infos->trx();
do {
auto const [state, input] = inputRange.nextDataRow();

arangodb::LogicalCollection const* collection = nullptr;
if constexpr (std::is_same<T, std::string const&>::value) {
if (_collection == nullptr) {
_collection = trx->documentCollection(collectionSource);
}
collection = _collection;
} else {
collection = reinterpret_cast<arangodb::LogicalCollection const*>(
input.getValue(collectionSource).slice().getUInt());
auto const [state, input] = inputRange.nextDataRow();

arangodb::LogicalCollection const* collection = nullptr;
if constexpr (std::is_same<T, std::string const&>::value) {
if (_collection == nullptr) {
_collection = trx->documentCollection(collectionSource);
}
TRI_ASSERT(collection != nullptr);
_readDocumentContext._inputRow = &input;
_readDocumentContext._outputRow = &output;
written = collection->readDocumentWithCallback(
trx, LocalDocumentId(input.getValue(docRegId).slice().getUInt()), callback);
} while (!written);

output.advanceRow();
collection = _collection;
} else {
collection = reinterpret_cast<arangodb::LogicalCollection const*>(
input.getValue(collectionSource).slice().getUInt());
}
TRI_ASSERT(collection != nullptr);
_readDocumentContext._inputRow = &input;
_readDocumentContext._outputRow = &output;
written = collection->readDocumentWithCallback(
trx, LocalDocumentId(input.getValue(docRegId).slice().getUInt()), callback);
if (written) {
output.advanceRow();
}
}

return {inputRange.upstreamState(), NoStats{}, upstreamCall};
Expand All @@ -145,7 +145,6 @@ std::tuple<ExecutorState, NoStats, size_t, AqlCall> arangodb::aql::MaterializeEx
}

size_t skipped = 0;
// bool offsetPhase = (call.getOffset() > 0);

while (inputRange.hasDataRow() && call.shouldSkip()) {
auto const [unused, input] = inputRange.nextDataRow();
Expand Down
0