summaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2018-06-01 19:38:06 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2018-06-01 19:38:06 +0200
commit14d0d1525fe517a87fe6ff598aec9707c7d50012 (patch)
treed3cbcfe7af21265441911019df5595f576b87e64 /container-search
parentae6595add144d4f5cdcf2b70b4296032e4ba2d6b (diff)
Support more than 'contains'. SameElement will only allow what it can handle.
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/search/yql/YqlParser.java37
-rw-r--r--container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java2
2 files changed, 32 insertions, 7 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java b/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
index c6097b1bc73..38a87f3b7bc 100644
--- a/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
+++ b/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
@@ -102,6 +102,10 @@ public class YqlParser implements Parser {
NEVER, POSSIBLY, ALWAYS;
}
+ private static class IndexNameExpander {
+ public String expand(String leaf) { return leaf; }
+ }
+
private static final Integer DEFAULT_HITS = 10;
private static final Integer DEFAULT_OFFSET = 0;
private static final Integer DEFAULT_TARGET_NUM_HITS = 10;
@@ -194,6 +198,7 @@ public class YqlParser implements Parser {
private Query userQuery;
private Parsable currentlyParsing;
private IndexFacts.Session indexFactsSession;
+ private IndexNameExpander indexNameExpander = new IndexNameExpander();
private Set<String> docTypes;
private Sorting sorting;
private String segmenterBackend;
@@ -534,14 +539,28 @@ public class YqlParser implements Parser {
return leafStyleSettings(ast, out);
}
+ private static class PrefixExpander extends IndexNameExpander {
+ private final String prefix;
+ public PrefixExpander(String prefix) {
+ this.prefix = prefix + ".";
+ }
+
+ @Override
+ public String expand(String leaf) {
+ return prefix + leaf;
+ }
+ }
@NonNull
private Item instantiateSameElementItem(String field, OperatorNode<ExpressionOperator> ast) {
assertHasFunctionName(ast, SAME_ELEMENT);
SameElementItem sameElement = new SameElementItem(field);
- for (OperatorNode<ExpressionOperator> word : ast.<List<OperatorNode<ExpressionOperator>>> getArgument(1)) {
- sameElement.addItem(buildTermSearch(word));
+ // All terms below sameElement are relative to this.
+ IndexNameExpander prev = swapIndexCreator(new PrefixExpander(field));
+ for (OperatorNode<ExpressionOperator> term : ast.<List<OperatorNode<ExpressionOperator>>> getArgument(1)) {
+ sameElement.addItem(convertExpression(term));
}
+ swapIndexCreator(prev);
return sameElement;
}
@@ -1619,21 +1638,25 @@ public class YqlParser implements Parser {
}
}
+ private IndexNameExpander swapIndexCreator(IndexNameExpander newExpander) {
+ IndexNameExpander old = indexNameExpander;
+ indexNameExpander = newExpander;
+ return old;
+ }
@NonNull
private String getIndex(OperatorNode<ExpressionOperator> operatorNode) {
String index = fetchFieldRead(operatorNode);
- Preconditions.checkArgument(indexFactsSession.isIndex(index), "Field '%s' does not exist.", index);
+ String expanded = indexNameExpander.expand(index);
+ Preconditions.checkArgument(indexFactsSession.isIndex(expanded), "Field '%s' does not exist.", expanded);
return indexFactsSession.getCanonicName(index);
}
private Substring getOrigin(OperatorNode<ExpressionOperator> ast) {
- Map<?, ?> origin = getAnnotation(ast, ORIGIN, Map.class, null,
- ORIGIN_DESCRIPTION);
+ Map<?, ?> origin = getAnnotation(ast, ORIGIN, Map.class, null, ORIGIN_DESCRIPTION);
if (origin == null) {
return null;
}
- String original = getMapValue(ORIGIN, origin, ORIGIN_ORIGINAL,
- String.class);
+ String original = getMapValue(ORIGIN, origin, ORIGIN_ORIGINAL, String.class);
int offset = getMapValue(ORIGIN, origin, ORIGIN_OFFSET, Integer.class);
int length = getMapValue(ORIGIN, origin, ORIGIN_LENGTH, Integer.class);
return new Substring(offset, length + offset, original);
diff --git a/container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java b/container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java
index 9d04dc545e1..ac1969701ca 100644
--- a/container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java
+++ b/container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java
@@ -264,6 +264,8 @@ public class YqlParserTestCase {
public void testSameElement() {
assertParse("select foo from bar where baz contains sameElement(f1 contains \"a\", f2 contains \"b\");",
"baz:{f1:a f2:b}");
+ assertParse("select foo from bar where baz contains sameElement(f1 contains \"a\", f2 = 10);",
+ "baz:{f1:a f2:10}");
}
@Test