aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-12-18 15:27:50 +0100
committerGitHub <noreply@github.com>2023-12-18 15:27:50 +0100
commiteb0c8204fa2b377542959c2ddfb4002468cea0ec (patch)
tree97e2de6cc0d970a8636731503d0e33a10e34d79c
parentc842875c8c0cd066ce0fb3972a1d56893b918d24 (diff)
parente83f2ba4fb649a31b5a9656dbc471d3caf55ba84 (diff)
Merge pull request #29693 from vespa-engine/havardpe/and-collapsing-within-andnot-collapsing
do nested collapsing of AND when collapsing ANDNOT
-rw-r--r--searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp16
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp9
2 files changed, 24 insertions, 1 deletions
diff --git a/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp b/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp
index e24e91c2f1d..53803c9c9e7 100644
--- a/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp
+++ b/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp
@@ -716,6 +716,22 @@ TEST("AND_NOT AND AND_NOT collapsing") {
optimize_and_compare(std::move(top), std::move(expect));
}
+TEST("AND_NOT AND AND_NOT AND nested collapsing") {
+ Blueprint::UP top = make::ANDNOT()
+ .add(make::AND()
+ .add(make::ANDNOT()
+ .add(make::AND().leafs({1,2}))
+ .leafs({5,6}))
+ .add(make::ANDNOT()
+ .add(make::AND().leafs({3,4}))
+ .leafs({8,9})))
+ .leaf(7);
+ Blueprint::UP expect = make::ANDNOT()
+ .add(make::AND().leafs({1,2,3,4}))
+ .leafs({9,8,7,6,5});
+ optimize_and_compare(std::move(top), std::move(expect));
+}
+
TEST("AND_NOT AND AND_NOT collapsing into full source blender optimization") {
InvalidSelector sel;
Blueprint::UP top =
diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
index c43335a6fdf..364602cba03 100644
--- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
@@ -133,7 +133,14 @@ AndNotBlueprint::optimize_self(OptimizePass pass)
while (grand_child->childCnt() > 1) {
addChild(grand_child->removeLastChild());
}
- child->addChild(grand_child->removeChild(0));
+ auto orphan = grand_child->removeChild(0);
+ if (auto *orphan_and = orphan->asAnd()) {
+ while (orphan_and->childCnt() > 0) {
+ child->addChild(orphan_and->removeLastChild());
+ }
+ } else {
+ child->addChild(std::move(orphan));
+ }
child->removeChild(i--);
}
}