aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/AbstractParser.java79
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/AdvancedParser.java90
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java22
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/AnyParser.java23
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/CustomParser.java1
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/ParseException.java4
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/PhraseParser.java3
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/ProgrammaticParser.java3
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java33
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java48
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/Token.java44
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/TokenPosition.java4
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/TokenizeParser.java2
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/Tokenizer.java1
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/UnicodePropertyDump.java7
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/parser/WebParser.java4
-rw-r--r--container-search/src/test/java/com/yahoo/prelude/test/QueryTestCase.java2
17 files changed, 180 insertions, 190 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/AbstractParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/AbstractParser.java
index 9f57512f657..38d09c3ddf4 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/AbstractParser.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/AbstractParser.java
@@ -5,12 +5,19 @@ import com.yahoo.language.Language;
import com.yahoo.language.process.Segmenter;
import com.yahoo.prelude.Index;
import com.yahoo.prelude.IndexFacts;
-import com.yahoo.prelude.query.*;
+import com.yahoo.prelude.query.AndSegmentItem;
+import com.yahoo.prelude.query.CompositeItem;
+import com.yahoo.prelude.query.Item;
+import com.yahoo.prelude.query.NullItem;
+import com.yahoo.prelude.query.PhraseItem;
+import com.yahoo.prelude.query.PhraseSegmentItem;
+import com.yahoo.prelude.query.WordItem;
import com.yahoo.search.query.QueryTree;
import com.yahoo.search.query.parser.Parsable;
import com.yahoo.search.query.parser.ParserEnvironment;
-import java.util.*;
+import java.util.List;
+import java.util.ListIterator;
/**
* The Vespa query parser.
@@ -20,6 +27,7 @@ import java.util.*;
*/
public abstract class AbstractParser implements CustomParser {
+
/** The current submodes of this parser */
protected Submodes submodes = new Submodes();
@@ -32,6 +40,8 @@ public abstract class AbstractParser implements CustomParser {
/** The IndexFacts.Session of this query */
protected IndexFacts.Session indexFacts;
+ protected String defaultIndex;
+
/**
* The counter for braces in URLs, braces in URLs are accepted so long as
* they are balanced.
@@ -125,41 +135,38 @@ public abstract class AbstractParser implements CustomParser {
@Override
public final Item parse(String queryToParse, String filterToParse, Language parsingLanguage,
- IndexFacts.Session indexFacts, String defaultIndexName) {
- return parse(queryToParse, filterToParse, parsingLanguage, indexFacts, defaultIndexName, null);
+ IndexFacts.Session indexFacts, String defaultIndex) {
+ return parse(queryToParse, filterToParse, parsingLanguage, indexFacts, defaultIndex, null);
}
private Item parse(String queryToParse, String filterToParse, Language parsingLanguage,
- IndexFacts.Session indexFacts, String defaultIndexName, Parsable parsable) {
+ IndexFacts.Session indexFacts, String defaultIndex, Parsable parsable) {
if (queryToParse == null) return null;
if (defaultIndexName != null)
- defaultIndexName = indexFacts.getCanonicName(defaultIndexName);
+ defaultIndexName = indexFacts.getCanonicName(defaultIndex);
- tokenize(queryToParse, defaultIndexName, indexFacts, parsingLanguage);
+ tokenize(queryToParse, defaultIndex, indexFacts, parsingLanguage);
if (parsingLanguage == null && parsable != null) {
- String detectionText = generateLanguageDetectionTextFrom(tokens, indexFacts, defaultIndexName);
+ String detectionText = generateLanguageDetectionTextFrom(tokens, indexFacts, defaultIndex);
if (detectionText.isEmpty()) // heuristic detection text extraction is fallible
detectionText = queryToParse;
parsingLanguage = parsable.getOrDetectLanguage(detectionText);
}
- setState(parsingLanguage, indexFacts);
- Item root = parseItems(defaultIndexName);
+ setState(parsingLanguage, indexFacts, defaultIndex);
+ Item root = parseItems();
+
if (filterToParse != null) {
AnyParser filterParser = new AnyParser(environment);
if (root == null) {
- root = filterParser.parseFilter(filterToParse, parsingLanguage, indexFacts);
+ root = filterParser.parseFilter(filterToParse, parsingLanguage, indexFacts, defaultIndex);
} else {
- root = filterParser.applyFilter(root, filterToParse, parsingLanguage, indexFacts);
+ root = filterParser.applyFilter(root, filterToParse, parsingLanguage, indexFacts, defaultIndex);
}
}
- root = simplifyPhrases(root);
- if (defaultIndexName != null) {
- assignDefaultIndex(indexFacts.getCanonicName(defaultIndexName), root);
- }
- return root;
+ return simplifyPhrases(root);
}
/**
@@ -226,30 +233,7 @@ public abstract class AbstractParser implements CustomParser {
return kind.equals(tokenOrNull.kind);
}
- protected abstract Item parseItems(String defaultIndexName);
-
- /**
- * Assigns the default index to query terms having no default index. The
- * parser _should_ have done this, for some reason it doesn't.
- *
- * @param defaultIndex the default index to assign
- * @param item the item to check
- */
- private static void assignDefaultIndex(String defaultIndex, Item item) {
- if (defaultIndex == null || item == null) return;
-
- if (item instanceof IndexedItem) {
- IndexedItem indexName = (IndexedItem) item;
-
- if ("".equals(indexName.getIndexName()))
- indexName.setIndexName(defaultIndex);
- }
- else if (item instanceof CompositeItem) {
- Iterator<Item> items = ((CompositeItem)item).getItemIterator();
- while (items.hasNext())
- assignDefaultIndex(defaultIndex, items.next());
- }
- }
+ protected abstract Item parseItems();
/**
* Unicode normalizes some piece of natural language text. The chosen form
@@ -261,10 +245,11 @@ public abstract class AbstractParser implements CustomParser {
return environment.getLinguistics().getNormalizer().normalize(input);
}
- protected void setState(Language queryLanguage, IndexFacts.Session indexFacts) {
+ protected void setState(Language queryLanguage, IndexFacts.Session indexFacts, String defaultIndex) {
this.indexFacts = indexFacts;
- language = queryLanguage;
- submodes.reset();
+ this.defaultIndex = defaultIndex;
+ this.language = queryLanguage;
+ this.submodes.reset();
}
/**
@@ -293,8 +278,7 @@ public abstract class AbstractParser implements CustomParser {
return unwashed;
} else if (unwashed instanceof PhraseItem) {
return collapsePhrase((PhraseItem) unwashed);
- } else if (unwashed instanceof CompositeItem) {
- CompositeItem composite = (CompositeItem) unwashed;
+ } else if (unwashed instanceof CompositeItem composite) {
ListIterator<Item> i = composite.getItemIterator();
while (i.hasNext()) {
@@ -312,9 +296,8 @@ public abstract class AbstractParser implements CustomParser {
}
private static Item collapsePhrase(PhraseItem phrase) {
- if (phrase.getItemCount() == 1 && phrase.getItem(0) instanceof WordItem) {
+ if (phrase.getItemCount() == 1 && phrase.getItem(0) instanceof WordItem word) {
// TODO: Other stuff which needs propagation?
- WordItem word = (WordItem) phrase.getItem(0);
word.setWeight(phrase.getWeight());
return word;
} else {
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/AdvancedParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/AdvancedParser.java
index 3358075d670..8f98763a838 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/AdvancedParser.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/AdvancedParser.java
@@ -1,14 +1,25 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.prelude.query.parser;
-import com.yahoo.prelude.query.*;
+import com.yahoo.prelude.query.AndItem;
+import com.yahoo.prelude.query.CompositeItem;
+import com.yahoo.prelude.query.EquivItem;
+import com.yahoo.prelude.query.Item;
+import com.yahoo.prelude.query.NearItem;
+import com.yahoo.prelude.query.NotItem;
+import com.yahoo.prelude.query.ONearItem;
+import com.yahoo.prelude.query.OrItem;
+import com.yahoo.prelude.query.RankItem;
+import com.yahoo.prelude.query.SegmentItem;
+import com.yahoo.prelude.query.WeakAndItem;
+import com.yahoo.prelude.query.WordItem;
import com.yahoo.search.query.parser.ParserEnvironment;
import static com.yahoo.prelude.query.parser.Token.Kind.LBRACE;
import static com.yahoo.prelude.query.parser.Token.Kind.NUMBER;
/**
- * Parser for queries of type advanced.
+ * Parser for queries of type 'advanced'.
*
* @author Steinar Knutsen
* @deprecated YQL should be used for formal queries
@@ -20,7 +31,8 @@ public class AdvancedParser extends StructuredParser {
super(environment);
}
- protected Item parseItems(String defaultIndexName) {
+ @Override
+ protected Item parseItems() {
return advancedItems(true);
}
@@ -53,46 +65,40 @@ public class AdvancedParser extends StructuredParser {
boolean expectingOperator = false;
do {
- item = null;
-
+ item = indexableItem().getFirst();
if (item == null) {
- item = indexableItem();
- if (item == null) {
- item = compositeItem();
- itemIsComposite = true;
- } else {
- itemIsComposite = false;
- }
- if (item != null) {
- Item newTop = null;
+ item = compositeItem();
+ itemIsComposite = true;
+ } else {
+ itemIsComposite = false;
+ }
+ if (item != null) {
+ Item newTop = null;
- if (expectingOperator) {
- newTop = handleAdvancedOperator(topLevelItem, item,
- topLevelIsClosed);
- }
- if (newTop != null) { // Operator found
- topLevelIsClosed = false;
- expectingOperator = false;
- topLevelItem = newTop;
- } else if (topLevelItem == null) {
- topLevelItem = item;
- if (itemIsComposite) {
- topLevelIsClosed = true;
- }
- expectingOperator = true;
- } else if (topLevelItem instanceof CompositeItem
- && !(topLevelItem instanceof SegmentItem)) {
- ((CompositeItem) topLevelItem).addItem(item);
- expectingOperator = true;
- } else {
- AndItem and = new AndItem();
-
- and.addItem(topLevelItem);
- and.addItem(item);
- topLevelItem = and;
- topLevelIsClosed = false;
- expectingOperator = true;
+ if (expectingOperator) {
+ newTop = handleAdvancedOperator(topLevelItem, item, topLevelIsClosed);
+ }
+ if (newTop != null) { // Operator found
+ topLevelIsClosed = false;
+ expectingOperator = false;
+ topLevelItem = newTop;
+ } else if (topLevelItem == null) {
+ topLevelItem = item;
+ if (itemIsComposite) {
+ topLevelIsClosed = true;
}
+ expectingOperator = true;
+ } else if (topLevelItem instanceof CompositeItem && !(topLevelItem instanceof SegmentItem)) {
+ ((CompositeItem) topLevelItem).addItem(item);
+ expectingOperator = true;
+ } else {
+ AndItem and = new AndItem();
+
+ and.addItem(topLevelItem);
+ and.addItem(item);
+ topLevelItem = and;
+ topLevelIsClosed = false;
+ expectingOperator = true;
}
}
@@ -178,7 +184,7 @@ public class AdvancedParser extends StructuredParser {
int distance = consumeNumericArgument();
if (distance==0)
distance=NearItem.defaultDistance;
- if (topLevelIsClosed || !(topLevelItem instanceof NearItem) || distance!=((NearItem)topLevelItem).getDistance()) {
+ if (topLevelIsClosed || !(topLevelItem instanceof NearItem) || distance != ((NearItem)topLevelItem).getDistance()) {
NearItem near = new NearItem(distance);
near.addItem(topLevelItem);
@@ -188,7 +194,7 @@ public class AdvancedParser extends StructuredParser {
} else if (isTheWord("onear", item)) {
int distance = consumeNumericArgument();
if (distance==0)
- distance=ONearItem.defaultDistance;
+ distance= ONearItem.defaultDistance;
if (topLevelIsClosed || !(topLevelItem instanceof ONearItem) || distance!=((ONearItem)topLevelItem).getDistance()) {
ONearItem oNear = new ONearItem(distance);
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java
index 09caa72ca59..9a60eaef76b 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/AllParser.java
@@ -41,16 +41,16 @@ public class AllParser extends SimpleParser {
}
@Override
- protected Item parseItems(String defaultIndexName) {
+ protected Item parseItems() {
int position = tokens.getPosition();
try {
- return parseItemsBody(defaultIndexName);
+ return parseItemsBody();
} finally {
tokens.setPosition(position);
}
}
- protected Item parseItemsBody(String defaultIndexName) {
+ protected Item parseItemsBody() {
// Algorithm: Collect positive, negative, and and'ed items, then combine.
CompositeItem and = null;
NotItem not = null; // Store negatives here as we go
@@ -65,7 +65,7 @@ public class AllParser extends SimpleParser {
current = positiveItem();
if (current == null)
- current = indexableItem(defaultIndexName);
+ current = indexableItem().getFirst();
if (current == null)
current = compositeItem();
@@ -129,8 +129,9 @@ public class AllParser extends SimpleParser {
try {
if ( ! tokens.skip(MINUS)) return null;
if (tokens.currentIsNoIgnore(SPACE)) return null;
-
- item = indexableItem();
+ var itemAndExplicitIndex = indexableItem();
+ item = itemAndExplicitIndex.getFirst();
+ boolean explicitIndex = itemAndExplicitIndex.getSecond();
if (item == null) {
item = compositeItem();
@@ -155,11 +156,11 @@ public class AllParser extends SimpleParser {
// but interpret -(N) as a negative item matching a positive number
// but interpret --N as a negative item matching a negative number
if (item instanceof IntItem &&
- ((IntItem)item).getIndexName().isEmpty() &&
+ ! explicitIndex &&
! isComposited &&
- ! ((IntItem)item).getNumber().startsWith(("-")))
+ ! ((IntItem)item).getNumber().startsWith(("-"))) {
item = null;
-
+ }
return item;
} finally {
if (item == null) {
@@ -204,8 +205,7 @@ public class AllParser extends SimpleParser {
rank.addItem(topLevelItem);
}
return rank;
- } else if ((item instanceof RankItem) && (((RankItem)item).getItem(0) instanceof OrItem)) {
- RankItem itemAsRank = (RankItem) item;
+ } else if ((item instanceof RankItem itemAsRank) && (((RankItem)item).getItem(0) instanceof OrItem)) {
OrItem or = (OrItem) itemAsRank.getItem(0);
((RankItem) topLevelItem).addItem(0, or);
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/AnyParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/AnyParser.java
index f4ff769ad05..bf778409364 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/AnyParser.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/AnyParser.java
@@ -14,9 +14,7 @@ import com.yahoo.prelude.query.RankItem;
import com.yahoo.prelude.query.TermItem;
import com.yahoo.search.query.parser.ParserEnvironment;
-import java.util.Collections;
import java.util.Iterator;
-import java.util.Set;
import static com.yahoo.prelude.query.parser.Token.Kind.*;
@@ -31,12 +29,13 @@ public class AnyParser extends SimpleParser {
super(environment);
}
- protected Item parseItems(String defaultIndexName) {
- return anyItems(true, defaultIndexName);
+ @Override
+ protected Item parseItems() {
+ return anyItems(true);
}
- Item parseFilter(String filter, Language queryLanguage, IndexFacts.Session indexFacts) {
- setState(queryLanguage, indexFacts);
+ Item parseFilter(String filter, Language queryLanguage, IndexFacts.Session indexFacts, String defaultIndex) {
+ setState(queryLanguage, indexFacts, defaultIndex);
tokenize(filter, null, indexFacts, queryLanguage);
Item filterRoot = anyItems(true);
@@ -55,7 +54,7 @@ public class AnyParser extends SimpleParser {
if ( ! tokens.skipMultiple(MINUS)) return null;
if (tokens.currentIsNoIgnore(SPACE)) return null;
- item = indexableItem();
+ item = indexableItem().getFirst();
if (item == null) {
item = compositeItem();
@@ -123,8 +122,8 @@ public class AnyParser extends SimpleParser {
}
}
- Item applyFilter(Item root, String filter, Language queryLanguage, IndexFacts.Session indexFacts) {
- setState(queryLanguage, indexFacts);
+ Item applyFilter(Item root, String filter, Language queryLanguage, IndexFacts.Session indexFacts, String defaultIndex) {
+ setState(queryLanguage, indexFacts, defaultIndex);
tokenize(filter, null, indexFacts, queryLanguage);
return filterItems(root);
}
@@ -148,16 +147,14 @@ public class AnyParser extends SimpleParser {
private Item filterItems(Item root) {
while (tokens.hasNext()) {
- Item item = null;
-
- item = positiveItem();
+ Item item = positiveItem();
root = addAndFilter(root, item);
if (item == null) {
item = negativeItem();
root = addNotFilter(root, item);
}
if (item == null) {
- item = indexableItem();
+ item = indexableItem().getFirst();
root = addRankFilter(root, item);
}
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/CustomParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/CustomParser.java
index e867def5903..e3b2278475b 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/CustomParser.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/CustomParser.java
@@ -7,7 +7,6 @@ import com.yahoo.prelude.query.Item;
import com.yahoo.search.query.parser.Parser;
import java.util.Collections;
-import java.util.Objects;
import java.util.Set;
/**
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/ParseException.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/ParseException.java
index bef2ca9ffe9..82515c51c05 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/ParseException.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/ParseException.java
@@ -1,13 +1,11 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.prelude.query.parser;
-
/**
* Parser exceptions. JavaCC legacy, never thrown.
*
- * @author bratseth
+ * @author bratseth
*/
-@SuppressWarnings("serial")
public class ParseException extends RuntimeException {
public ParseException(String message) {
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/PhraseParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/PhraseParser.java
index 72eb56dd0fb..01b5b943829 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/PhraseParser.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/PhraseParser.java
@@ -16,7 +16,8 @@ public class PhraseParser extends AbstractParser {
super(environment);
}
- protected Item parseItems(String defaultIndex) {
+ @Override
+ protected Item parseItems() {
return forcedPhrase();
}
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/ProgrammaticParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/ProgrammaticParser.java
index 6a005bc0ec9..209753a596c 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/ProgrammaticParser.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/ProgrammaticParser.java
@@ -9,8 +9,6 @@ import com.yahoo.search.query.QueryTree;
import com.yahoo.search.query.parser.Parsable;
import com.yahoo.search.query.textserialize.TextSerialize;
-import java.util.Set;
-
/**
* @author Simon Thoresen Hult
*/
@@ -32,4 +30,5 @@ public final class ProgrammaticParser implements CustomParser {
if (queryToParse == null) return null;
return TextSerialize.parse(queryToParse);
}
+
}
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java
index fafbf55a522..b7355c43f81 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/SimpleParser.java
@@ -1,7 +1,16 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.prelude.query.parser;
-import com.yahoo.prelude.query.*;
+import com.yahoo.prelude.query.AndItem;
+import com.yahoo.prelude.query.BlockItem;
+import com.yahoo.prelude.query.CompositeItem;
+import com.yahoo.prelude.query.Item;
+import com.yahoo.prelude.query.NotItem;
+import com.yahoo.prelude.query.OrItem;
+import com.yahoo.prelude.query.PhraseItem;
+import com.yahoo.prelude.query.RankItem;
+import com.yahoo.prelude.query.TermItem;
+import com.yahoo.prelude.query.TrueItem;
import com.yahoo.search.query.parser.ParserEnvironment;
import java.util.Iterator;
@@ -33,12 +42,12 @@ abstract class SimpleParser extends StructuredParser {
* If there's a explicit composite and some other terms,
* a rank terms combines them
*/
- protected Item anyItems(boolean topLevel, String defaultIndexName) {
+ protected Item anyItems(boolean topLevel) {
int position = tokens.getPosition();
Item item = null;
try {
- item = anyItemsBody(topLevel, defaultIndexName);
+ item = anyItemsBody(topLevel);
return item;
} finally {
if (item == null) {
@@ -47,14 +56,10 @@ abstract class SimpleParser extends StructuredParser {
}
}
- protected Item anyItems(boolean topLevel) {
- return anyItems(topLevel, null);
- }
-
- private Item anyItemsBody(boolean topLevel, String defaultIndexName) {
+ private Item anyItemsBody(boolean topLevel) {
Item topLevelItem = null;
NotItem not = null;
- Item item = null;
+ Item item;
do {
item = positiveItem();
if (item != null) {
@@ -92,7 +97,7 @@ abstract class SimpleParser extends StructuredParser {
}
if (item == null) {
- item = indexableItem(defaultIndexName);
+ item = indexableItem().getFirst();
if (item != null) {
if (topLevelItem == null) {
topLevelItem = item;
@@ -177,9 +182,7 @@ abstract class SimpleParser extends StructuredParser {
return null;
}
- if (item == null) {
- item = indexableItem();
- }
+ item = indexableItem().getFirst();
if (item == null) {
item = compositeItem();
@@ -200,12 +203,10 @@ abstract class SimpleParser extends StructuredParser {
* (+ items) are not found, but negatives are.
*/
private Item getItemAsPositiveItem(Item item, NotItem not) {
- if (!(item instanceof RankItem)) {
+ if (!(item instanceof RankItem rank)) {
return item;
}
- RankItem rank = (RankItem) item;
-
// Remove the not from the rank item, the rank should generally
// be the first, but this is not always the case
int limit = rank.getItemCount();
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java
index c668cf66447..88490237fc7 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/StructuredParser.java
@@ -1,8 +1,26 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.prelude.query.parser;
+import com.yahoo.collections.Pair;
import com.yahoo.prelude.IndexFacts;
-import com.yahoo.prelude.query.*;
+import com.yahoo.prelude.query.AndItem;
+import com.yahoo.prelude.query.AndSegmentItem;
+import com.yahoo.prelude.query.BlockItem;
+import com.yahoo.prelude.query.CompositeItem;
+import com.yahoo.prelude.query.IntItem;
+import com.yahoo.prelude.query.Item;
+import com.yahoo.prelude.query.MarkerWordItem;
+import com.yahoo.prelude.query.PhraseItem;
+import com.yahoo.prelude.query.PhraseSegmentItem;
+import com.yahoo.prelude.query.PrefixItem;
+import com.yahoo.prelude.query.SegmentItem;
+import com.yahoo.prelude.query.Substring;
+import com.yahoo.prelude.query.SubstringItem;
+import com.yahoo.prelude.query.SuffixItem;
+import com.yahoo.prelude.query.TaggableItem;
+import com.yahoo.prelude.query.TermItem;
+import com.yahoo.prelude.query.UriItem;
+import com.yahoo.prelude.query.WordItem;
import com.yahoo.search.query.parser.ParserEnvironment;
import java.util.ArrayList;
@@ -52,19 +70,22 @@ abstract class StructuredParser extends AbstractParser {
submodes.setFromIndex(indexName, indexFacts);
}
- protected Item indexableItem() {
- return indexableItem(null);
- }
-
- protected Item indexableItem(String defaultIndexName) {
+ /**
+ * Returns an item and whether it had an explicit index ('indexname:' prefix).
+ *
+ * @return an item and whether it has an explicit index, or a Pair with the first element null if none
+ */
+ protected Pair<Item, Boolean> indexableItem() {
int position = tokens.getPosition();
Item item = null;
try {
+ boolean explicitIndex = false;
String indexName = indexPrefix();
- if (Objects.isNull(indexName)) {
- indexName = defaultIndexName;
- }
+ if (indexName != null)
+ explicitIndex = true;
+ else
+ indexName = this.defaultIndex;
setSubmodeFromIndex(indexName, indexFacts);
item = number();
@@ -86,7 +107,6 @@ abstract class StructuredParser extends AbstractParser {
if (item != null) {
weight = weightSuffix();
}
-
if (indexName != null && item != null) {
item.setIndexName(indexName);
}
@@ -95,7 +115,7 @@ abstract class StructuredParser extends AbstractParser {
item.setWeight(weight);
}
- return item;
+ return new Pair<>(item, explicitIndex);
} finally {
if (item == null) {
tokens.setPosition(position);
@@ -109,8 +129,7 @@ abstract class StructuredParser extends AbstractParser {
if (tokens.currentIsNoIgnore(SPACE)) {
return false;
}
- if (tokens.currentIsNoIgnore(NUMBER)
- || tokens.currentIsNoIgnore(WORD)) {
+ if (tokens.currentIsNoIgnore(NUMBER) || tokens.currentIsNoIgnore(WORD)) {
return true;
}
tokens.skipNoIgnore();
@@ -286,7 +305,6 @@ abstract class StructuredParser extends AbstractParser {
tokens.skip(LSQUAREBRACKET);
if (item == null)
tokens.skipNoIgnore(SPACE);
-
// TODO: Better definition of start and end of numeric items
if (item == null && tokens.currentIsNoIgnore(MINUS) && (tokens.currentNoIgnore(1).kind == NUMBER)) {
tokens.skipNoIgnore();
@@ -592,7 +610,7 @@ abstract class StructuredParser extends AbstractParser {
if (firstWord instanceof IntItem) {
IntItem asInt = (IntItem) firstWord;
firstWord = new WordItem(asInt.stringValue(), asInt.getIndexName(),
- true, asInt.getOrigin());
+ true, asInt.getOrigin());
}
composite.addItem(firstWord);
composite.addItem(word);
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/Token.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/Token.java
index b668df9208c..3bf4d9dcf01 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/Token.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/Token.java
@@ -1,7 +1,6 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.prelude.query.parser;
-
import com.yahoo.prelude.query.Substring;
/**
@@ -11,7 +10,7 @@ import com.yahoo.prelude.query.Substring;
*/
public class Token {
- public static enum Kind {
+ public enum Kind {
EOF("<EOF>"),
NUMBER("<NUMBER>"),
WORD("<WORD>"),
@@ -77,31 +76,6 @@ public class Token {
/** Returns whether this is a <i>special token</i> */
public boolean isSpecial() { return special; }
- public String toString() { return image; }
-
- public boolean equals(Object object) {
- if (this == object) {
- return true;
- }
- if (object == null) {
- return false;
- }
- if (object.getClass() != this.getClass()) {
- return false;
- }
-
- Token other = (Token) object;
-
- if (this.kind != other.kind) {
- return false;
- }
- if (!(this.image.equals(other.image))) {
- return false;
- }
-
- return true;
- }
-
/**
* Returns the substring containing the image ins original form (including casing),
* as well as all the text surrounding the token
@@ -110,6 +84,22 @@ public class Token {
*/
public Substring getSubstring() { return substring; }
+ @Override
+ public String toString() { return image; }
+
+ @Override
+ public boolean equals(Object object) {
+ if (this == object) return true;
+ if (object == null) return false;
+ if (object.getClass() != this.getClass()) return false;
+
+ Token other = (Token) object;
+ if (this.kind != other.kind) return false;
+ if (!(this.image.equals(other.image))) return false;
+ return true;
+ }
+
+ @Override
public int hashCode() {
return image.hashCode() ^ kind.hashCode();
}
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenPosition.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenPosition.java
index 9c60abab637..5ead962e430 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenPosition.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenPosition.java
@@ -37,9 +37,7 @@ final class TokenPosition {
* Returns null (no exception) if there are no more tokens.
*/
public Token current() {
- Token token = current(0);
-
- return token;
+ return current(0);
}
/**
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenizeParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenizeParser.java
index eefbe5fa0d0..dbbc321d057 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenizeParser.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/TokenizeParser.java
@@ -22,7 +22,7 @@ public final class TokenizeParser extends AbstractParser {
}
@Override
- protected Item parseItems(String defaultIndex) {
+ protected Item parseItems() {
WeakAndItem weakAnd = new WeakAndItem();
Token token;
while (null != (token = tokens.next())) {
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/Tokenizer.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/Tokenizer.java
index 93b8cf1ed83..c1d415b8e27 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/Tokenizer.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/Tokenizer.java
@@ -84,7 +84,6 @@ public final class Tokenizer {
* @param indexFacts information about the indexes we will search
* @return a read-only list of tokens. This list can only be used by this thread
*/
- @SuppressWarnings({"deprecation"})
// To avoid this we need to pass an IndexFacts.session down instead - easily done but not without breaking API's
public List<Token> tokenize(String string, String defaultIndexName, IndexFacts.Session indexFacts) {
this.source = string;
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/UnicodePropertyDump.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/UnicodePropertyDump.java
index b01b1295f45..8d2adfe0d78 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/UnicodePropertyDump.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/UnicodePropertyDump.java
@@ -26,13 +26,13 @@ class UnicodePropertyDump {
boolean debug = false;
if (arg.length > 0) {
- start = Integer.valueOf(arg[0]).intValue();
+ start = Integer.parseInt(arg[0]);
}
if (arg.length > 1) {
- end = Integer.valueOf(arg[1]).intValue();
+ end = Integer.parseInt(arg[1]);
}
if (arg.length > 2) {
- debug = Boolean.valueOf(arg[2]).booleanValue();
+ debug = Boolean.parseBoolean(arg[2]);
}
dumpProperties(start, end, debug, System.out);
}
@@ -109,4 +109,5 @@ class UnicodePropertyDump {
out.println();
}
}
+
}
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/parser/WebParser.java b/container-search/src/main/java/com/yahoo/prelude/query/parser/WebParser.java
index 40497d94a6d..aff28179050 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/parser/WebParser.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/parser/WebParser.java
@@ -28,7 +28,7 @@ public class WebParser extends AllParser {
}
@Override
- protected Item parseItemsBody(String defaultIndexName) {
+ protected Item parseItemsBody() {
// Algorithm: Collect positive, negative, and'ed and or'ed elements, then combine.
CompositeItem and = null;
OrItem or = null;
@@ -45,7 +45,7 @@ public class WebParser extends AllParser {
current = positiveItem();
if (current == null)
- current = indexableItem(defaultIndexName);
+ current = indexableItem().getFirst();
if (current != null) {
if (and != null && (current instanceof WordItem) && "OR".equals(((WordItem)current).getRawWord())) {
diff --git a/container-search/src/test/java/com/yahoo/prelude/test/QueryTestCase.java b/container-search/src/test/java/com/yahoo/prelude/test/QueryTestCase.java
index 95ecf3c2dba..06b6eca5f84 100644
--- a/container-search/src/test/java/com/yahoo/prelude/test/QueryTestCase.java
+++ b/container-search/src/test/java/com/yahoo/prelude/test/QueryTestCase.java
@@ -195,7 +195,7 @@ public class QueryTestCase {
assertTrue(p.hashCode() != q.hashCode());
}
- /** Test using the defauultindex feature */
+ /** Test using the defaultindex feature */
@Test
void testDefaultIndex() {
Query q = newQuery("?query=hi hello keyword:kanoo " +