diff options
author | Jon Bratseth <bratseth@gmail.com> | 2024-03-22 10:54:57 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-22 10:54:57 +0100 |
commit | a486e6c334bf2d36c8e082ba1c1e024324f94057 (patch) | |
tree | 89c85802433af40d9191fa5c205e7f42e45b75dc /container-search/src/main | |
parent | 4c183941017686064ff15abe3d56f749ed69adc3 (diff) | |
parent | d0addf353b85061e360456f2dba8874a48c00609 (diff) |
Merge pull request #30707 from vespa-engine/arnej/fold-segments-into-weakand
fold AND and SAND items into top-level WEAKAND
Diffstat (limited to 'container-search/src/main')
-rw-r--r-- | container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java index 43bd175b348..692269a1412 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java @@ -11,6 +11,7 @@ import com.yahoo.prelude.query.OrItem; import com.yahoo.prelude.query.PhraseItem; import com.yahoo.prelude.query.QueryCanonicalizer; import com.yahoo.prelude.query.RankItem; +import com.yahoo.prelude.query.SegmentItem; import com.yahoo.prelude.query.TrueItem; import com.yahoo.prelude.query.WeakAndItem; import com.yahoo.search.query.QueryTree; @@ -98,10 +99,29 @@ public class AllParser extends SimpleParser { return root.getRoot() instanceof NullItem ? null : root.getRoot(); } + private boolean foldIntoAnd(CompositeItem other) { + if (other instanceof AndItem) { + return true; + } + if (weakAnd && other instanceof SegmentItem) { + return true; + } + if (weakAnd && other instanceof PhraseItem phrase) { + return ! phrase.isExplicit(); + } + return false; + } + protected CompositeItem addAnd(Item item, CompositeItem and) { if (and == null) and = createAnd(); - and.addItem(item); + if (item instanceof CompositeItem composite && foldIntoAnd(composite)) { + for (var subItem : composite.items()) { + addAnd(subItem, and); + } + } else { + and.addItem(item); + } return and; } |