diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-12-18 15:27:50 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-18 15:27:50 +0100 |
commit | eb0c8204fa2b377542959c2ddfb4002468cea0ec (patch) | |
tree | 97e2de6cc0d970a8636731503d0e33a10e34d79c | |
parent | c842875c8c0cd066ce0fb3972a1d56893b918d24 (diff) | |
parent | e83f2ba4fb649a31b5a9656dbc471d3caf55ba84 (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.cpp | 16 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp | 9 |
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--); } } |