summaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@vespa.ai>2023-09-27 17:28:13 +0200
committerJon Bratseth <bratseth@vespa.ai>2023-09-27 17:28:13 +0200
commit12f9d93fd13a74eb022e8ef0633ff3b1456d345b (patch)
tree82372d0c09dc09dedf9f55bf4290b2e12bbc3cb0 /config-model
parentb4af421142168c36cc1e8c9bae735731a68fcb20 (diff)
Return the expected output
In if-else expressions, return the output of the executed branch rather than the input. The current behavior was undocumented and quite unexpected, so I suggest we treat that as a bug. Also return the last executed expression in a script as its output (rather than nothing. In addition, improve some error messages.
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/schema/document/SDField.java9
-rw-r--r--config-model/src/main/java/com/yahoo/schema/processing/IndexingInputs.java24
-rw-r--r--config-model/src/main/java/com/yahoo/schema/processing/IndexingValidation.java4
-rw-r--r--config-model/src/main/java/com/yahoo/schema/processing/PredicateProcessor.java8
-rw-r--r--config-model/src/test/java/com/yahoo/schema/AttributeSettingsTestCase.java2
-rw-r--r--config-model/src/test/java/com/yahoo/schema/processing/IndexingInputsTestCase.java62
6 files changed, 84 insertions, 25 deletions
diff --git a/config-model/src/main/java/com/yahoo/schema/document/SDField.java b/config-model/src/main/java/com/yahoo/schema/document/SDField.java
index 7821c101880..6cbdb38b9bc 100644
--- a/config-model/src/main/java/com/yahoo/schema/document/SDField.java
+++ b/config-model/src/main/java/com/yahoo/schema/document/SDField.java
@@ -196,6 +196,8 @@ public class SDField extends Field implements TypedKey, ImmutableSDField {
return isExtraField;
}
+ public boolean isDocumentField() { return ! isExtraField; }
+
@Override
public boolean isImportedField() {
return false;
@@ -613,11 +615,8 @@ public class SDField extends Field implements TypedKey, ImmutableSDField {
@Override
public RankType getRankType() { return this.rankType; }
- /**
- * Returns the search-time attribute settings of this field or null if none is set.
- *
- * <p>TODO: Make unmodifiable.</p>
- */
+ /** Returns the search-time attribute settings of this field or null if none is set. */
+ // TODO: Make unmodifiable
@Override
public Map<String, Attribute> getAttributes() { return attributes; }
diff --git a/config-model/src/main/java/com/yahoo/schema/processing/IndexingInputs.java b/config-model/src/main/java/com/yahoo/schema/processing/IndexingInputs.java
index 985ec8653c7..0537f1704ab 100644
--- a/config-model/src/main/java/com/yahoo/schema/processing/IndexingInputs.java
+++ b/config-model/src/main/java/com/yahoo/schema/processing/IndexingInputs.java
@@ -31,9 +31,8 @@ public class IndexingInputs extends Processor {
ScriptExpression script = field.getIndexingScript();
if (script == null) continue;
- String fieldName = field.getName();
- script = (ScriptExpression)new DefaultToCurrentField(fieldName).convert(script);
- script = (ScriptExpression)new EnsureInputExpression(fieldName).convert(script);
+ script = (ScriptExpression)new DefaultToCurrentField(field).convert(script);
+ script = (ScriptExpression)new EnsureInputExpression(field).convert(script);
if (validate)
new VerifyInputExpression(schema, field).visit(script);
@@ -43,10 +42,10 @@ public class IndexingInputs extends Processor {
private static class DefaultToCurrentField extends ExpressionConverter {
- final String fieldName;
+ final SDField field;
- DefaultToCurrentField(String fieldName) {
- this.fieldName = fieldName;
+ DefaultToCurrentField(SDField field) {
+ this.field = field;
}
@Override
@@ -56,27 +55,28 @@ public class IndexingInputs extends Processor {
@Override
protected Expression doConvert(Expression exp) {
- return new InputExpression(fieldName);
+ return new InputExpression(field.getName());
}
}
private static class EnsureInputExpression extends ExpressionConverter {
- final String fieldName;
+ final SDField field;
- EnsureInputExpression(String fieldName) {
- this.fieldName = fieldName;
+ EnsureInputExpression(SDField field) {
+ this.field = field;
}
@Override
protected boolean shouldConvert(Expression exp) {
- return exp instanceof StatementExpression;
+ return exp instanceof StatementExpression
+ && ( field.isDocumentField() || ( field.getAttribute() != null && field.getAttribute().isMutable()));
}
@Override
protected Expression doConvert(Expression exp) {
if (exp.requiredInputType() != null) {
- return new StatementExpression(new InputExpression(fieldName), exp);
+ return new StatementExpression(new InputExpression(field.getName()), exp);
} else {
return exp;
}
diff --git a/config-model/src/main/java/com/yahoo/schema/processing/IndexingValidation.java b/config-model/src/main/java/com/yahoo/schema/processing/IndexingValidation.java
index 3c7e9b4066f..d2fb16264a0 100644
--- a/config-model/src/main/java/com/yahoo/schema/processing/IndexingValidation.java
+++ b/config-model/src/main/java/com/yahoo/schema/processing/IndexingValidation.java
@@ -24,6 +24,7 @@ import com.yahoo.vespa.indexinglanguage.expressions.SummaryExpression;
import com.yahoo.vespa.indexinglanguage.expressions.VerificationContext;
import com.yahoo.vespa.indexinglanguage.expressions.VerificationException;
import com.yahoo.vespa.model.container.search.QueryProfiles;
+import com.yahoo.yolean.Exceptions;
import java.util.HashSet;
import java.util.Set;
@@ -51,7 +52,8 @@ public class IndexingValidation extends Processor {
converter.convert(exp); // TODO: stop doing this explicitly when visiting a script does not branch
}
} catch (VerificationException e) {
- fail(schema, field, "For expression '" + e.getExpression() + "': " + e.getMessage());
+ e.printStackTrace();
+ fail(schema, field, "For expression '" + e.getExpression() + "': " + Exceptions.toMessageString(e));
}
}
}
diff --git a/config-model/src/main/java/com/yahoo/schema/processing/PredicateProcessor.java b/config-model/src/main/java/com/yahoo/schema/processing/PredicateProcessor.java
index 0362dc39c4c..1627320dc54 100644
--- a/config-model/src/main/java/com/yahoo/schema/processing/PredicateProcessor.java
+++ b/config-model/src/main/java/com/yahoo/schema/processing/PredicateProcessor.java
@@ -15,11 +15,11 @@ import com.yahoo.vespa.documentmodel.DocumentSummary;
import com.yahoo.vespa.documentmodel.SummaryField;
import com.yahoo.vespa.documentmodel.SummaryTransform;
import com.yahoo.vespa.indexinglanguage.ExpressionConverter;
+import com.yahoo.vespa.indexinglanguage.expressions.ConstantExpression;
import com.yahoo.vespa.indexinglanguage.expressions.Expression;
import com.yahoo.vespa.indexinglanguage.expressions.OptimizePredicateExpression;
import com.yahoo.vespa.indexinglanguage.expressions.OutputExpression;
import com.yahoo.vespa.indexinglanguage.expressions.ScriptExpression;
-import com.yahoo.vespa.indexinglanguage.expressions.SetValueExpression;
import com.yahoo.vespa.indexinglanguage.expressions.SetVarExpression;
import com.yahoo.vespa.indexinglanguage.expressions.StatementExpression;
import com.yahoo.vespa.model.container.search.QueryProfiles;
@@ -112,14 +112,14 @@ public class PredicateProcessor extends Processor {
private Expression makeSetPredicateVariablesScript(BooleanIndexDefinition options) {
List<Expression> expressions = new ArrayList<>();
- expressions.add(new SetValueExpression(new IntegerFieldValue(options.getArity())));
+ expressions.add(new ConstantExpression(new IntegerFieldValue(options.getArity())));
expressions.add(new SetVarExpression("arity"));
if (options.hasLowerBound()) {
- expressions.add(new SetValueExpression(new LongFieldValue(options.getLowerBound())));
+ expressions.add(new ConstantExpression(new LongFieldValue(options.getLowerBound())));
expressions.add(new SetVarExpression("lower_bound"));
}
if (options.hasUpperBound()) {
- expressions.add(new SetValueExpression(new LongFieldValue(options.getUpperBound())));
+ expressions.add(new ConstantExpression(new LongFieldValue(options.getUpperBound())));
expressions.add(new SetVarExpression("upper_bound"));
}
return new StatementExpression(expressions);
diff --git a/config-model/src/test/java/com/yahoo/schema/AttributeSettingsTestCase.java b/config-model/src/test/java/com/yahoo/schema/AttributeSettingsTestCase.java
index 3ca182e18c2..db862dd388e 100644
--- a/config-model/src/test/java/com/yahoo/schema/AttributeSettingsTestCase.java
+++ b/config-model/src/test/java/com/yahoo/schema/AttributeSettingsTestCase.java
@@ -21,7 +21,7 @@ import static org.junit.jupiter.api.Assertions.*;
/**
* Attribute settings
*
- * @author bratseth
+ * @author bratseth
*/
public class AttributeSettingsTestCase extends AbstractSchemaTestCase {
diff --git a/config-model/src/test/java/com/yahoo/schema/processing/IndexingInputsTestCase.java b/config-model/src/test/java/com/yahoo/schema/processing/IndexingInputsTestCase.java
index d420623f233..0e6744ba8f9 100644
--- a/config-model/src/test/java/com/yahoo/schema/processing/IndexingInputsTestCase.java
+++ b/config-model/src/test/java/com/yahoo/schema/processing/IndexingInputsTestCase.java
@@ -1,12 +1,15 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.schema.processing;
+import com.yahoo.schema.ApplicationBuilder;
import com.yahoo.schema.parser.ParseException;
+import com.yahoo.yolean.Exceptions;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import static com.yahoo.schema.processing.AssertSearchBuilder.assertBuildFails;
+import static org.junit.jupiter.api.Assertions.assertEquals;
/**
* @author Simon Thoresen Hult
@@ -24,8 +27,8 @@ public class IndexingInputsTestCase {
@Test
void requireThatExtraFieldInputImplicitThrows() throws IOException, ParseException {
assertBuildFails("src/test/examples/indexing_extra_field_input_implicit.sd",
- "For schema 'indexing_extra_field_input_implicit', field 'foo': Indexing script refers to " +
- "field 'foo' which is neither a field in document type 'indexing_extra_field_input_implicit' nor a mutable attribute");
+ "For schema 'indexing_extra_field_input_implicit', field 'foo': " +
+ "For expression '{ tokenize normalize stem:\"BEST\" | index foo; }': Expected string input, but no input is specified");
}
@Test
@@ -42,4 +45,59 @@ public class IndexingInputsTestCase {
"'foo' which is neither a field in document type 'indexing_extra_field_input_self' nor a mutable attribute");
}
+ @Test
+ void testPlainInputInDerivedField() throws ParseException {
+ var schema = """
+ schema test {
+ document test {
+ field field1 type int {
+ }
+ }
+ field derived1 type int {
+ indexing: input field1 | attribute
+ }
+ }
+ """;
+ ApplicationBuilder.createFromString(schema);
+ }
+
+ @Test
+ void testWrappedInputInDerivedField() throws ParseException {
+ var schema = """
+ schema test {
+ document test {
+ field field1 type int {
+ }
+ }
+ field derived1 type int {
+ indexing: if (input field1 == 0) { 0 } else { 1 } | attribute
+ }
+ }
+ """;
+ ApplicationBuilder.createFromString(schema);
+ }
+
+ @Test
+ void testNoInputInDerivedField() throws ParseException {
+ try {
+ var schema = """
+ schema test {
+ document test {
+ field field1 type int {
+ }
+ }
+ field derived1 type int {
+ indexing: attribute
+ }
+ }
+ """;
+ ApplicationBuilder.createFromString(schema);
+ }
+ catch (IllegalArgumentException e) {
+ assertEquals("For schema 'test', field 'derived1': For expression '{ attribute derived1; }': " +
+ "Expected any input, but no input is specified",
+ Exceptions.toMessageString(e));
+ }
+ }
+
}