aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/prelude/query
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-06-27 23:35:09 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2019-06-27 23:35:09 +0200
commitc1512b3aefddc923b3a34775d9ab177e6338e856 (patch)
treeb7c5591b85ba4c1a719d9a291184f535589e9112 /container-search/src/main/java/com/yahoo/prelude/query
parentaeb03fa326aafd0f92f3a18e4b04846823af3d4f (diff)
Refactor to better show the intention of reducability.
Diffstat (limited to 'container-search/src/main/java/com/yahoo/prelude/query')
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/CompositeItem.java9
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/NonReducibleCompositeItem.java6
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/QueryCanonicalizer.java24
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/SameElementItem.java11
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() {