aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/prelude/semantics/engine/Evaluation.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main/java/com/yahoo/prelude/semantics/engine/Evaluation.java')
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/semantics/engine/Evaluation.java54
1 files changed, 34 insertions, 20 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/semantics/engine/Evaluation.java b/container-search/src/main/java/com/yahoo/prelude/semantics/engine/Evaluation.java
index d5ed89b0724..76f42bf0d9f 100644
--- a/container-search/src/main/java/com/yahoo/prelude/semantics/engine/Evaluation.java
+++ b/container-search/src/main/java/com/yahoo/prelude/semantics/engine/Evaluation.java
@@ -199,9 +199,8 @@ public class Evaluation {
CompositeItem converted;
if (item instanceof AndSegmentItem) {
converted = new AndItem();
- } else if (item instanceof PhraseSegmentItem) {
+ } else if (item instanceof PhraseSegmentItem old) {
PhraseItem p = new PhraseItem();
- PhraseSegmentItem old = (PhraseSegmentItem) item;
p.setIndexName(old.getIndexName());
converted = p;
} else {
@@ -250,7 +249,7 @@ public class Evaluation {
* @param index the index at which to insert these into the parent
* @param desiredParentType the desired type of the composite which contains items when this returns
*/
- public void insertItems(List<Item> items, CompositeItem parent, int index, TermType desiredParentType) {
+ public void insertItems(List<Item> items, CompositeItem parent, int index, TermType desiredParentType, boolean replacing) {
if (isEmpty(parent)) {
if (items.size() == 1 && desiredParentType.hasItemClass(items.get(0).getClass())) {
query.getModel().getQueryTree().setRoot(items.get(0));
@@ -286,7 +285,7 @@ public class Evaluation {
addItem(parent, index, items.get(0), desiredParentType);
}
else {
- insertWithDesiredParentType(items, parent, desiredParentType);
+ insertWithDesiredParentType(items, index, parent, desiredParentType, replacing);
}
}
@@ -329,36 +328,50 @@ public class Evaluation {
/** A special purpose check used to simplify the above */
private boolean equalIndexNameIfParentIsPhrase(List<Item> items, CompositeItem parent) {
- if ( ! (parent instanceof PhraseItem)) return true;
- var phrase = (PhraseItem)parent;
+ if ( ! (parent instanceof PhraseItem phrase)) return true;
for (Item item : items) {
- if ( ! (item instanceof IndexedItem)) continue;
- var indexedItem = (IndexedItem)item;
+ if ( ! (item instanceof IndexedItem indexedItem)) continue;
if (! indexedItem.getIndexName().equals(phrase.getIndexName())) return false;
}
return true;
}
- private void insertWithDesiredParentType(List<Item> items, CompositeItem parent, TermType desiredParentType) {
+ private void insertWithDesiredParentType(List<Item> items, int index, CompositeItem parent, TermType desiredParentType, boolean replacing) {
CompositeItem parentsParent = parent.getParent();
CompositeItem newParent = newParent(desiredParentType);
- if (! (parentsParent instanceof QueryTree) && parentsParent.getItemType() == newParent.getItemType()) { // Collapse
+ if (parentsParent != null && (! (parentsParent instanceof QueryTree) && parentsParent.getItemType() == newParent.getItemType())) { // Collapse
newParent = parentsParent;
}
for (Item item : items)
newParent.addItem(item);
- if (desiredParentType == TermType.EQUIV || desiredParentType == TermType.PHRASE) { // insert new parent below the current
- parent.addItem(newParent);
+ Item current = parent;
+ if (parent instanceof QueryTree && parent.getItemCount() > 0)
+ current = parent.getItem(0);
+ if (current instanceof CompositeItem && !replacing) { // insert new parent below the current
+ if (parent.getItemCount() > index) {
+ var combinedItem = combineItems(newParent, parent.getItem(index), desiredParentType);
+ parent.setItem(index, combinedItem);
+ }
+ else{
+ parent.addItem(newParent);
+ }
+ }
+ else if (newParent.acceptsItemsOfType(current.getItemType())) { // insert new parent above the current
+ newParent.addItem(current);
+ if (newParent != parentsParent) { // Insert new parent as root or child of old parent's parent
+ if (parentsParent != null)
+ parentsParent.setItem(parentsParent.getItemIndex(current), newParent);
+ else
+ parent.setItem(0, newParent);
+ }
}
- else { // insert new parent above the current
- newParent.addItem(parent);
- if (newParent != parentsParent) // Insert new parent as root or child of old parent's parent
- parentsParent.setItem(parentsParent.getItemIndex(parent), newParent);
+ else {
+ ((CompositeItem)current).addItem(newParent); // not an acceptable child -> composite
}
}
@@ -369,8 +382,7 @@ public class Evaluation {
private Item combineItems(Item first, Item second, TermType termType) {
if (first instanceof NullItem) {
return second;
- } else if (first instanceof NotItem) {
- NotItem notItem = (NotItem)first;
+ } else if (first instanceof NotItem notItem) {
if (termType == TermType.NOT) {
notItem.addNegativeItem(second);
}
@@ -380,8 +392,7 @@ public class Evaluation {
}
return notItem;
}
- else if (first instanceof CompositeItem) {
- CompositeItem composite = (CompositeItem)first;
+ else if (first instanceof CompositeItem composite) {
CompositeItem combined = createType(termType);
if (combined.getClass().equals(composite.getClass())) {
composite.addItem(second);
@@ -419,6 +430,9 @@ public class Evaluation {
phrase.setIndexName(index);
return phrase;
}
+ else if ((item instanceof CompositeItem) && ((CompositeItem)item).getItemCount() == 1) {
+ return makeEquivCompatible(((CompositeItem)item).getItem(0));
+ }
else {
return item; // Compatible, or can't be made so
}