diff options
author | Jon Bratseth <bratseth@verizonmedia.com> | 2019-03-22 10:36:01 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@verizonmedia.com> | 2019-03-22 10:36:01 +0100 |
commit | 439757cf0af40cd9ec8334cf73ce4ee56e54708c (patch) | |
tree | c0822f42a41b49e2534d8d9efa759e5469a64212 /container-search | |
parent | a05b9e83ee198a2dda97806eb388ab515b7094c1 (diff) |
Non-functional changes only
Diffstat (limited to 'container-search')
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", |