aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main')
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/ExactStringItem.java8
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/MarkerWordItem.java10
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/PrefixItem.java12
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/SubstringItem.java8
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/SuffixItem.java8
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/WordItem.java8
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/querytransform/StemmingSearcher.java15
7 files changed, 62 insertions, 7 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/ExactStringItem.java b/container-search/src/main/java/com/yahoo/prelude/query/ExactStringItem.java
index cb0752e5408..36e24fa81db 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/ExactStringItem.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/ExactStringItem.java
@@ -17,6 +17,14 @@ public class ExactStringItem extends WordItem {
super(substring, isFromQuery);
}
+ public ExactStringItem(String word, String indexName, boolean isFromQuery, Substring origin) {
+ super(word, indexName, isFromQuery, origin);
+ }
+
+ public ExactStringItem newInstance(String word, String indexName, boolean isFromQuery, Substring origin) {
+ return new ExactStringItem(word, indexName, isFromQuery, origin);
+ }
+
@Override
public ItemType getItemType() {
return ItemType.EXACT;
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/MarkerWordItem.java b/container-search/src/main/java/com/yahoo/prelude/query/MarkerWordItem.java
index 40ea1e37c47..48309cdd8fa 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/MarkerWordItem.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/MarkerWordItem.java
@@ -25,6 +25,16 @@ public class MarkerWordItem extends WordItem {
this.markerWord = markerWord;
}
+ private MarkerWordItem(String publicSymbol, String markerWord, String indexName, boolean isFromQuery, Substring origin) {
+ super(publicSymbol, indexName);
+ this.markerWord = markerWord;
+ }
+
+ /** Returns a new instance of this kind of WordItem, initialized with the given data and nothing else. */
+ public MarkerWordItem newInstance(String word, String indexName, boolean isFromQuery, Substring origin) {
+ return new MarkerWordItem(word, markerWord, indexName, isFromQuery, origin);
+ }
+
public boolean isStartAnchor() { return getWord().equals(startAnchor); }
public boolean isEndAnchor() { return getWord().equals(endAnchor); }
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/PrefixItem.java b/container-search/src/main/java/com/yahoo/prelude/query/PrefixItem.java
index 5904d805a39..9fc087e70b4 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/PrefixItem.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/PrefixItem.java
@@ -17,7 +17,17 @@ public class PrefixItem extends WordItem {
super(prefix, isFromQuery);
}
- public PrefixItem(String prefix, String indexName) { super(prefix, indexName); }
+ public PrefixItem(String prefix, String indexName) {
+ super(prefix, indexName);
+ }
+
+ public PrefixItem(String prefix, String indexName, boolean isFromQuery, Substring origin) {
+ super(prefix, indexName, isFromQuery, origin);
+ }
+
+ public PrefixItem newInstance(String word, String indexName, boolean isFromQuery, Substring origin) {
+ return new PrefixItem(word, indexName, isFromQuery, origin);
+ }
@Override
public ItemType getItemType() {
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/SubstringItem.java b/container-search/src/main/java/com/yahoo/prelude/query/SubstringItem.java
index 7a05235b199..df9de84b04d 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/SubstringItem.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/SubstringItem.java
@@ -16,6 +16,14 @@ public class SubstringItem extends WordItem {
super(substring, isFromQuery);
}
+ public SubstringItem(String substring, String indexName, boolean isFromQuery, Substring origin) {
+ super(substring, indexName, isFromQuery, origin);
+ }
+
+ public SubstringItem newInstance(String word, String indexName, boolean isFromQuery, Substring origin) {
+ return new SubstringItem(word, indexName, isFromQuery, origin);
+ }
+
@Override
public ItemType getItemType() {
return ItemType.SUBSTRING;
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/SuffixItem.java b/container-search/src/main/java/com/yahoo/prelude/query/SuffixItem.java
index 700564853fd..e364330a377 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/SuffixItem.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/SuffixItem.java
@@ -16,6 +16,14 @@ public class SuffixItem extends WordItem {
super(suffix, isFromQuery);
}
+ public SuffixItem(String substring, String indexName, boolean isFromQuery, Substring origin) {
+ super(substring, indexName, isFromQuery, origin);
+ }
+
+ public SuffixItem newInstance(String word, String indexName, boolean isFromQuery, Substring origin) {
+ return new SuffixItem(word, indexName, isFromQuery, origin);
+ }
+
@Override
public ItemType getItemType() {
return ItemType.SUFFIX;
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/WordItem.java b/container-search/src/main/java/com/yahoo/prelude/query/WordItem.java
index 4f8b02a8d13..9cfa33fa07d 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/WordItem.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/WordItem.java
@@ -62,6 +62,14 @@ public class WordItem extends TermItem {
setWord(word);
}
+ /**
+ * Returns a new instance of this kind of WordItem, initialized with the given data and any other
+ * fields belonging to the item subclass copied from this instance.
+ */
+ public WordItem newInstance(String word, String indexName, boolean isFromQuery, Substring origin) {
+ return new WordItem(word, indexName, isFromQuery, origin);
+ }
+
public ItemType getItemType() {
return ItemType.WORD;
}
diff --git a/container-search/src/main/java/com/yahoo/prelude/querytransform/StemmingSearcher.java b/container-search/src/main/java/com/yahoo/prelude/querytransform/StemmingSearcher.java
index e8350831381..e40f161ede2 100644
--- a/container-search/src/main/java/com/yahoo/prelude/querytransform/StemmingSearcher.java
+++ b/container-search/src/main/java/com/yahoo/prelude/querytransform/StemmingSearcher.java
@@ -163,7 +163,7 @@ public class StemmingSearcher extends Searcher {
}
private Item checkBlock(BlockItem b, StemContext context) {
- if (b instanceof PrefixItem || !b.isWords()) return (Item) b;
+ if (!b.isWords()) return (Item) b;
if (b.isFromQuery() && !b.isStemmed()) {
Index index = context.indexFacts.getIndex(b.getIndexName());
@@ -190,10 +190,8 @@ public class StemmingSearcher extends Searcher {
// The rewriting logic is here
private Item stem(BlockItem current, StemContext context, Index index) {
- Item blockAsItem = (Item)current;
- CompositeItem composite;
List<StemList> segments = linguistics.getStemmer().stem(current.stringValue(), index.getStemMode(), context.language);
- if (segments.isEmpty()) return blockAsItem;
+ if (segments.isEmpty()) return (Item)current;
String indexName = current.getIndexName();
Substring substring = getOffsets(current);
@@ -203,6 +201,7 @@ public class StemmingSearcher extends Searcher {
return (Item)w;
}
+ CompositeItem composite;
if (context.isCJK)
composite = chooseCompositeForCJK(current, ((Item) current).getParent(), indexName);
else
@@ -219,7 +218,7 @@ public class StemmingSearcher extends Searcher {
if (composite instanceof AndSegmentItem) {
andSegmentConnectivity(current, context.reverseConnectivity, composite);
}
- copyAttributes(blockAsItem, composite);
+ copyAttributes((Item)current, composite);
composite.lock();
if (composite instanceof PhraseSegmentItem replacement) {
@@ -320,7 +319,11 @@ public class StemmingSearcher extends Searcher {
private WordItem singleStemSegment(Item blockAsItem, String stem, String indexName,
Substring substring) {
- WordItem replacement = new WordItem(stem, indexName, true, substring);
+ WordItem replacement;
+ if (blockAsItem instanceof WordItem) // preserve the WordItem subclass type
+ replacement = ((WordItem)blockAsItem).newInstance(stem, indexName, true, substring);
+ else
+ replacement = new WordItem(stem, indexName, true, substring);
replacement.setStemmed(true);
copyAttributes(blockAsItem, replacement);
return replacement;