summaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@broadpark.no>2018-10-11 12:08:04 +0200
committerTor Egge <Tor.Egge@broadpark.no>2018-10-11 12:09:17 +0200
commitb465c6e8aa3e5e0ac4fbdd9814b813e1c845457a (patch)
tree463f970cf9ab7a383a5fc5811733bd8fa8d7c8e4 /container-search
parent4ff6c2ae4efe291df5d420e75a4de7d61d961cc5 (diff)
Handle lowercase for word items below a same element item.
Calculate proper name for lookup in index facts to check if lowercasing should be performed.
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/search/querytransform/AllLowercasingSearcher.java5
-rw-r--r--container-search/src/main/java/com/yahoo/search/querytransform/LowercasingSearcher.java19
-rw-r--r--container-search/src/main/java/com/yahoo/search/querytransform/VespaLowercasingSearcher.java9
-rw-r--r--container-search/src/test/java/com/yahoo/search/querytransform/LowercasingTestCase.java23
4 files changed, 56 insertions, 0 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/querytransform/AllLowercasingSearcher.java b/container-search/src/main/java/com/yahoo/search/querytransform/AllLowercasingSearcher.java
index 0d3eaff7fca..a1574368bc6 100644
--- a/container-search/src/main/java/com/yahoo/search/querytransform/AllLowercasingSearcher.java
+++ b/container-search/src/main/java/com/yahoo/search/querytransform/AllLowercasingSearcher.java
@@ -27,4 +27,9 @@ public class AllLowercasingSearcher extends LowercasingSearcher {
return true;
}
+ @Override
+ public boolean shouldLowercase(String commonPath, WordItem word, IndexFacts.Session settings) {
+ return true;
+ }
+
}
diff --git a/container-search/src/main/java/com/yahoo/search/querytransform/LowercasingSearcher.java b/container-search/src/main/java/com/yahoo/search/querytransform/LowercasingSearcher.java
index 26c52a24e5c..343deef8a55 100644
--- a/container-search/src/main/java/com/yahoo/search/querytransform/LowercasingSearcher.java
+++ b/container-search/src/main/java/com/yahoo/search/querytransform/LowercasingSearcher.java
@@ -54,6 +54,8 @@ public abstract class LowercasingSearcher extends Searcher {
Item next = i.next();
if (next instanceof WordItem) {
lowerCase((WordItem) next, indexFacts);
+ } else if (next instanceof SameElementItem) {
+ traverseSameElement((SameElementItem) next, indexFacts);
} else if (next instanceof CompositeItem) {
traverse((CompositeItem) next, indexFacts);
} else if (next instanceof WeightedSetItem) {
@@ -66,6 +68,15 @@ public abstract class LowercasingSearcher extends Searcher {
}
}
+ private void traverseSameElement(SameElementItem base, IndexFacts.Session indexFacts) {
+ for (Iterator<Item> i = base.getItemIterator(); i.hasNext();) {
+ Item next = i.next();
+ if (next instanceof WordItem) {
+ lowerCase(base.getFieldName(), (WordItem) next, indexFacts);
+ }
+ }
+ }
+
private void lowerCase(WordItem word, IndexFacts.Session indexFacts) {
if (shouldLowercase(word, indexFacts)) {
word.setWord(toLowerCase(word.getWord()));
@@ -73,6 +84,13 @@ public abstract class LowercasingSearcher extends Searcher {
}
}
+ private void lowerCase(String commonPath, WordItem word, IndexFacts.Session indexFacts) {
+ if (shouldLowercase(commonPath, word, indexFacts)) {
+ word.setWord(toLowerCase(word.getWord()));
+ word.setLowercased(true);
+ }
+ }
+
private static final class WeightedSetToken {
final String token;
final String originalToken;
@@ -133,5 +151,6 @@ public abstract class LowercasingSearcher extends Searcher {
* @return whether to convert the term to lower case
*/
public abstract boolean shouldLowercase(WordItem word, IndexFacts.Session indexFacts);
+ public abstract boolean shouldLowercase(String commonPath, WordItem word, IndexFacts.Session indexFacts);
}
diff --git a/container-search/src/main/java/com/yahoo/search/querytransform/VespaLowercasingSearcher.java b/container-search/src/main/java/com/yahoo/search/querytransform/VespaLowercasingSearcher.java
index 74dcbb27817..1e8f436a05a 100644
--- a/container-search/src/main/java/com/yahoo/search/querytransform/VespaLowercasingSearcher.java
+++ b/container-search/src/main/java/com/yahoo/search/querytransform/VespaLowercasingSearcher.java
@@ -35,4 +35,13 @@ public class VespaLowercasingSearcher extends LowercasingSearcher {
return index.isLowercase() || index.isAttribute();
}
+ @Override
+ public boolean shouldLowercase(String commonPath, WordItem word, IndexFacts.Session indexFacts) {
+ if (word.isLowercased()) return false;
+
+ StringBuilder sb = new StringBuilder();
+ sb.append(commonPath).append(".").append(word.getIndexName());
+ Index index = indexFacts.getIndex(sb.toString());
+ return index.isLowercase() || index.isAttribute();
+ }
}
diff --git a/container-search/src/test/java/com/yahoo/search/querytransform/LowercasingTestCase.java b/container-search/src/test/java/com/yahoo/search/querytransform/LowercasingTestCase.java
index 7430b075140..4b2da823271 100644
--- a/container-search/src/test/java/com/yahoo/search/querytransform/LowercasingTestCase.java
+++ b/container-search/src/test/java/com/yahoo/search/querytransform/LowercasingTestCase.java
@@ -7,6 +7,7 @@ import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
+import com.yahoo.prelude.query.SameElementItem;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -36,6 +37,7 @@ public class LowercasingTestCase {
private static final String TEDDY = "teddy";
private static final String BAMSE = "bamse";
+ private static final String SARR = "sarr";
IndexFacts settings;
Execution execution;
@@ -44,13 +46,19 @@ public class LowercasingTestCase {
IndexFacts f = new IndexFacts();
Index bamse = new Index(BAMSE);
Index teddy = new Index(TEDDY);
+ Index sarrBamse = new Index(SARR + "." + BAMSE);
+ Index sarrTeddy = new Index(SARR + "." + TEDDY);
Index defaultIndex = new Index("default");
bamse.setLowercase(true);
teddy.setLowercase(false);
+ sarrBamse.setLowercase(true);
+ sarrTeddy.setLowercase(true);
defaultIndex.setLowercase(true);
f.addIndex("nalle", bamse);
f.addIndex("nalle", teddy);
f.addIndex("nalle", defaultIndex);
+ f.addIndex("nalle", sarrBamse);
+ f.addIndex("nalle", sarrTeddy);
f.freeze();
settings = f;
execution = new Execution(new Chain<Searcher>(
@@ -214,4 +222,19 @@ public class LowercasingTestCase {
assertEquals("def", root.getAlternatives().get(2).word);
assertEquals(1.0d, root.getAlternatives().get(2).exactness, 1e-15d);
}
+
+ @Test
+ public void testLowercaseingSameElement() {
+ Query q = new Query();
+ SameElementItem root = new SameElementItem(SARR);
+ root.addItem(new WordItem("ABC", BAMSE, true));
+ root.addItem(new WordItem("DEF", TEDDY, true));
+ q.getModel().getQueryTree().setRoot(root);
+ Result r = execution.search(q);
+ root = (SameElementItem) r.getQuery().getModel().getQueryTree().getRoot();
+ WordItem w0 = (WordItem) root.getItem(0);
+ WordItem w1 = (WordItem) root.getItem(1);
+ assertEquals("abc", w0.getWord());
+ assertEquals("def", w1.getWord());
+ }
}