aboutsummaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2024-04-10 13:37:59 +0200
committerTor Egge <Tor.Egge@online.no>2024-04-10 13:37:59 +0200
commit0f0340ad6102ca52f0054c01e8aee74d31e9de0c (patch)
tree79196592b209c1bb254a9712a2e1862e14e067ca /config-model/src/main/java/com/yahoo
parentde9a1561fa9dcc9126baa161c5ec40bd6ccbde95 (diff)
Improve error message when field cannot have attribute aspect.
Diffstat (limited to 'config-model/src/main/java/com/yahoo')
-rw-r--r--config-model/src/main/java/com/yahoo/schema/document/Attribute.java27
-rw-r--r--config-model/src/main/java/com/yahoo/schema/document/SDField.java15
-rw-r--r--config-model/src/main/java/com/yahoo/schema/fieldoperation/FieldOperation.java2
-rw-r--r--config-model/src/main/java/com/yahoo/schema/fieldoperation/IndexingOperation.java4
-rw-r--r--config-model/src/main/java/com/yahoo/schema/parser/ConvertParsedFields.java26
-rw-r--r--config-model/src/main/java/com/yahoo/schema/processing/CreatePositionZCurve.java8
-rw-r--r--config-model/src/main/java/com/yahoo/schema/processing/ExactMatch.java2
-rw-r--r--config-model/src/main/java/com/yahoo/schema/processing/IndexingInputs.java2
-rw-r--r--config-model/src/main/java/com/yahoo/schema/processing/IndexingOutputs.java2
-rw-r--r--config-model/src/main/java/com/yahoo/schema/processing/IntegerIndex2Attribute.java2
-rw-r--r--config-model/src/main/java/com/yahoo/schema/processing/NGramMatch.java2
-rw-r--r--config-model/src/main/java/com/yahoo/schema/processing/OptimizeIlscript.java2
-rw-r--r--config-model/src/main/java/com/yahoo/schema/processing/PredicateProcessor.java2
-rw-r--r--config-model/src/main/java/com/yahoo/schema/processing/Processor.java2
-rw-r--r--config-model/src/main/java/com/yahoo/schema/processing/TextMatch.java2
15 files changed, 62 insertions, 38 deletions
diff --git a/config-model/src/main/java/com/yahoo/schema/document/Attribute.java b/config-model/src/main/java/com/yahoo/schema/document/Attribute.java
index 999d040b48c..6198c54d258 100644
--- a/config-model/src/main/java/com/yahoo/schema/document/Attribute.java
+++ b/config-model/src/main/java/com/yahoo/schema/document/Attribute.java
@@ -5,7 +5,9 @@ import com.yahoo.document.ArrayDataType;
import com.yahoo.document.CollectionDataType;
import com.yahoo.document.DataType;
import com.yahoo.document.DocumentType;
+import com.yahoo.document.MapDataType;
import com.yahoo.document.PrimitiveDataType;
+import com.yahoo.document.StructDataType;
import com.yahoo.documentmodel.NewDocumentReferenceDataType;
import com.yahoo.document.StructuredDataType;
import com.yahoo.document.TensorDataType;
@@ -143,8 +145,8 @@ public final class Attribute implements Cloneable, Serializable {
}
/** Creates an attribute with default settings */
- public Attribute(String name, DataType fieldType) {
- this(name, convertDataType(fieldType), convertCollectionType(fieldType), convertTensorType(fieldType), convertTargetType(fieldType));
+ public Attribute(String schemaName, String fieldName, String name, DataType fieldType) {
+ this(name, convertDataType(schemaName, fieldName, fieldType), convertCollectionType(fieldType), convertTensorType(fieldType), convertTargetType(fieldType));
setRemoveIfZero(fieldType instanceof WeightedSetDataType wsdt && wsdt.removeIfZero());
setCreateIfNonExistent(fieldType instanceof WeightedSetDataType wsdt && wsdt.createIfNonExistent());
}
@@ -266,12 +268,29 @@ public final class Attribute implements Cloneable, Serializable {
private void setType(Type type) { this.type=type; }
public void setCollectionType(CollectionType type) { this.collectionType=type; }
+ private static void failDataType(String schemaName, String fieldName, String dataType) throws IllegalArgumentException {
+ throw new IllegalArgumentException("For schema '" + schemaName + "': Field '" + fieldName + "' of type '" + dataType + "' cannot be an attribute. " +
+ "Instead specify the struct fields to be searchable as attribute");
+ }
+ public static void validateDataType(String schemaName, String fieldName, DataType fieldType) throws IllegalArgumentException {
+ if (fieldType instanceof MapDataType mapType) {
+ failDataType(schemaName, fieldName, "map<" + mapType.getKeyType().getName() + "," + mapType.getValueType().getName() + ">");
+ }
+ if (fieldType instanceof ArrayDataType arrayType && arrayType.getNestedType() instanceof StructDataType nestedType) {
+ failDataType(schemaName, fieldName, "array<" + nestedType.getName() + ">");
+ }
+ if (fieldType instanceof StructDataType structType) {
+ failDataType(schemaName, fieldName, structType.getName());
+ }
+ }
+
/** Converts to the right attribute type from a field datatype */
- public static Type convertDataType(DataType fieldType) {
+ public static Type convertDataType(String schemaName, String fieldName, DataType fieldType) {
+ validateDataType(schemaName, fieldName, fieldType);
if (fieldType instanceof NewDocumentReferenceDataType) {
return Type.REFERENCE;
} else if (fieldType instanceof CollectionDataType) {
- return convertDataType(((CollectionDataType) fieldType).getNestedType());
+ return convertDataType(schemaName, fieldName, ((CollectionDataType) fieldType).getNestedType());
}
FieldValue fval = fieldType.createFieldValue();
if (fval instanceof StringFieldValue) {
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 538cb56d210..f165141b16e 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
@@ -398,22 +398,23 @@ public class SDField extends Field implements TypedKey, ImmutableSDField {
}
/** Parse an indexing expression which will use the simple linguistics implementation suitable for testing */
- public void parseIndexingScript(String script) {
- parseIndexingScript(script, new SimpleLinguistics(), Embedder.throwsOnUse.asMap());
+ public void parseIndexingScript(String schemaName, String script) {
+ parseIndexingScript(schemaName, script, new SimpleLinguistics(), Embedder.throwsOnUse.asMap());
}
- public void parseIndexingScript(String script, Linguistics linguistics, Map<String, Embedder> embedders) {
+ public void parseIndexingScript(String schemaName, String script, Linguistics linguistics, Map<String, Embedder> embedders) {
try {
ScriptParserContext config = new ScriptParserContext(linguistics, embedders);
config.setInputStream(new IndexingInput(script));
- setIndexingScript(ScriptExpression.newInstance(config));
+ setIndexingScript(schemaName, ScriptExpression.newInstance(config));
} catch (ParseException e) {
throw new IllegalArgumentException("Failed to parse script '" + script + "'", e);
}
}
/** Sets the indexing script of this, or null to not use a script */
- public void setIndexingScript(ScriptExpression exp) {
+
+ public void setIndexingScript(String schemaName, ScriptExpression exp) {
if (exp == null) {
exp = new ScriptExpression();
}
@@ -441,13 +442,13 @@ public class SDField extends Field implements TypedKey, ImmutableSDField {
}
Attribute attribute = attributes.get(fieldName);
if (attribute == null) {
- addAttribute(new Attribute(fieldName, getDataType()));
+ addAttribute(new Attribute(schemaName, fieldName, fieldName, getDataType()));
}
}
}.visit(indexingScript);
}
for (SDField structField : getStructFields()) {
- structField.setIndexingScript(exp);
+ structField.setIndexingScript(schemaName, exp);
}
}
diff --git a/config-model/src/main/java/com/yahoo/schema/fieldoperation/FieldOperation.java b/config-model/src/main/java/com/yahoo/schema/fieldoperation/FieldOperation.java
index 22a9eed2914..5a0c2c3c915 100644
--- a/config-model/src/main/java/com/yahoo/schema/fieldoperation/FieldOperation.java
+++ b/config-model/src/main/java/com/yahoo/schema/fieldoperation/FieldOperation.java
@@ -12,7 +12,7 @@ import com.yahoo.schema.document.SDField;
public interface FieldOperation extends Comparable<FieldOperation> {
/** Apply this operation on the given field */
- void apply(SDField field);
+ void apply(String schemaName, SDField field);
@Override
default int compareTo(FieldOperation other) {
diff --git a/config-model/src/main/java/com/yahoo/schema/fieldoperation/IndexingOperation.java b/config-model/src/main/java/com/yahoo/schema/fieldoperation/IndexingOperation.java
index f5366c4b07a..11065f040ea 100644
--- a/config-model/src/main/java/com/yahoo/schema/fieldoperation/IndexingOperation.java
+++ b/config-model/src/main/java/com/yahoo/schema/fieldoperation/IndexingOperation.java
@@ -28,8 +28,8 @@ public class IndexingOperation implements FieldOperation {
public ScriptExpression getScript() { return script; }
- public void apply(SDField field) {
- field.setIndexingScript(script);
+ public void apply(String schemaName, SDField field) {
+ field.setIndexingScript(schemaName, script);
}
/** Creates an indexing operation which will use the simple linguistics implementation suitable for testing */
diff --git a/config-model/src/main/java/com/yahoo/schema/parser/ConvertParsedFields.java b/config-model/src/main/java/com/yahoo/schema/parser/ConvertParsedFields.java
index e3ca0090408..053a5ac777b 100644
--- a/config-model/src/main/java/com/yahoo/schema/parser/ConvertParsedFields.java
+++ b/config-model/src/main/java/com/yahoo/schema/parser/ConvertParsedFields.java
@@ -2,6 +2,7 @@
package com.yahoo.schema.parser;
import com.yahoo.document.DataType;
+import com.yahoo.schema.document.GeoPos;
import com.yahoo.schema.parser.ConvertParsedTypes.TypeResolver;
import com.yahoo.schema.Index;
import com.yahoo.schema.Schema;
@@ -49,10 +50,10 @@ public class ConvertParsedFields {
(exactMatchTerminator -> field.getMatching().setExactMatchTerminator(exactMatchTerminator));
}
- void convertSorting(SDField field, ParsedSorting parsed, String name) {
+ void convertSorting(Schema schema, SDField field, ParsedSorting parsed, String name) {
Attribute attribute = field.getAttributes().get(name);
if (attribute == null) {
- attribute = new Attribute(name, field.getDataType());
+ attribute = new Attribute(schema.getName(), field.getName(), name, field.getDataType());
field.addAttribute(attribute);
}
Sorting sorting = attribute.getSorting();
@@ -66,7 +67,7 @@ public class ConvertParsedFields {
parsed.getLocale().ifPresent(locale -> sorting.setLocale(locale));
}
- void convertAttribute(SDField field, ParsedAttribute parsed) {
+ void convertAttribute(Schema schema, SDField field, ParsedAttribute parsed) {
String name = parsed.name();
String fieldName = field.getName();
Attribute attribute = null;
@@ -76,7 +77,7 @@ public class ConvertParsedFields {
if (attribute == null) {
attribute = field.getAttributes().get(name);
if (attribute == null) {
- attribute = new Attribute(name, field.getDataType());
+ attribute = new Attribute(schema.getName(), field.getName(), name, field.getDataType());
field.addAttribute(attribute);
}
}
@@ -102,7 +103,7 @@ public class ConvertParsedFields {
}
var sorting = parsed.getSorting();
if (sorting.isPresent()) {
- convertSorting(field, sorting.get(), name);
+ convertSorting(schema, field, sorting.get(), name);
}
}
@@ -143,13 +144,16 @@ public class ConvertParsedFields {
convertMatchSettings(field, parsed.matchSettings());
var indexing = parsed.getIndexing();
if (indexing.isPresent()) {
- field.setIndexingScript(indexing.get().script());
+ field.setIndexingScript(schema.getName(), indexing.get().script());
+ }
+ if (field.doesAttributing() && !GeoPos.isAnyPos(field.getDataType())) {
+ Attribute.validateDataType(schema.getName(), field.getName(), field.getDataType());
}
parsed.getWeight().ifPresent(value -> field.setWeight(value));
parsed.getStemming().ifPresent(value -> field.setStemming(value));
parsed.getNormalizing().ifPresent(value -> convertNormalizing(field, value));
for (var attribute : parsed.getAttributes()) {
- convertAttribute(field, attribute);
+ convertAttribute(schema, field, attribute);
}
for (var summaryField : parsed.getSummaryFields()) {
var dataType = field.getDataType();
@@ -190,7 +194,7 @@ public class ConvertParsedFields {
convertCommonFieldSettings(schema, structField, parsed);
}
- private void convertExtraFieldSettings(SDField field, ParsedField parsed) {
+ private void convertExtraFieldSettings(Schema schema, SDField field, ParsedField parsed) {
String name = parsed.name();
for (var dictOp : parsed.getDictionaryOptions()) {
var dictionary = field.getOrSetDictionary();
@@ -208,7 +212,7 @@ public class ConvertParsedFields {
field.getAliasToName().put(alias, parsed.lookupAliasedFrom(alias));
}
parsed.getRankTypes().forEach((indexName, rankType) -> convertRankType(field, indexName, rankType));
- parsed.getSorting().ifPresent(sortInfo -> convertSorting(field, sortInfo, name));
+ parsed.getSorting().ifPresent(sortInfo -> convertSorting(schema, field, sortInfo, name));
if (parsed.hasBolding()) {
// TODO must it be so ugly:
SummaryField summaryField = field.getSummaryField(name, true);
@@ -288,7 +292,7 @@ public class ConvertParsedFields {
DataType dataType = context.resolveType(parsed.getType());
var field = new SDField(document, name, dataType);
convertCommonFieldSettings(schema, field, parsed);
- convertExtraFieldSettings(field, parsed);
+ convertExtraFieldSettings(schema, field, parsed);
document.addField(field);
return field;
}
@@ -298,7 +302,7 @@ public class ConvertParsedFields {
DataType dataType = context.resolveType(parsed.getType());
var field = new SDField(schema.getDocument(), name, dataType);
convertCommonFieldSettings(schema, field, parsed);
- convertExtraFieldSettings(field, parsed);
+ convertExtraFieldSettings(schema, field, parsed);
schema.addExtraField(field);
}
diff --git a/config-model/src/main/java/com/yahoo/schema/processing/CreatePositionZCurve.java b/config-model/src/main/java/com/yahoo/schema/processing/CreatePositionZCurve.java
index 7bd66ad8f0b..deb57e157f3 100644
--- a/config-model/src/main/java/com/yahoo/schema/processing/CreatePositionZCurve.java
+++ b/config-model/src/main/java/com/yahoo/schema/processing/CreatePositionZCurve.java
@@ -86,14 +86,14 @@ public class CreatePositionZCurve extends Processor {
SummaryTransform.DISTANCE, summaryTo, validate);
}
// clear indexing script
- field.setIndexingScript(null);
+ field.setIndexingScript(schema.getName(), null);
SDField posX = field.getStructField(PositionDataType.FIELD_X);
if (posX != null) {
- posX.setIndexingScript(null);
+ posX.setIndexingScript(schema.getName(), null);
}
SDField posY = field.getStructField(PositionDataType.FIELD_Y);
if (posY != null) {
- posY.setIndexingScript(null);
+ posY.setIndexingScript(schema.getName(), null);
}
if (doesSummary) ensureCompatibleSummary(field, zName,
field.getName(),
@@ -118,7 +118,7 @@ public class CreatePositionZCurve extends Processor {
ScriptExpression script = inputField.getIndexingScript();
script = (ScriptExpression)new RemoveSummary(inputField.getName()).convert(script);
script = (ScriptExpression)new PerformZCurve(field, fieldName).convert(script);
- field.setIndexingScript(script);
+ field.setIndexingScript(schema.getName(), script);
return field;
}
diff --git a/config-model/src/main/java/com/yahoo/schema/processing/ExactMatch.java b/config-model/src/main/java/com/yahoo/schema/processing/ExactMatch.java
index a12183262c4..056c37a9830 100644
--- a/config-model/src/main/java/com/yahoo/schema/processing/ExactMatch.java
+++ b/config-model/src/main/java/com/yahoo/schema/processing/ExactMatch.java
@@ -75,7 +75,7 @@ public class ExactMatch extends Processor {
}
ScriptExpression script = field.getIndexingScript();
if (new ExpressionSearcher<>(IndexExpression.class).containedIn(script)) {
- field.setIndexingScript((ScriptExpression)new MyProvider(schema).convert(field.getIndexingScript()));
+ field.setIndexingScript(schema.getName(), (ScriptExpression)new MyProvider(schema).convert(field.getIndexingScript()));
}
}
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 53ebd136e08..a5ba67d6976 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
@@ -36,7 +36,7 @@ public class IndexingInputs extends Processor {
if (validate)
new VerifyInputExpression(schema, field).visit(script);
- field.setIndexingScript(script);
+ field.setIndexingScript(schema.getName(), script);
}
}
diff --git a/config-model/src/main/java/com/yahoo/schema/processing/IndexingOutputs.java b/config-model/src/main/java/com/yahoo/schema/processing/IndexingOutputs.java
index 071c2878ae8..be129b53c5e 100644
--- a/config-model/src/main/java/com/yahoo/schema/processing/IndexingOutputs.java
+++ b/config-model/src/main/java/com/yahoo/schema/processing/IndexingOutputs.java
@@ -37,7 +37,7 @@ public class IndexingOutputs extends Processor {
Set<String> summaryFields = new TreeSet<>();
findSummaryTo(schema, field, summaryFields, summaryFields);
MyConverter converter = new MyConverter(schema, field, summaryFields, validate);
- field.setIndexingScript((ScriptExpression)converter.convert(script));
+ field.setIndexingScript(schema.getName(), (ScriptExpression)converter.convert(script));
}
}
diff --git a/config-model/src/main/java/com/yahoo/schema/processing/IntegerIndex2Attribute.java b/config-model/src/main/java/com/yahoo/schema/processing/IntegerIndex2Attribute.java
index 0d296783cfb..37815ef5396 100644
--- a/config-model/src/main/java/com/yahoo/schema/processing/IntegerIndex2Attribute.java
+++ b/config-model/src/main/java/com/yahoo/schema/processing/IntegerIndex2Attribute.java
@@ -38,7 +38,7 @@ public class IntegerIndex2Attribute extends Processor {
ScriptExpression script = field.getIndexingScript();
Set<String> attributeNames = new HashSet<>();
new MyVisitor(attributeNames).visit(script);
- field.setIndexingScript((ScriptExpression)new MyConverter(attributeNames).convert(script));
+ field.setIndexingScript(schema.getName(), (ScriptExpression)new MyConverter(attributeNames).convert(script));
warn(schema, field, "Changed to attribute because numerical indexes (field has type " +
field.getDataType().getName() + ") is not currently supported." +
" Index-only settings may fail. Ignore this warning for streaming search.");
diff --git a/config-model/src/main/java/com/yahoo/schema/processing/NGramMatch.java b/config-model/src/main/java/com/yahoo/schema/processing/NGramMatch.java
index 2ec5c03e04c..c06e0565109 100644
--- a/config-model/src/main/java/com/yahoo/schema/processing/NGramMatch.java
+++ b/config-model/src/main/java/com/yahoo/schema/processing/NGramMatch.java
@@ -46,7 +46,7 @@ public class NGramMatch extends Processor {
field.getNormalizing().inferCodepoint();
field.setStemming(Stemming.NONE); // not compatible with stemming and normalizing
field.addQueryCommand("ngram " + n);
- field.setIndexingScript((ScriptExpression)new MyProvider(schema, n).convert(field.getIndexingScript()));
+ field.setIndexingScript(schema.getName(), (ScriptExpression)new MyProvider(schema, n).convert(field.getIndexingScript()));
}
private static class MyProvider extends TypedTransformProvider {
diff --git a/config-model/src/main/java/com/yahoo/schema/processing/OptimizeIlscript.java b/config-model/src/main/java/com/yahoo/schema/processing/OptimizeIlscript.java
index b268a7a9c03..fbb49497837 100644
--- a/config-model/src/main/java/com/yahoo/schema/processing/OptimizeIlscript.java
+++ b/config-model/src/main/java/com/yahoo/schema/processing/OptimizeIlscript.java
@@ -27,7 +27,7 @@ public class OptimizeIlscript extends Processor {
ScriptExpression script = field.getIndexingScript();
if (script == null) continue;
- field.setIndexingScript((ScriptExpression)new ExpressionOptimizer().convert(script));
+ field.setIndexingScript(schema.getName(), (ScriptExpression)new ExpressionOptimizer().convert(script));
if ( ! field.getIndexingScript().toString().equals(script.toString())) {
info(schema, field, "Rewrote ilscript from:\n" + script.toString() +
"\nto\n" + field.getIndexingScript().toString());
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 2a654991835..c451df6370d 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
@@ -107,7 +107,7 @@ public class PredicateProcessor extends Processor {
script = new StatementExpression(makeSetPredicateVariablesScript(booleanIndexDefiniton), script);
ExpressionConverter converter = new PredicateOutputTransformer(schema);
- field.setIndexingScript(new ScriptExpression((StatementExpression)converter.convert(script)));
+ field.setIndexingScript(schema.getName(), new ScriptExpression((StatementExpression)converter.convert(script)));
}
private Expression makeSetPredicateVariablesScript(BooleanIndexDefinition options) {
diff --git a/config-model/src/main/java/com/yahoo/schema/processing/Processor.java b/config-model/src/main/java/com/yahoo/schema/processing/Processor.java
index beaff13c613..dd36bbb3b61 100644
--- a/config-model/src/main/java/com/yahoo/schema/processing/Processor.java
+++ b/config-model/src/main/java/com/yahoo/schema/processing/Processor.java
@@ -87,7 +87,7 @@ public abstract class Processor {
implementationField.setRankType(RankType.EMPTY);
implementationField.setStemming(Stemming.NONE);
implementationField.getNormalizing().inferCodepoint();
- implementationField.parseIndexingScript(indexing);
+ implementationField.parseIndexingScript(schema.getName(), indexing);
String indexName = field.getName();
String implementationIndexName = indexName + "_" + suffix;
Index implementationIndex = new Index(implementationIndexName);
diff --git a/config-model/src/main/java/com/yahoo/schema/processing/TextMatch.java b/config-model/src/main/java/com/yahoo/schema/processing/TextMatch.java
index e6fed35b821..e29f683761f 100644
--- a/config-model/src/main/java/com/yahoo/schema/processing/TextMatch.java
+++ b/config-model/src/main/java/com/yahoo/schema/processing/TextMatch.java
@@ -48,7 +48,7 @@ public class TextMatch extends Processor {
if ( ! visitor.requiresTokenize) continue;
ExpressionConverter converter = new MyStringTokenizer(schema, findAnnotatorConfig(schema, field));
- field.setIndexingScript((ScriptExpression)converter.convert(script));
+ field.setIndexingScript(schema.getName(), (ScriptExpression)converter.convert(script));
}
}