diff options
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()); + } + } |