aboutsummaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@verizonmedia.com>2019-03-22 10:36:01 +0100
committerJon Bratseth <bratseth@verizonmedia.com>2019-03-22 10:36:01 +0100
commit439757cf0af40cd9ec8334cf73ce4ee56e54708c (patch)
treec0822f42a41b49e2534d8d9efa759e5469a64212 /container-search
parenta05b9e83ee198a2dda97806eb388ab515b7094c1 (diff)
Non-functional changes only
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java7
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/semantics/RuleBase.java59
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/semantics/SemanticSearcher.java38
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/semantics/engine/Evaluation.java3
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/semantics/engine/RuleEngine.java84
-rw-r--r--container-search/src/test/java/com/yahoo/prelude/semantics/compatibility/test/.gitignore0
-rw-r--r--container-search/src/test/java/com/yahoo/prelude/semantics/test/StopwordTestCase.java6
7 files changed, 98 insertions, 99 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java
index 3d6c094c784..ff719c3eadc 100644
--- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java
+++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java
@@ -99,7 +99,7 @@ public class FastHit extends Hit {
if (indexUri != null) return indexUri;
StringBuilder sb = new StringBuilder(64);
sb.append("index:").append(getSource()).append('/').append(getPartId()).append('/');
- asHexString(sb, getGlobalId());
+ appendAsHex(getGlobalId(), sb);
indexUri = new URI(sb.toString());
return indexUri;
}
@@ -322,14 +322,14 @@ public class FastHit extends Hit {
@Override
public int hashCode() {
if (getId() == null) {
- throw new IllegalStateException("This hit must have a 'uri' field, and this fild must be filled through " +
+ throw new IllegalStateException("This hit must have a 'uri' field, and this field must be filled through " +
"Execution.fill(Result)) before hashCode() is accessed.");
} else {
return super.hashCode();
}
}
- private static StringBuilder asHexString(StringBuilder sb, GlobalId gid) {
+ private void appendAsHex(GlobalId gid, StringBuilder sb) {
byte[] rawGid = gid.getRawId();
for (byte b : rawGid) {
String hex = Integer.toHexString(0xFF & b);
@@ -338,7 +338,6 @@ public class FastHit extends Hit {
}
sb.append(hex);
}
- return sb;
}
/** A set view of all the field names in this hit. Add/addAll is not supported but remove is. */
diff --git a/container-search/src/main/java/com/yahoo/prelude/semantics/RuleBase.java b/container-search/src/main/java/com/yahoo/prelude/semantics/RuleBase.java
index e17e9e7035e..ccc9c1d2f8f 100644
--- a/container-search/src/main/java/com/yahoo/prelude/semantics/RuleBase.java
+++ b/container-search/src/main/java/com/yahoo/prelude/semantics/RuleBase.java
@@ -312,46 +312,45 @@ public class RuleBase {
* @return the error caused by analyzing the query, or null if there was no error
* If there is an error, this query is destroyed (unusable)
*/
- public String analyze(Query query,int traceLevel) {
- int queryTraceLevel=query.getTraceLevel();
- if (traceLevel>0 && queryTraceLevel==0)
+ public String analyze(Query query, int traceLevel) {
+ int queryTraceLevel = query.getTraceLevel();
+ if (traceLevel > 0 && queryTraceLevel == 0)
query.setTraceLevel(1);
- matchAutomata(query,traceLevel);
- String error=analyzer.evaluate(query,traceLevel);
+ matchAutomata(query, traceLevel);
+ String error = analyzer.evaluate(query, traceLevel);
query.setTraceLevel(queryTraceLevel);
return error;
}
protected void matchAutomata(Query query,int traceLevel) {
- List<PhraseMatcher.Phrase> matches=getPhraseMatcher().matchPhrases(query.getModel().getQueryTree().getRoot());
- if (matches==null || matches.size()==0) return;
- for (Iterator<PhraseMatcher.Phrase> i=matches.iterator(); i.hasNext(); ) {
- PhraseMatcher.Phrase phrase= i.next();
- if (traceLevel>=3)
- query.trace("Semantic searcher automata matched " + phrase,false,1);
-
- annotatePhrase(phrase,query,traceLevel);
+ List<PhraseMatcher.Phrase> matches = getPhraseMatcher().matchPhrases(query.getModel().getQueryTree().getRoot());
+ if (matches == null || matches.size() == 0) return;
+ for (Iterator<PhraseMatcher.Phrase> i = matches.iterator(); i.hasNext(); ) {
+ PhraseMatcher.Phrase phrase = i.next();
+ if (traceLevel >= 3)
+ query.trace("Semantic searcher automata matched " + phrase, false, 1);
+
+ annotatePhrase(phrase, query, traceLevel);
}
}
- // Note: When changing this method, change CompatibleRuleBase as well!
// TODO: Values are not added right now
protected void annotatePhrase(PhraseMatcher.Phrase phrase,Query query,int traceLevel) {
- for (StringTokenizer tokens=new StringTokenizer(phrase.getData(),"|",false) ; tokens.hasMoreTokens(); ) {
- String token=tokens.nextToken();
- int semicolonIndex=token.indexOf(";");
- String annotation=token;
- String value="";
- if (semicolonIndex>0) {
- annotation=token.substring(0,semicolonIndex);
- value=token.substring(semicolonIndex+1);
+ for (StringTokenizer tokens = new StringTokenizer(phrase.getData(),"|",false) ; tokens.hasMoreTokens(); ) {
+ String token = tokens.nextToken();
+ int semicolonIndex = token.indexOf(";");
+ String annotation = token;
+ String value = "";
+ if (semicolonIndex > 0) {
+ annotation = token.substring(0, semicolonIndex);
+ value = token.substring(semicolonIndex + 1);
}
// Annotate all matched items
- phrase.getItem(0).addAnnotation(annotation,phrase);
- if (traceLevel>=4)
+ phrase.getItem(0).addAnnotation(annotation, phrase);
+ if (traceLevel >= 4)
query.trace(" Annotating '" + phrase + "' as " + annotation +
(value.equals("") ? "" :"=" + value),false,1);
}
@@ -359,11 +358,11 @@ public class RuleBase {
private void makeReferences() {
for (Iterator<ProductionRule> i=ruleIterator(); i.hasNext(); ) {
- ProductionRule rule=i.next();
+ ProductionRule rule = i.next();
rule.makeReferences(this);
}
- for (Iterator<NamedCondition> i=conditionIterator(); i.hasNext(); ) {
- NamedCondition namedCondition=i.next();
+ for (Iterator<NamedCondition> i = conditionIterator(); i.hasNext(); ) {
+ NamedCondition namedCondition = i.next();
namedCondition.getCondition().makeReferences(this);
}
}
@@ -398,14 +397,14 @@ public class RuleBase {
* in the form they will be evaluated, with all included rule bases inlined
*/
public String toContentString() {
- StringBuilder b=new StringBuilder();
- for (Iterator<ProductionRule> i=productionRules.iterator(); i.hasNext(); ) {
+ StringBuilder b = new StringBuilder();
+ for (Iterator<ProductionRule> i = productionRules.iterator(); i.hasNext(); ) {
b.append(i.next().toString());
b.append("\n");
}
b.append("\n");
b.append("\n");
- for (Iterator<NamedCondition> i=namedConditions.values().iterator(); i.hasNext(); ) {
+ for (Iterator<NamedCondition> i = namedConditions.values().iterator(); i.hasNext(); ) {
b.append(i.next().toString());
b.append("\n");
}
diff --git a/container-search/src/main/java/com/yahoo/prelude/semantics/SemanticSearcher.java b/container-search/src/main/java/com/yahoo/prelude/semantics/SemanticSearcher.java
index 4d46107726e..63b62870313 100644
--- a/container-search/src/main/java/com/yahoo/prelude/semantics/SemanticSearcher.java
+++ b/container-search/src/main/java/com/yahoo/prelude/semantics/SemanticSearcher.java
@@ -26,9 +26,9 @@ import static com.yahoo.prelude.querytransform.StemmingSearcher.STEMMING;
@Before({PhaseNames.TRANSFORMED_QUERY, STEMMING})
public class SemanticSearcher extends Searcher {
- private static final CompoundName rulesRulebase=new CompoundName("rules.rulebase");
- private static final CompoundName rulesOff=new CompoundName("rules.off");
- private static final CompoundName tracelevelRules=new CompoundName("tracelevel.rules");
+ private static final CompoundName rulesRulebase = new CompoundName("rules.rulebase");
+ private static final CompoundName rulesOff = new CompoundName("rules.off");
+ private static final CompoundName tracelevelRules = new CompoundName("tracelevel.rules");
/** The default rule base of this */
private RuleBase defaultRuleBase;
@@ -81,34 +81,34 @@ public class SemanticSearcher extends Searcher {
if (query.properties().getBoolean(rulesOff))
return execution.search(query);
- int traceLevel= query.properties().getInteger(tracelevelRules, query.getTraceLevel()-2);
- if (traceLevel<0) traceLevel=0;
- RuleBase ruleBase=resolveRuleBase(query);
- if (ruleBase==null)
+ int traceLevel = query.properties().getInteger(tracelevelRules, query.getTraceLevel() - 2);
+ if (traceLevel < 0) traceLevel = 0;
+ RuleBase ruleBase = resolveRuleBase(query);
+ if (ruleBase == null)
return execution.search(query);
- String error=ruleBase.analyze(query,traceLevel);
- if (error!=null)
- return handleError(ruleBase, query,error);
+ String error = ruleBase.analyze(query, traceLevel);
+ if (error != null)
+ return handleError(ruleBase, query, error);
else
return execution.search(query);
}
private RuleBase resolveRuleBase(Query query) {
- String ruleBaseName=query.properties().getString(rulesRulebase);
- if (ruleBaseName==null || ruleBaseName.equals("")) return getDefaultRuleBase();
- RuleBase ruleBase=getRuleBase(ruleBaseName);
- if (ruleBase==null)
+ String ruleBaseName = query.properties().getString(rulesRulebase);
+ if (ruleBaseName == null || ruleBaseName.equals("")) return getDefaultRuleBase();
+ RuleBase ruleBase = getRuleBase(ruleBaseName);
+ if (ruleBase == null)
throw new RuleBaseException("Requested rule base '" + ruleBaseName + "' does not exist");
return ruleBase;
}
private Result handleError(RuleBase ruleBase,Query query,String error) {
- String message="Evaluation of query '" + query.getModel().getQueryTree() +
- "' over '" + ruleBase + "' caused the invalid query '" +
- query.getModel().getQueryTree().getRoot() + "': " + error;
+ String message = "Evaluation of query '" + query.getModel().getQueryTree() +
+ "' over '" + ruleBase + "' caused the invalid query '" +
+ query.getModel().getQueryTree().getRoot() + "': " + error;
getLogger().warning(message);
- return new Result(query,ErrorMessage.createInvalidQueryTransformation(message));
+ return new Result(query, ErrorMessage.createInvalidQueryTransformation(message));
}
/** Returns the default rule base */
@@ -119,7 +119,7 @@ public class SemanticSearcher extends Searcher {
* The part of the name following the last dot (if any) is removed before lookup.
*/
public RuleBase getRuleBase(String ruleBaseName) {
- ruleBaseName=RuleImporter.stripLastName(ruleBaseName);
+ ruleBaseName = RuleImporter.stripLastName(ruleBaseName);
return ruleBases.get(ruleBaseName);
}
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 a42c1000617..4e8bbc2ae11 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
@@ -59,7 +59,7 @@ public class Evaluation {
* @param query the query this evaluation is for
* @param traceLevel the amount of tracing to do
*/
- public Evaluation(Query query,int traceLevel) {
+ public Evaluation(Query query, int traceLevel) {
this.query=query;
this.traceLevel=traceLevel;
reset();
@@ -119,7 +119,6 @@ public class Evaluation {
currentIndex--;
}
-
/** Returns the current item, or null if there is no more elements */
public FlattenedItem currentItem() {
if ( (currentIndex>=flattenedItems.size()) || (currentIndex<0)) return null; //PGA
diff --git a/container-search/src/main/java/com/yahoo/prelude/semantics/engine/RuleEngine.java b/container-search/src/main/java/com/yahoo/prelude/semantics/engine/RuleEngine.java
index ff94af6d71c..4c4f3493a50 100644
--- a/container-search/src/main/java/com/yahoo/prelude/semantics/engine/RuleEngine.java
+++ b/container-search/src/main/java/com/yahoo/prelude/semantics/engine/RuleEngine.java
@@ -31,70 +31,66 @@ public class RuleEngine {
* @return the error caused by analyzing the query, or null if there was no error
* If there is an error, this query is destroyed (unusable)
*/
- public String evaluate(Query query,int traceLevel) {
+ public String evaluate(Query query, int traceLevel) {
// TODO: This is O(query size*rule base size). We'll eventually need to create indices
// on rules to look up rule candidates per term to make it O(query size) instead
// Probably create indices on the first term like Prolog implementations use to
- boolean matchedAnything=false;
- Evaluation evaluation=new Evaluation(query,traceLevel);
+ boolean matchedAnything = false;
+ Evaluation evaluation = new Evaluation(query, traceLevel);
evaluation.setStemming(rules.getStemming());
- evaluation.trace(2,"Evaluating query '" + evaluation.getQuery().getModel().getQueryTree().getRoot() + "':");
- for (ListIterator<ProductionRule> i=rules.ruleIterator(); i.hasNext(); ) {
+ if (traceLevel >= 2)
+ evaluation.trace(2,"Evaluating query '" + evaluation.getQuery().getModel().getQueryTree().getRoot() + "':");
+ for (ListIterator<ProductionRule> i = rules.ruleIterator(); i.hasNext(); ) {
evaluation.reset();
- ProductionRule rule=i.next();
- boolean matched=matchRuleAtAllStartPoints(evaluation,rule);
- matchedAnything|=matched;
+ ProductionRule rule = i.next();
+ boolean matched = matchRuleAtAllStartPoints(evaluation,rule);
+ matchedAnything |= matched;
}
- if (!matchedAnything) return null;
-
- String error=QueryCanonicalizer.canonicalize(query);
-
- if (query.getTraceLevel()>=1)
- query.trace("SemanticSearcher: Rewrote query",true,1);
+ if ( ! matchedAnything) return null;
+ String error = QueryCanonicalizer.canonicalize(query);
+ query.trace("SemanticSearcher: Rewrote query",true,1);
return error;
}
/** Match a rule at any starting point in the query */
private boolean matchRuleAtAllStartPoints(Evaluation evaluation, ProductionRule rule) {
- boolean matchedAtLeastOnce=false;
- int iterationCount=0;
+ boolean matchedAtLeastOnce = false;
+ int iterationCount = 0;
- /**
- * Test if it is a removal rule, if so iterate backwards so that precalculated
- * replacement positions does not become invalid as the query shrink
- */
+ // Test if it is a removal rule, if so iterate backwards so that precalculated
+ // replacement positions do not become invalid as the query shrink
boolean removalRule = false;
if ( (rule instanceof com.yahoo.prelude.semantics.rule.ReplacingProductionRule) &&
(rule.getProduction().toString().length() == 0) ) { // empty replacement
- removalRule = true;
- evaluation.setToLast();
+ removalRule = true;
+ evaluation.setToLast();
}
- int loopLimit=Math.max(15,evaluation.getQuerySize()*3);
+ int loopLimit = Math.max(15, evaluation.getQuerySize() * 3);
while (evaluation.currentItem() != null) {
- boolean matched=matchRule(evaluation,rule);
+ boolean matched = matchRule(evaluation,rule);
if (matched) {
if (removalRule)
- evaluation.resetToLast();
+ evaluation.resetToLast();
else
- evaluation.reset();
+ evaluation.reset();
matchedAtLeastOnce = true;
if (rule.isLoop()) break;
}
else {
if (removalRule)
- evaluation.previous();
+ evaluation.previous();
else
- evaluation.next();
+ evaluation.next();
}
if (matched && iterationCount++ > loopLimit) {
throw new RuleBaseException("Rule '" + rule + "' has matched '" +
- evaluation.getQuery().getModel().getQueryTree().getRoot() +
+ evaluation.getQuery().getModel().getQueryTree().getRoot() +
"' " + loopLimit + " times, aborting");
}
}
@@ -113,7 +109,7 @@ public class RuleEngine {
RuleEvaluation ruleEvaluation=evaluation.freshRuleEvaluation();
ruleEvaluation.indentTrace();
- if (ruleEvaluation.getTraceLevel()>=3) {
+ if (ruleEvaluation.getTraceLevel() >= 3) {
ruleEvaluation.trace(3,"Evaluating rule '" + rule +
"' on '" + ruleEvaluation.getEvaluation().getQuery().getModel().getQueryTree().getRoot() +
"' at '" + ruleEvaluation.currentItem() + "':");
@@ -121,27 +117,27 @@ public class RuleEngine {
ruleEvaluation.indentTrace();
- boolean matches=rule.matches(ruleEvaluation);
+ boolean matches = rule.matches(ruleEvaluation);
- boolean matchedBefore=false;
- int currentMatchDigest=ruleEvaluation.calculateMatchDigest(rule);
+ boolean matchedBefore = false;
+ int currentMatchDigest = ruleEvaluation.calculateMatchDigest(rule);
if (evaluation.hasMatchDigest(currentMatchDigest))
- matchedBefore=true;
+ matchedBefore = true;
- boolean queryGotShorter=false;
- if (evaluation.getPreviousQuerySize()>evaluation.getQuerySize())
- queryGotShorter=true;
+ boolean queryGotShorter = false;
+ if (evaluation.getPreviousQuerySize() > evaluation.getQuerySize())
+ queryGotShorter = true;
- boolean doProduction=!matchedBefore || queryGotShorter;
+ boolean doProduction =! matchedBefore || queryGotShorter;
ruleEvaluation.unindentTrace();
- if (ruleEvaluation.getTraceLevel()>=2) {
+ if (ruleEvaluation.getTraceLevel() >= 2) {
if (matches && doProduction)
ruleEvaluation.trace(2,"Matched rule '" + rule + "' at " + ruleEvaluation.previousItem());
- else if (!matches)
+ else if ( ! matches)
ruleEvaluation.trace(2,"Did not match rule '" + rule + "' at " + ruleEvaluation.currentItem());
- else if (!doProduction)
+ else
ruleEvaluation.trace(2,"Ignoring repeated match of '" + rule + "'");
}
@@ -152,12 +148,12 @@ public class RuleEngine {
// Do production barrier
evaluation.addMatchDigest(currentMatchDigest);
- String preQuery=null;
+ String preQuery = null;
if (evaluation.getTraceLevel()>=1) {
- preQuery= evaluation.getQuery().getModel().getQueryTree().getRoot().toString();
+ preQuery = evaluation.getQuery().getModel().getQueryTree().getRoot().toString();
}
rule.produce(ruleEvaluation);
- if (evaluation.getTraceLevel()>=1) {
+ if (evaluation.getTraceLevel() >= 1) {
evaluation.trace(1,"Transforming '" + preQuery + "' to '" +
evaluation.getQuery().getModel().getQueryTree().getRoot().toString()
+ "' since '" + rule + "' matched");
diff --git a/container-search/src/test/java/com/yahoo/prelude/semantics/compatibility/test/.gitignore b/container-search/src/test/java/com/yahoo/prelude/semantics/compatibility/test/.gitignore
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/container-search/src/test/java/com/yahoo/prelude/semantics/compatibility/test/.gitignore
+++ /dev/null
diff --git a/container-search/src/test/java/com/yahoo/prelude/semantics/test/StopwordTestCase.java b/container-search/src/test/java/com/yahoo/prelude/semantics/test/StopwordTestCase.java
index d2d87dccf33..f6acfb45e72 100644
--- a/container-search/src/test/java/com/yahoo/prelude/semantics/test/StopwordTestCase.java
+++ b/container-search/src/test/java/com/yahoo/prelude/semantics/test/StopwordTestCase.java
@@ -22,6 +22,12 @@ public class StopwordTestCase extends RuleBaseAbstractTestCase {
new Query(QueryTestCase.httpEncode("?query=i don't know if you've heard, but it's a beautiful world&default-index=mlr&tracelevel.rules=0")));
}
+ /** If the query contains nothing but stopwords, we won't remove them */
+ @Test
+ public void testOnlyStopwords() {
+ assertSemantics("mlr:the", new Query(QueryTestCase.httpEncode("?query=the the&default-index=mlr&tracelevel.rules=0")));
+ }
+
@Test
public void testStopwordsInPhrase() {
assertSemantics("AND mlr:\"ve heard\" mlr:beautiful mlr:world",