diff options
Diffstat (limited to 'config-model/src/main/java/com/yahoo/schema/derived/VsmFields.java')
-rw-r--r-- | config-model/src/main/java/com/yahoo/schema/derived/VsmFields.java | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/config-model/src/main/java/com/yahoo/schema/derived/VsmFields.java b/config-model/src/main/java/com/yahoo/schema/derived/VsmFields.java index a590a3a74bf..1ba9e9b6797 100644 --- a/config-model/src/main/java/com/yahoo/schema/derived/VsmFields.java +++ b/config-model/src/main/java/com/yahoo/schema/derived/VsmFields.java @@ -17,6 +17,7 @@ import com.yahoo.schema.document.Attribute; import com.yahoo.schema.document.Case; import com.yahoo.schema.document.FieldSet; import com.yahoo.schema.document.GeoPos; +import com.yahoo.schema.document.ImmutableSDField; import com.yahoo.schema.document.Matching; import com.yahoo.schema.document.MatchType; import com.yahoo.schema.document.SDDocumentType; @@ -52,34 +53,34 @@ public class VsmFields extends Derived implements VsmfieldsConfig.Producer { doctypes.put(document.getName(), docType); } for (Object o : document.fieldSet()) { - derive(docType, (SDField) o); + derive(docType, (SDField) o, false, false); } } - private void derive(StreamingDocumentType document, SDField field) { + private void derive(StreamingDocumentType document, SDField field, boolean isStructField, boolean ignoreAttributAspect) { if (field.usesStructOrMap()) { if (GeoPos.isAnyPos(field)) { - StreamingField streamingField = new StreamingField(field); + StreamingField streamingField = new StreamingField(field, isStructField, true); addField(streamingField.getName(), streamingField); addFieldToIndices(document, field.getName(), streamingField); } for (SDField structField : field.getStructFields()) { - derive(document, structField); // Recursion + derive(document, structField, true, ignoreAttributAspect || GeoPos.isAnyPos(field)); // Recursion } } else { - if (! (field.doesIndexing() || field.doesSummarying() || field.doesAttributing()) ) + if (! (field.doesIndexing() || field.doesSummarying() || isAttributeField(field, isStructField, ignoreAttributAspect)) ) return; - StreamingField streamingField = new StreamingField(field); + StreamingField streamingField = new StreamingField(field, isStructField, ignoreAttributAspect); addField(streamingField.getName(),streamingField); - deriveIndices(document, field, streamingField); + deriveIndices(document, field, streamingField, isStructField, ignoreAttributAspect); } } - private void deriveIndices(StreamingDocumentType document, SDField field, StreamingField streamingField) { + private void deriveIndices(StreamingDocumentType document, SDField field, StreamingField streamingField, boolean isStructField, boolean ignoreAttributAspect) { if (field.doesIndexing()) { addFieldToIndices(document, field.getName(), streamingField); - } else if (field.doesAttributing()) { + } else if (isAttributeField(field, isStructField, ignoreAttributAspect)) { for (String indexName : field.getAttributes().keySet()) { addFieldToIndices(document, indexName, streamingField); } @@ -115,6 +116,17 @@ public class VsmFields extends Derived implements VsmfieldsConfig.Producer { } } + private static boolean isAttributeField(ImmutableSDField field, boolean isStructField, boolean ignoreAttributAspect) { + if (field.doesAttributing()) { + return true; + } + if (!isStructField || ignoreAttributAspect) { + return false; + } + var attribute = field.getAttributes().get(field.getName()); + return attribute != null; + } + private static class StreamingField { private final String name; @@ -170,8 +182,8 @@ public class VsmFields extends Derived implements VsmfieldsConfig.Producer { } - public StreamingField(SDField field) { - this(field.getName(), field.getDataType(), field.getMatching(), field.doesAttributing(), getDistanceMetric(field)); + public StreamingField(SDField field, boolean isStructField, boolean ignoreAttributAspect) { + this(field.getName(), field.getDataType(), field.getMatching(), isAttributeField(field, isStructField, ignoreAttributAspect), getDistanceMetric(field)); } private StreamingField(String name, DataType sourceType, Matching matching, boolean isAttribute, Attribute.DistanceMetric distanceMetric) { |