| 245 | } |
| 246 | |
| 247 | bool OnDiskGraphNbrScanState::InnerIterator::next(evaluator::ExpressionEvaluator* predicate, |
| 248 | SemiMask* nbrNodeMask_, NodeTable* nbrNodeTable_) { |
| 249 | bool hasAtLeastOneSelectedValue = false; |
| 250 | do { |
| 251 | restoreSelVector(*tableScanState->outState); |
| 252 | if (!relTable->scan(transaction::Transaction::Get(*context), *tableScanState)) { |
| 253 | return false; |
| 254 | } |
| 255 | saveSelVector(*tableScanState->outState); |
| 256 | hasAtLeastOneSelectedValue = tableScanState->outState->getSelVector().getSelSize() > 0; |
| 257 | if (predicate != nullptr) { |
| 258 | hasAtLeastOneSelectedValue = |
| 259 | predicate->select(tableScanState->outState->getSelVectorUnsafe(), |
| 260 | !tableScanState->outState->isFlat()); |
| 261 | } |
| 262 | if (nbrNodeMask_ != nullptr) { |
| 263 | auto selectedSize = 0u; |
| 264 | auto buffer = tableScanState->outState->getSelVectorUnsafe().getMutableBuffer(); |
| 265 | for (auto i = 0u; i < tableScanState->outState->getSelSize(); ++i) { |
| 266 | auto pos = tableScanState->outState->getSelVector()[i]; |
| 267 | buffer[selectedSize] = pos; |
| 268 | auto nbrNodeID = tableScanState->outputVectors[0]->getValue<nodeID_t>(pos); |
| 269 | selectedSize += nbrNodeMask_->isMasked(nbrNodeID.offset); |
| 270 | } |
| 271 | tableScanState->outState->getSelVectorUnsafe().setToFiltered(selectedSize); |
| 272 | hasAtLeastOneSelectedValue = selectedSize > 0; |
| 273 | } |
| 274 | if (nbrNodeTable_ != nullptr) { |
| 275 | auto selectedSize = 0u; |
| 276 | auto buffer = tableScanState->outState->getSelVectorUnsafe().getMutableBuffer(); |
| 277 | auto transaction = transaction::Transaction::Get(*context); |
| 278 | for (auto i = 0u; i < tableScanState->outState->getSelSize(); ++i) { |
| 279 | auto pos = tableScanState->outState->getSelVector()[i]; |
| 280 | buffer[selectedSize] = pos; |
| 281 | auto nbrNodeID = tableScanState->outputVectors[0]->getValue<nodeID_t>(pos); |
| 282 | selectedSize += nbrNodeTable_->isVisible(transaction, nbrNodeID.offset); |
| 283 | } |
| 284 | tableScanState->outState->getSelVectorUnsafe().setToFiltered(selectedSize); |
| 285 | hasAtLeastOneSelectedValue = selectedSize > 0; |
| 286 | } |
| 287 | } while (!hasAtLeastOneSelectedValue); |
| 288 | return true; |
| 289 | } |
| 290 | |
| 291 | OnDiskGraphNbrScanState::InnerIterator::InnerIterator(const ClientContext* context, |
| 292 | RelTable* relTable, std::unique_ptr<RelTableScanState> tableScanState) |
nothing calls this directly
no test coverage detected