diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-06-27 23:35:09 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2019-06-27 23:35:09 +0200 |
commit | c1512b3aefddc923b3a34775d9ab177e6338e856 (patch) | |
tree | b7c5591b85ba4c1a719d9a291184f535589e9112 /container-search/src/main/java/com/yahoo/prelude/query | |
parent | aeb03fa326aafd0f92f3a18e4b04846823af3d4f (diff) |
Refactor to better show the intention of reducability.
Diffstat (limited to 'container-search/src/main/java/com/yahoo/prelude/query')
4 files changed, 37 insertions, 13 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/CompositeItem.java b/container-search/src/main/java/com/yahoo/prelude/query/CompositeItem.java index 907eabe60ce..4bc15d3c897 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/CompositeItem.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/CompositeItem.java @@ -13,6 +13,7 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.ListIterator; +import java.util.Optional; /** @@ -379,4 +380,12 @@ public abstract class CompositeItem extends Item { return terms; } + /** + * Will return its single child if itself can safely be ommitted. + * @return A valid Item or empty Optional if it can not be done. + */ + public Optional<Item> extractSingleChild() { + return getItemCount() == 1 ? Optional.of(getItem(0)) : Optional.empty(); + } + } diff --git a/container-search/src/main/java/com/yahoo/prelude/query/NonReducibleCompositeItem.java b/container-search/src/main/java/com/yahoo/prelude/query/NonReducibleCompositeItem.java index 84aa177369a..97d724953ea 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/NonReducibleCompositeItem.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/NonReducibleCompositeItem.java @@ -1,6 +1,8 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.prelude.query; +import java.util.Optional; + /** * A composite item which specifies semantics which are not maintained * if an instance with a single child is replaced by the single child. @@ -12,4 +14,8 @@ package com.yahoo.prelude.query; * @author bratseth */ public abstract class NonReducibleCompositeItem extends CompositeItem { + @Override + public Optional<Item> extractSingleChild() { + return Optional.empty(); + } } diff --git a/container-search/src/main/java/com/yahoo/prelude/query/QueryCanonicalizer.java b/container-search/src/main/java/com/yahoo/prelude/query/QueryCanonicalizer.java index 2fbda1a9c32..23030abe102 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/QueryCanonicalizer.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/QueryCanonicalizer.java @@ -4,7 +4,10 @@ package com.yahoo.prelude.query; import com.yahoo.search.Query; import com.yahoo.search.query.QueryTree; -import java.util.*; +import java.util.HashSet; +import java.util.ListIterator; +import java.util.Optional; +import java.util.Set; /** * Query normalizer and sanity checker. @@ -82,21 +85,16 @@ public class QueryCanonicalizer { if (composite.getItemCount() == 0) parentIterator.remove(); - if (composite.getItemCount() == 1 && ! (composite instanceof NonReducibleCompositeItem)) { - Item child = composite.getItem(0); - if (composite instanceof PhraseItem || composite instanceof PhraseSegmentItem) - child.setWeight(composite.getWeight()); - parentIterator.set(child); - } - if ((composite.getItemCount() == 1) && (composite instanceof SameElementItem)) { - SameElementItem sameElement = (SameElementItem) composite; - WordItem child = (WordItem) sameElement.getItem(0); - child.setIndexName(sameElement.getFieldName() + "." + child.getIndexName()); - parentIterator.set(child); - } + composite.extractSingleChild().ifPresent( (Item child) -> reduce(composite, parentIterator, child)); return CanonicalizationResult.success(); } + + private static void reduce(CompositeItem composite, ListIterator<Item> parentIterator, Item child) { + if (composite instanceof PhraseItem || composite instanceof PhraseSegmentItem) + child.setWeight(composite.getWeight()); + parentIterator.set(child); + } private static void collapseLevels(CompositeItem composite) { if (composite instanceof RankItem || composite instanceof NotItem) { diff --git a/container-search/src/main/java/com/yahoo/prelude/query/SameElementItem.java b/container-search/src/main/java/com/yahoo/prelude/query/SameElementItem.java index aa446140da0..d2c19339298 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/SameElementItem.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/SameElementItem.java @@ -6,6 +6,7 @@ import com.yahoo.protect.Validator; import java.nio.ByteBuffer; import java.util.Iterator; +import java.util.Optional; /** * This represents a query where all terms are required to match in the same element id. @@ -54,6 +55,16 @@ public class SameElementItem extends NonReducibleCompositeItem { Validator.ensureNonEmpty("Struct fieldname", asTerm.getIndexName()); Validator.ensureNonEmpty("Query term", asTerm.getIndexedString()); } + + @Override + public Optional<Item> extractSingleChild() { + if (getItemCount() == 1) { + WordItem child = (WordItem) getItem(0); + child.setIndexName(getFieldName() + "." + child.getIndexName()); + return Optional.of(child); + } + return Optional.empty(); + } @Override public ItemType getItemType() { |