summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/prelude
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-11-30 07:22:31 -0800
committerJon Bratseth <bratseth@yahoo-inc.com>2016-11-30 07:22:31 -0800
commit6c09b3a9b87a5f1ad30e0964357bc252d5c1f96c (patch)
tree9ba6c8d034a509c909f21fec46cc83dd9954982f /container-search/src/main/java/com/yahoo/prelude
parent9c9b741fddfd814cafc7251beb720ced9fdc5107 (diff)
Collapse RANK and NOT
Diffstat (limited to 'container-search/src/main/java/com/yahoo/prelude')
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/QueryCanonicalizer.java31
1 files changed, 20 insertions, 11 deletions
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 8f49fa2bf48..e9806c2f614 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
@@ -63,13 +63,13 @@ public class QueryCanonicalizer {
if ( ! (item instanceof CompositeItem)) return CanonicalizationResult.success();
CompositeItem composite = (CompositeItem)item;
- collapseLevels(composite);
-
- if (composite.getItemCount() == 0) {
+ if (composite.getItemCount() == 0) { // TODO: Remove
parentIterator.remove();
return CanonicalizationResult.success();
}
-
+
+ collapseLevels(composite);
+
if (composite instanceof EquivItem) {
removeDuplicates((EquivItem) composite);
}
@@ -94,16 +94,25 @@ public class QueryCanonicalizer {
}
private static void collapseLevels(CompositeItem composite) {
- if ( ! (composite instanceof AndItem || composite instanceof OrItem)) return;
-
- for (ListIterator<Item> i = composite.getItemIterator(); i.hasNext(); ) {
- Item child = i.next();
- if (child.getClass() != composite.getClass()) continue;
- i.remove();
- moveChildren((CompositeItem)child, i);
+ if (composite instanceof RankItem || composite instanceof NotItem) {
+ collapseLevels(composite, composite.getItemIterator()); // collapse the first item only
+ }
+ else if (composite instanceof AndItem || composite instanceof OrItem) {
+ for (ListIterator<Item> i = composite.getItemIterator(); i.hasNext(); )
+ collapseLevels(composite, i);
}
}
+ /** Collapse the next item of this iterator into the given parent, if appropriate */
+ private static void collapseLevels(CompositeItem composite, ListIterator<Item> i) {
+ if ( ! i.hasNext()) return;
+ Item child = i.next();
+ if (child == null) return;
+ if (child.getClass() != composite.getClass()) return;
+ i.remove();
+ moveChildren((CompositeItem) child, i);
+ }
+
private static void moveChildren(CompositeItem from, ListIterator<Item> toIterator) {
for (ListIterator<Item> i = from.getItemIterator(); i.hasNext(); )
toIterator.add(i.next());