summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java12
-rw-r--r--container-search/src/main/java/com/yahoo/search/yql/YqlParser.java21
-rw-r--r--container-search/src/test/java/com/yahoo/search/yql/VespaSerializerTestCase.java5
-rw-r--r--container-search/src/test/java/com/yahoo/search/yql/YqlParserTestCase.java5
4 files changed, 38 insertions, 5 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java b/container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java
index decdaae3a0f..012f427a781 100644
--- a/container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java
+++ b/container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java
@@ -69,6 +69,7 @@ import com.yahoo.prelude.query.AndSegmentItem;
import com.yahoo.prelude.query.BoolItem;
import com.yahoo.prelude.query.DotProductItem;
import com.yahoo.prelude.query.EquivItem;
+import com.yahoo.prelude.query.FalseItem;
import com.yahoo.prelude.query.ExactStringItem;
import com.yahoo.prelude.query.IndexedItem;
import com.yahoo.prelude.query.IntItem;
@@ -483,6 +484,16 @@ public class VespaSerializer {
}
+ private static class FalseSerializer extends Serializer<FalseItem> {
+ @Override
+ void onExit(StringBuilder destination, FalseItem item) { }
+ @Override
+ boolean serialize(StringBuilder destination, FalseItem item) {
+ destination.append("false");
+ return false;
+ }
+ }
+
private static class RegExpSerializer extends Serializer<RegExpItem> {
@Override
@@ -1194,6 +1205,7 @@ public class VespaSerializer {
dispatchBuilder.put(IntItem.class, new NumberSerializer());
dispatchBuilder.put(GeoLocationItem.class, new GeoLocationSerializer());
dispatchBuilder.put(BoolItem.class, new BoolSerializer());
+ dispatchBuilder.put(FalseItem.class, new FalseSerializer());
dispatchBuilder.put(MarkerWordItem.class, new WordSerializer()); // gotcha
dispatchBuilder.put(NearItem.class, new NearSerializer());
dispatchBuilder.put(NearestNeighborItem.class, new NearestNeighborSerializer());
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 cdfcef7e2a9..fa2b9fd14e7 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
@@ -33,6 +33,7 @@ import com.yahoo.prelude.query.BoolItem;
import com.yahoo.prelude.query.CompositeItem;
import com.yahoo.prelude.query.DotProductItem;
import com.yahoo.prelude.query.EquivItem;
+import com.yahoo.prelude.query.FalseItem;
import com.yahoo.prelude.query.ExactStringItem;
import com.yahoo.prelude.query.IntItem;
import com.yahoo.prelude.query.Item;
@@ -151,12 +152,12 @@ public class YqlParser implements Parser {
public static final String CONNECTION_WEIGHT = "weight";
public static final String CONNECTIVITY = "connectivity";
public static final String DISTANCE = "distance";
+ public static final String DISTANCE_THRESHOLD = "distanceThreshold";
public static final String DOT_PRODUCT = "dotProduct";
public static final String EQUIV = "equiv";
public static final String FILTER = "filter";
public static final String GEO_LOCATION = "geoLocation";
public static final String HIT_LIMIT = "hitLimit";
- public static final String DISTANCE_THRESHOLD = "distanceThreshold";
public static final String HNSW_EXPLORE_ADDITIONAL_HITS = "hnsw.exploreAdditionalHits";
public static final String IMPLICIT_TRANSFORMS = "implicitTransforms";
public static final String LABEL = "label";
@@ -164,16 +165,16 @@ public class YqlParser implements Parser {
public static final String NEAREST_NEIGHBOR = "nearestNeighbor";
public static final String NORMALIZE_CASE = "normalizeCase";
public static final String ONEAR = "onear";
+ public static final String ORIGIN = "origin";
public static final String ORIGIN_LENGTH = "length";
public static final String ORIGIN_OFFSET = "offset";
- public static final String ORIGIN = "origin";
public static final String ORIGIN_ORIGINAL = "original";
public static final String PHRASE = "phrase";
public static final String PREDICATE = "predicate";
public static final String PREFIX = "prefix";
public static final String RANGE = "range";
- public static final String RANKED = "ranked";
public static final String RANK = "rank";
+ public static final String RANKED = "ranked";
public static final String SAME_ELEMENT = "sameElement";
public static final String SCORE_THRESHOLD = "scoreThreshold";
public static final String SIGNIFICANCE = "significance";
@@ -184,12 +185,12 @@ public class YqlParser implements Parser {
public static final String TARGET_NUM_HITS = "targetNumHits";
public static final String THRESHOLD_BOOST_FACTOR = "thresholdBoostFactor";
public static final String UNIQUE_ID = "id";
+ public static final String URI = "uri";
public static final String USE_POSITION_DATA = "usePositionData";
public static final String WAND = "wand";
public static final String WEAK_AND = "weakAnd";
- public static final String WEIGHTED_SET = "weightedSet";
public static final String WEIGHT = "weight";
- public static final String URI = "uri";
+ public static final String WEIGHTED_SET = "weightedSet";
private final IndexFacts indexFacts;
private final List<ConnectedItem> connectedItems = new ArrayList<>();
@@ -352,6 +353,8 @@ public class YqlParser implements Parser {
return buildRegExpSearch(ast);
case CALL:
return buildFunctionCall(ast);
+ case LITERAL:
+ return buildLiteral(ast);
default:
throw newUnexpectedArgumentException(ast.getOperator(),
ExpressionOperator.AND, ExpressionOperator.CALL,
@@ -445,6 +448,14 @@ public class YqlParser implements Parser {
return item;
}
+ private Item buildLiteral(OperatorNode<ExpressionOperator> ast) {
+ var literal = ast.getArgument(0);
+ if (Boolean.FALSE.equals(literal)) {
+ return new FalseItem();
+ }
+ throw newUnexpectedArgumentException(literal, Boolean.FALSE);
+ }
+
private Item buildNearestNeighbor(OperatorNode<ExpressionOperator> ast) {
List<OperatorNode<ExpressionOperator>> args = ast.getArgument(1);
Preconditions.checkArgument(args.size() == 2, "Expected 2 arguments, got %s.", args.size());
diff --git a/container-search/src/test/java/com/yahoo/search/yql/VespaSerializerTestCase.java b/container-search/src/test/java/com/yahoo/search/yql/VespaSerializerTestCase.java
index 92c947b0989..308907df6b4 100644
--- a/container-search/src/test/java/com/yahoo/search/yql/VespaSerializerTestCase.java
+++ b/container-search/src/test/java/com/yahoo/search/yql/VespaSerializerTestCase.java
@@ -143,6 +143,11 @@ public class VespaSerializerTestCase {
}
@Test
+ public void testFalse() {
+ parseAndConfirm("false");
+ }
+
+ @Test
public void testNumbers() {
parseAndConfirm("title = 500");
parseAndConfirm("title > 500");
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 1010c43c2be..e7cba25d1ed 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
@@ -592,6 +592,11 @@ public class YqlParserTestCase {
}
@Test
+ public void testFalse() {
+ assertParse("select foo from bar where false;", "FALSE");
+ }
+
+ @Test
public void testPredicate() {
assertParse("select foo from bar where predicate(predicate_field, " +
"{\"gender\":\"male\", \"hobby\":[\"music\", \"hiking\"]}, {\"age\":23L});",