summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@verizonmedia.com>2019-12-17 13:19:49 +0100
committerJon Bratseth <bratseth@verizonmedia.com>2019-12-17 13:19:49 +0100
commit988b1cb658b65a4d880f1bc70201a58fd1dee9e4 (patch)
treea096503ddbfca544ec457a81518356a3ad574900 /searchlib
parentc589718d26f2b89875acfdd90433832292e6bca2 (diff)
Parse quoted tensor labels in ranking expressions
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/abi-spec.json2
-rwxr-xr-xsearchlib/src/main/javacc/RankingExpressionParser.jj20
-rw-r--r--searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java9
3 files changed, 25 insertions, 6 deletions
diff --git a/searchlib/abi-spec.json b/searchlib/abi-spec.json
index bde3b6abb6c..ff6c1ad0b9d 100644
--- a/searchlib/abi-spec.json
+++ b/searchlib/abi-spec.json
@@ -925,6 +925,8 @@
"public final void labelAndDimensionValues(java.util.List)",
"public final java.util.List valueAddress()",
"public final com.yahoo.tensor.functions.Slice$DimensionValue dimensionValue(java.util.Optional)",
+ "public final java.lang.String label()",
+ "public final java.lang.String string()",
"public void <init>(java.io.InputStream)",
"public void <init>(java.io.InputStream, java.lang.String)",
"public void ReInit(java.io.InputStream)",
diff --git a/searchlib/src/main/javacc/RankingExpressionParser.jj b/searchlib/src/main/javacc/RankingExpressionParser.jj
index e413e398183..c3d597fca46 100755
--- a/searchlib/src/main/javacc/RankingExpressionParser.jj
+++ b/searchlib/src/main/javacc/RankingExpressionParser.jj
@@ -894,7 +894,7 @@ void keyValue(TensorType type, java.util.Map cellMap) :
ExpressionNode value;
}
{
- label = tag() <COLON> value = expression()
+ label = label() <COLON> value = expression()
{ cellMap.put(TensorAddress.ofLabels(label), TensorFunctionNode.wrapScalar(value)); }
}
@@ -904,7 +904,7 @@ void mixedBlock(TensorType type, List dimensionOrder, java.util.Map cellMap) :
List cells;
}
{
- label = tag() <COLON> cells = indexedTensorCells()
+ label = label() <COLON> cells = indexedTensorCells()
{ TensorFunctionNode.wrapScalarBlock(type, dimensionOrder, label, cells, cellMap); }
}
@@ -952,7 +952,7 @@ void labelAndDimension(TensorAddress.Builder addressBuilder) :
String dimension, label;
}
{
- dimension = identifier() <COLON> label = tag()
+ dimension = identifier() <COLON> label = label()
{ addressBuilder.add(dimension, label); }
}
@@ -1000,4 +1000,18 @@ Slice.DimensionValue dimensionValue(Optional dimensionName) :
else
return new Slice.DimensionValue(dimensionName, TensorFunctionNode.wrapScalar(value));
}
+}
+
+String label() :
+{
+ String label;
+}
+{
+ ( label = tag() | label = string() )
+ { return label; }
+}
+
+String string() : {}
+{
+ <STRING> { return token.image.substring(1, token.image.length() - 1); }
} \ No newline at end of file
diff --git a/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java b/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java
index 26861dd3cd6..642ef8b873b 100644
--- a/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java
+++ b/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java
@@ -401,6 +401,9 @@ public class EvaluationTestCase {
tester.assertEvaluates("tensor(x{}):{ {x:a}:6.0, {x:b}:4.0, {x:c}:14.0 }",
"tensor(x{}):{ {x:a}:1+2+3, {x:b}:if(1>2,3,4), {x:c}:sum(tensor0*tensor1) }",
"{ {x:0}:7 }", "tensor(x{}):{ {x:0}:2 }");
+ tester.assertEvaluates("tensor(x{}):{ {x:a}:6.0, {x:b}:4.0, {x:'--'}:14.0 }",
+ "tensor(x{}):{ a:1+2+3, b:if(1>2,3,4), '--':sum(tensor0*tensor1) }",
+ "{ {x:0}:7 }", "tensor(x{}):{ {x:0}:2 }");
tester.assertEvaluates("tensor<float>(d0[1],x[3]):[[1.0, 0.5, 0.25]]",
"tensor<float>(d0[1],x[3]):[[one,one_half,a_quarter]]");
tester.assertEvaluates("tensor(x[2],y[3]):[[1.0, 0.5, 0.25],[0.25, 0.5, 1.0]]",
@@ -410,10 +413,10 @@ public class EvaluationTestCase {
tester.assertEvaluates("tensor(x{},y[2]):{a:[1.0, 0.5], b:[0.25, 2]}",
"tensor(x{},y[2]):{a:[one, one_half], b:[a_quarter, 2]}");
tester.assertEvaluates("tensor(key{},x[2],y[3]):{key1:[[1.0, 0.5, 0.25],[0.25, 0.5, 1.0]]," +
- " key2:[[1.0, 2.0, 3.00],[4.00, 5.0, 6.0]]}",
+ " 'key2.[]':[[1.0, 2.0, 3.00],[4.00, 5.0, 6.0]]}",
"tensor(key{},x[2],y[3]):{key1:[[one,one_half,a_quarter],[a_quarter,one_half,one]]," +
- " key2:[[1,2,3],[4,5,6]]}");
- tester.assertEvaluates("tensor(x{}):{{x:a}:1, {x:b}:-2, {x:cee}:0.5}", "tensor(x{}):{a:1, b:-2, cee:one_half}");
+ " 'key2.[]':[[1,2,3],[4,5,6]]}");
+ tester.assertEvaluates("tensor(x{}):{{x:a}:1, {x:'\"'}:-2, {x:\"'\"}:0.5}", "tensor(x{}):{a:1, '\"':-2, \"'\":one_half}");
// Opposite order in the expression:
// - indexed