summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@verizonmedia.com>2019-11-29 14:12:31 +0100
committerJon Bratseth <bratseth@verizonmedia.com>2019-11-29 14:12:31 +0100
commit29b03a9b6eb3887bce0d7d8a86dddce92d830cd9 (patch)
treeab3c7462c117e65a82a5969f8a7637ac4a21aef0
parentce07c34e31babbccc9a005d990f32c8b355af1a0 (diff)
Preserve single-feature embraces
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java4
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/derived/RawRankProfile.java2
-rw-r--r--config-model/src/test/derived/tensor/rank-profiles.cfg17
-rw-r--r--config-model/src/test/derived/tensor/tensor.sd12
-rwxr-xr-xsearchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/EmbracedNode.java2
-rwxr-xr-xsearchlib/src/test/java/com/yahoo/searchlib/rankingexpression/RankingExpressionTestCase.java2
-rw-r--r--searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/evaluation/EvaluationTestCase.java3
-rw-r--r--vespajlib/abi-spec.json1
-rw-r--r--vespajlib/src/main/java/com/yahoo/tensor/functions/Value.java32
-rw-r--r--vespajlib/src/test/java/com/yahoo/tensor/functions/ValueTestCase.java9
10 files changed, 60 insertions, 24 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java b/config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java
index bf585df9005..271442768a8 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java
@@ -53,8 +53,8 @@ public class RankProfileRegistry {
if (existingRangProfileWithSameName == null) return;
if ( ! overridableRankProfileNames.contains(rankProfileName)) {
- throw new IllegalArgumentException("Cannot add rank profile '" + rankProfileName + "' in search definition '"
- + rankProfile.getSearch().getName() + "', since it already exists");
+ throw new IllegalArgumentException("Duplicate rank profile '" + rankProfileName + "' in " +
+ rankProfile.getSearch());
}
}
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/derived/RawRankProfile.java b/config-model/src/main/java/com/yahoo/searchdefinition/derived/RawRankProfile.java
index 6192db2654e..b075bce7eaf 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/derived/RawRankProfile.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/derived/RawRankProfile.java
@@ -324,7 +324,7 @@ public class RawRankProfile implements RankProfilesConfig.Producer {
try {
firstPhaseRanking = new RankingExpression(property.getValue());
} catch (ParseException e) {
- throw new IllegalArgumentException("Could not parse second phase expression", e);
+ throw new IllegalArgumentException("Could not parse first phase expression", e);
}
}
else if ("rankingExpression(secondphase).rankingScript".equals(property.getName())) {
diff --git a/config-model/src/test/derived/tensor/rank-profiles.cfg b/config-model/src/test/derived/tensor/rank-profiles.cfg
index cebfa244159..e7b946e4929 100644
--- a/config-model/src/test/derived/tensor/rank-profiles.cfg
+++ b/config-model/src/test/derived/tensor/rank-profiles.cfg
@@ -112,7 +112,7 @@ rankprofile[].fef.property[].name "vespa.type.attribute.f5"
rankprofile[].fef.property[].value "tensor<float>(x[10])"
rankprofile[].name "profile7"
rankprofile[].fef.property[].name "rankingExpression(reshaped).rankingScript"
-rankprofile[].fef.property[].value "tensor<float>(d0[1],x[2])({x:1 - x, y:d0})"
+rankprofile[].fef.property[].value "tensor<float>(d0[1],x[2])(attribute(f2){x:1 - x, y:d0})"
rankprofile[].fef.property[].name "rankingExpression(reshaped).type"
rankprofile[].fef.property[].value "tensor<float>(d0[1],x[2])"
rankprofile[].fef.property[].name "vespa.rank.firstphase"
@@ -127,3 +127,18 @@ rankprofile[].fef.property[].name "vespa.type.attribute.f4"
rankprofile[].fef.property[].value "tensor(x[10],y[20])"
rankprofile[].fef.property[].name "vespa.type.attribute.f5"
rankprofile[].fef.property[].value "tensor<float>(x[10])"
+rankprofile[].name "profile8"
+rankprofile[].fef.property[].name "rankingExpression(functionNotLabel).rankingScript"
+rankprofile[].fef.property[].value "3"
+rankprofile[].fef.property[].name "vespa.rank.firstphase"
+rankprofile[].fef.property[].value "rankingExpression(firstphase)"
+rankprofile[].fef.property[].name "rankingExpression(firstphase).rankingScript"
+rankprofile[].fef.property[].value "reduce(tensor(d0[1])(attribute{x:(functionNotLabel)}), sum)"
+rankprofile[].fef.property[].name "vespa.type.attribute.f2"
+rankprofile[].fef.property[].value "tensor<float>(x[2],y[1])"
+rankprofile[].fef.property[].name "vespa.type.attribute.f3"
+rankprofile[].fef.property[].value "tensor(x{})"
+rankprofile[].fef.property[].name "vespa.type.attribute.f4"
+rankprofile[].fef.property[].value "tensor(x[10],y[20])"
+rankprofile[].fef.property[].name "vespa.type.attribute.f5"
+rankprofile[].fef.property[].value "tensor<float>(x[10])"
diff --git a/config-model/src/test/derived/tensor/tensor.sd b/config-model/src/test/derived/tensor/tensor.sd
index 15d56517a43..aac17668c01 100644
--- a/config-model/src/test/derived/tensor/tensor.sd
+++ b/config-model/src/test/derived/tensor/tensor.sd
@@ -90,4 +90,16 @@ search tensor {
}
+ rank-profile profile8 {
+
+ first-phase {
+ expression: sum(tensor(d0[1])(attribute{x:(functionNotLabel)}))
+ }
+
+ function functionNotLabel() {
+ expression: 3
+ }
+
+ }
+
}
diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/EmbracedNode.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/EmbracedNode.java
index d306e067d16..dd1ef263cba 100755
--- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/EmbracedNode.java
+++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/EmbracedNode.java
@@ -40,8 +40,6 @@ public final class EmbracedNode extends CompositeNode {
@Override
public StringBuilder toString(StringBuilder string, SerializationContext context, Deque<String> path, CompositeNode parent) {
- if (value instanceof ReferenceNode)
- return value.toString(string, context, path, this);
return value.toString(string.append('('), context, path, this).append(')');
}
diff --git a/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/RankingExpressionTestCase.java b/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/RankingExpressionTestCase.java
index 26fcec9efba..274cb0b567e 100755
--- a/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/RankingExpressionTestCase.java
+++ b/searchlib/src/test/java/com/yahoo/searchlib/rankingexpression/RankingExpressionTestCase.java
@@ -245,7 +245,7 @@ public class RankingExpressionTestCase {
@Test
public void testNonCanonicalLegalStrings() throws ParseException {
- assertParse("a * b + c * d", "a* (b) + \nc*d");
+ assertParse("a * (b) + c * d", "a* (b) + \nc*d");
}
@Test
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 99047aeb79d..376fbc85d6d 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
@@ -367,6 +367,9 @@ public class EvaluationTestCase {
tester.assertEvaluates("tensor(j[2]):[6, 5]",
"tensor(j[2])(tensor0{key:bar,i:2-j})",
"tensor(key{},i[5]):{{key:foo,i:0}:1,{key:foo,i:1}:2,{key:foo,i:2}:2,{key:bar,i:0}:4,{key:bar,i:1}:5,{key:bar,i:2}:6}");
+ tester.assertEvaluates("5.5",
+ "sum(tensor(d0[1])(tensor0{x:mykey}))",
+ "tensor(x{}):{{x:mykey}:5.5}");
// tensor result dimensions are given from argument dimensions, not the resulting values
tester.assertEvaluates("tensor(x{}):{}", "tensor0 * tensor1", "{ {x:0}:1 }", "tensor(x{}):{ {x:1}:1 }");
diff --git a/vespajlib/abi-spec.json b/vespajlib/abi-spec.json
index 59474021de2..cefdbb09b7a 100644
--- a/vespajlib/abi-spec.json
+++ b/vespajlib/abi-spec.json
@@ -2544,7 +2544,6 @@
"public com.yahoo.tensor.Tensor evaluate(com.yahoo.tensor.evaluation.EvaluationContext)",
"public com.yahoo.tensor.TensorType type(com.yahoo.tensor.evaluation.TypeContext)",
"public java.lang.String toString(com.yahoo.tensor.functions.ToStringContext)",
- "public java.lang.String toString()",
"public bridge synthetic com.yahoo.tensor.functions.TensorFunction withArguments(java.util.List)"
],
"fields": []
diff --git a/vespajlib/src/main/java/com/yahoo/tensor/functions/Value.java b/vespajlib/src/main/java/com/yahoo/tensor/functions/Value.java
index cb14711c0dd..fff9862279c 100644
--- a/vespajlib/src/main/java/com/yahoo/tensor/functions/Value.java
+++ b/vespajlib/src/main/java/com/yahoo/tensor/functions/Value.java
@@ -47,7 +47,7 @@ public class Value<NAMETYPE extends Name> extends PrimitiveTensorFunction<NAMETY
public Value<NAMETYPE> withArguments(List<TensorFunction<NAMETYPE>> arguments) {
if (arguments.size() != 1)
throw new IllegalArgumentException("Value takes exactly one argument but got " + arguments.size());
- return new Value<NAMETYPE>(arguments.get(0), cellAddress);
+ return new Value<>(arguments.get(0), cellAddress);
}
@Override
@@ -78,20 +78,17 @@ public class Value<NAMETYPE extends Name> extends PrimitiveTensorFunction<NAMETY
@Override
public String toString(ToStringContext context) {
- return toString();
- }
-
- @Override
- public String toString() {
+ StringBuilder b = new StringBuilder(argument.toString());
if (cellAddress.size() == 1 && cellAddress.get(0).dimension().isEmpty()) {
if (cellAddress.get(0).index().isPresent())
- return "[" + cellAddress.get(0).index().get() + "]";
+ b.append("[").append(cellAddress.get(0).index().get()).append("]");
else
- return "{" + cellAddress.get(0).label() + "}";
+ b.append("{").append(cellAddress.get(0).label()).append("}");
}
else {
- return "{" + cellAddress.stream().map(i -> i.toString()).collect(Collectors.joining(", ")) + "}";
+ b.append("{").append(cellAddress.stream().map(i -> i.toString()).collect(Collectors.joining(", "))).append("}");
}
+ return b.toString();
}
public static class DimensionValue<NAMETYPE extends Name> {
@@ -109,11 +106,11 @@ public class Value<NAMETYPE extends Name> extends PrimitiveTensorFunction<NAMETY
}
public DimensionValue(String dimension, int index) {
- this(Optional.of(dimension), null, new ConstantScalarFunction<>(index));
+ this(Optional.of(dimension), null, new ConstantIntegerFunction<>(index));
}
public DimensionValue(int index) {
- this(Optional.empty(), null, new ConstantScalarFunction<>(index));
+ this(Optional.empty(), null, new ConstantIntegerFunction<>(index));
}
public DimensionValue(String label) {
@@ -167,19 +164,22 @@ public class Value<NAMETYPE extends Name> extends PrimitiveTensorFunction<NAMETY
}
- private static class ConstantScalarFunction<NAMETYPE extends Name> implements ScalarFunction<NAMETYPE> {
+ private static class ConstantIntegerFunction<NAMETYPE extends Name> implements ScalarFunction<NAMETYPE> {
- private final Double value;
+ private final int value;
- public ConstantScalarFunction(int value) {
- this.value = (double)value;
+ public ConstantIntegerFunction(int value) {
+ this.value = value;
}
@Override
public Double apply(EvaluationContext<NAMETYPE> context) {
- return value;
+ return (double)value;
}
+ @Override
+ public String toString() { return String.valueOf(value); }
+
}
}
diff --git a/vespajlib/src/test/java/com/yahoo/tensor/functions/ValueTestCase.java b/vespajlib/src/test/java/com/yahoo/tensor/functions/ValueTestCase.java
index 7127abde016..227fbffbaa8 100644
--- a/vespajlib/src/test/java/com/yahoo/tensor/functions/ValueTestCase.java
+++ b/vespajlib/src/test/java/com/yahoo/tensor/functions/ValueTestCase.java
@@ -63,4 +63,13 @@ public class ValueTestCase {
}
}
+ @Test
+ public void testToString() {
+ Tensor input = Tensor.from("tensor(key[3]):[1.1, 2.2, 3.3]");
+ assertEquals("tensor(key[3]):[1.1, 2.2, 3.3][2]",
+ new Value<>(new ConstantTensor<>(input),
+ List.of(new Value.DimensionValue<>(2)))
+ .toString());
+ }
+
}