From 3abb24b5c0164f0c79fa53106dc3a458dc1ee41a Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Mon, 5 Apr 2021 09:50:13 +0200 Subject: Handle repeated EQUIV production --- .../yahoo/prelude/semantics/engine/Evaluation.java | 41 +++++++++++++++++----- .../semantics/rule/ReplacingProductionRule.java | 10 +++--- 2 files changed, 37 insertions(+), 14 deletions(-) (limited to 'container-search/src/main') 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 07342a48916..989f3040cc7 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 @@ -244,12 +244,14 @@ public class Evaluation { * @param desiredParentType the desired type of the composite which contains item when this returns */ public void insertItem(Item item, CompositeItem parent, int index, TermType desiredParentType) { - if (parent == null) { // TODO: Accommodate for termtype in this case too - query.getModel().getQueryTree().setRoot(item); + if (isEmpty(parent)) { + CompositeItem newParent = (CompositeItem)desiredParentType.createItemClass(); + newParent.addItem(item); + query.getModel().getQueryTree().setRoot(newParent); return; } - if (parent.getItemCount()>0 && parent instanceof QueryTree && parent.getItem(0) instanceof CompositeItem) { + if (parent.getItemCount() > 0 && parent instanceof QueryTree && parent.getItem(0) instanceof CompositeItem) { // combine with the existing root instead parent = (CompositeItem)parent.getItem(0); if (index == 1) { // that means adding it after the existing root @@ -261,9 +263,23 @@ public class Evaluation { && equalIndexNameIfParentIsPhrase(item, parent)) { addItem(parent, index, item, desiredParentType); } - else { + else if (incompatible(desiredParentType, parent)) { insertIncompatibleItem(item, parent, query, desiredParentType); } + else { + insertIncompatibleItemAsParent(item, parent, query, desiredParentType); + } + } + + private boolean isEmpty(Item item) { + if (item == null) return true; + if (item instanceof QueryTree && ((QueryTree) item).isEmpty()) return true; + return false; + } + + /** Returns true if the desired type cannot have childCandidate as a child */ + private boolean incompatible(TermType desiredParentType, Item childCandidate) { + return desiredParentType == TermType.EQUIV && childCandidate.getItemType() != Item.ItemType.EQUIV; } private void addItem(CompositeItem parent, int index, Item item, TermType desiredParentType) { @@ -305,6 +321,17 @@ public class Evaluation { } private void insertIncompatibleItem(Item item, CompositeItem parent, Query query, TermType desiredParentType) { + CompositeItem newParent; + if (desiredParentType == TermType.DEFAULT) + newParent = new AndItem(); + else + newParent = (CompositeItem)desiredParentType.createItemClass(); + + newParent.addItem(item); + parent.addItem(newParent); + } + + private void insertIncompatibleItemAsParent(Item item, CompositeItem parent, Query query, TermType desiredParentType) { // Create new parent CompositeItem newParent; if (desiredParentType == TermType.DEFAULT) @@ -325,11 +352,7 @@ public class Evaluation { } else { - int parentIndex = 0; - if (parentsParent != null) { - parentIndex = parentsParent.getItemIndex(parent); - } - parentsParent.setItem(parentIndex, newParent); + parentsParent.setItem(parentsParent.getItemIndex(parent), newParent); } } diff --git a/container-search/src/main/java/com/yahoo/prelude/semantics/rule/ReplacingProductionRule.java b/container-search/src/main/java/com/yahoo/prelude/semantics/rule/ReplacingProductionRule.java index dfa423ec889..70151ea479b 100644 --- a/container-search/src/main/java/com/yahoo/prelude/semantics/rule/ReplacingProductionRule.java +++ b/container-search/src/main/java/com/yahoo/prelude/semantics/rule/ReplacingProductionRule.java @@ -14,7 +14,7 @@ public class ReplacingProductionRule extends ProductionRule { /** Carries out the production of this rule */ public void produce(RuleEvaluation e) { removeNonreferencedMatches(e); - if (e.getTraceLevel()>=5) { + if (e.getTraceLevel() >= 5) { e.trace(5,"Removed terms to get '" + e.getEvaluation().getQuery().getModel().getQueryTree().getRoot() + "', will add terms"); } super.produce(e); @@ -22,16 +22,16 @@ public class ReplacingProductionRule extends ProductionRule { /** Remove items until there's only one item left */ private void removeNonreferencedMatches(RuleEvaluation e) { - int itemCount=e.getEvaluation().getQuerySize(); + int itemCount = e.getEvaluation().getQuerySize(); // Remove items backwards to ease index handling - for (int i=e.getNonreferencedMatchCount()-1; i>=0; i--) { + for (int i = e.getNonreferencedMatchCount() - 1; i >= 0; i--) { // Ensure we don't produce an empty query - if (getProduction().getTermCount()==0 && itemCount==1) + if (getProduction().getTermCount() == 0 && itemCount == 1) break; itemCount--; - Match match=e.getNonreferencedMatch(i); + Match match = e.getNonreferencedMatch(i); match.getItem().getParent().removeItem(match.getPosition()); } } -- cgit v1.2.3