summaryrefslogtreecommitdiffstats
path: root/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp')
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp28
1 files changed, 18 insertions, 10 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
index b315965b5f4..4d0656b421c 100644
--- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
@@ -52,7 +52,7 @@ void optimize_source_blenders(IntermediateBlueprint &self, size_t begin_idx) {
source_blenders.pop_back();
SourceBlenderBlueprint * blender = blender_up->asSourceBlender();
while (blender->childCnt() > 0) {
- Blueprint::UP child_up = blender->removeChild(blender->childCnt() - 1);
+ Blueprint::UP child_up = blender->removeLastChild();
size_t source_idx = lookup_create_source(sources, child_up->getSourceId(), self.get_docid_limit());
sources[source_idx]->addChild(std::move(child_up));
}
@@ -107,14 +107,24 @@ AndNotBlueprint::optimize_self(OptimizePass pass)
return;
}
if (pass == OptimizePass::FIRST) {
- AndNotBlueprint * child = getChild(0).asAndNot();
- if (child != nullptr) {
+ if (auto *child = getChild(0).asAndNot()) {
while (child->childCnt() > 1) {
- addChild(child->removeChild(1));
+ addChild(child->removeLastChild());
}
insertChild(1, child->removeChild(0));
removeChild(0);
}
+ if (auto *child = getChild(0).asAnd()) {
+ for (size_t i = 0; i < child->childCnt(); ++i) {
+ if (auto *grand_child = child->getChild(i).asAndNot()) {
+ while (grand_child->childCnt() > 1) {
+ addChild(grand_child->removeLastChild());
+ }
+ child->addChild(grand_child->removeChild(0));
+ child->removeChild(i--);
+ }
+ }
+ }
for (size_t i = 1; i < childCnt(); ++i) {
if (getChild(i).getState().estimate().empty) {
removeChild(i--);
@@ -195,10 +205,9 @@ AndBlueprint::optimize_self(OptimizePass pass)
{
if (pass == OptimizePass::FIRST) {
for (size_t i = 0; i < childCnt(); ++i) {
- AndBlueprint * child = getChild(i).asAnd();
- if (child != nullptr) {
+ if (auto *child = getChild(i).asAnd()) {
while (child->childCnt() > 0) {
- addChild(child->removeChild(0));
+ addChild(child->removeLastChild());
}
removeChild(i--);
}
@@ -297,10 +306,9 @@ OrBlueprint::optimize_self(OptimizePass pass)
{
if (pass == OptimizePass::FIRST) {
for (size_t i = 0; (childCnt() > 1) && (i < childCnt()); ++i) {
- OrBlueprint * child = getChild(i).asOr();
- if (child != nullptr) {
+ if (auto *child = getChild(i).asOr()) {
while (child->childCnt() > 0) {
- addChild(child->removeChild(0));
+ addChild(child->removeLastChild());
}
removeChild(i--);
} else if (getChild(i).getState().estimate().empty) {