aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/prelude/semantics/rule/TermProduction.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main/java/com/yahoo/prelude/semantics/rule/TermProduction.java')
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/semantics/rule/TermProduction.java93
1 files changed, 93 insertions, 0 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/semantics/rule/TermProduction.java b/container-search/src/main/java/com/yahoo/prelude/semantics/rule/TermProduction.java
new file mode 100644
index 00000000000..6490d21e319
--- /dev/null
+++ b/container-search/src/main/java/com/yahoo/prelude/semantics/rule/TermProduction.java
@@ -0,0 +1,93 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.prelude.semantics.rule;
+
+import com.yahoo.prelude.query.Item;
+import com.yahoo.prelude.query.TermType;
+import com.yahoo.prelude.semantics.engine.Match;
+import com.yahoo.prelude.semantics.engine.RuleEvaluation;
+import com.yahoo.protect.Validator;
+
+/**
+ * A new term produced by a production rule
+ *
+ * @author <a href="mailto:bratseth@yahoo-inc.com">Jon S Bratseth</a>
+ */
+public abstract class TermProduction extends Production {
+
+ /** The label of this term, or null if none */
+ private String label=null;
+
+ /** The type of term to produce */
+ private TermType termType;
+
+ /** Creates a produced template term with no label and the default type */
+ public TermProduction() {
+ this(null,TermType.DEFAULT);
+ }
+
+ /** Creates a produced template term with the default term type */
+ public TermProduction(String label) {
+ this(label,TermType.DEFAULT);
+ }
+
+ /** Creates a produced template term with no label */
+ public TermProduction(TermType termType) {
+ this(null,termType);
+ }
+
+ public TermProduction(String label, TermType termType) {
+ this.label=label;
+ setTermType(termType);
+ }
+
+ /** Sets the label of this. Set to null to use the default */
+ public String getLabel() { return label; }
+
+ /** Returns the label of this, or null if none (the default) */
+ public void setLabel(String label) { this.label = label; }
+
+ /** Returns the type of term to produce, never null. Default is DEFAULT */
+ public TermType getTermType() { return termType; }
+
+ /** Sets the term type to produce */
+ public void setTermType(TermType termType) {
+ Validator.ensureNotNull("Type of produced Term",termType);
+ this.termType=termType;
+ }
+
+ /**
+ * Inserts newItem at the position of this match
+ * TODO: Move to ruleevaluation
+ */
+ protected void insertMatch(RuleEvaluation e,Match matched, Item newItem,int offset) {
+ newItem.setWeight(getWeight());
+ int insertPosition=matched.getPosition()+offset;
+
+ // This check is necessary (?) because earlier items may have been removed
+ // after we recorded the match position. It is sort of hackish. A cleaner
+ // solution would be to update the match position on changes
+ if (insertPosition>matched.getParent().getItemCount()) {
+ insertPosition=matched.getParent().getItemCount();
+ }
+
+ e.insertItem(newItem,matched.getParent(),insertPosition,getTermType());
+ if (e.getTraceLevel()>=6)
+ e.trace(6,"Inserted item '" + newItem + "' at position " + insertPosition + " producing " + e.getEvaluation().getQuery().getModel().getQueryTree());
+ }
+
+ protected String getLabelString() {
+ if (label==null) return "";
+ return label + ":";
+ }
+
+ /** All instances of this produces a parseable string output */
+ public final String toInnerString() {
+ if (termType==null)
+ return toInnerTermString();
+ else
+ return termType.toSign() + toInnerTermString();
+ }
+
+ protected abstract String toInnerTermString();
+
+}