diff options
Diffstat (limited to 'config-model/src/main/java/com/yahoo/searchdefinition')
2 files changed, 31 insertions, 13 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/derived/AttributeFields.java b/config-model/src/main/java/com/yahoo/searchdefinition/derived/AttributeFields.java index 6b4a9564e1e..0f1918f99d6 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/derived/AttributeFields.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/derived/AttributeFields.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.Map; import static com.yahoo.searchdefinition.document.ComplexAttributeFieldUtils.isArrayOfSimpleStruct; +import static com.yahoo.searchdefinition.document.ComplexAttributeFieldUtils.isMapOfPrimitiveType; import static com.yahoo.searchdefinition.document.ComplexAttributeFieldUtils.isMapOfSimpleStruct; /** @@ -45,7 +46,7 @@ public class AttributeFields extends Derived implements AttributesConfig.Produce @Override protected void derive(ImmutableSDField field, Search search) { if (unsupportedFieldType(field)) { - return; // Ignore majority of struct fields for indexed search (only implemented for streaming search) + return; // Ignore complex struct and map fields for indexed search (only supported for streaming search) } if (field.isImportedField()) { deriveImportedAttributes(field); @@ -53,6 +54,8 @@ public class AttributeFields extends Derived implements AttributesConfig.Produce deriveArrayOfSimpleStruct(field); } else if (isMapOfSimpleStruct(field)) { deriveMapOfSimpleStruct(field); + } else if (isMapOfPrimitiveType(field)) { + deriveMapOfPrimitiveType(field); } else { deriveAttributes(field); } @@ -62,6 +65,7 @@ public class AttributeFields extends Derived implements AttributesConfig.Produce return (field.usesStructOrMap() && !isArrayOfSimpleStruct(field) && !isMapOfSimpleStruct(field) && + !isMapOfPrimitiveType(field) && !field.getDataType().equals(PositionDataType.INSTANCE) && !field.getDataType().equals(DataType.getArray(PositionDataType.INSTANCE))); } @@ -113,33 +117,33 @@ public class AttributeFields extends Derived implements AttributesConfig.Produce private void deriveArrayOfSimpleStruct(ImmutableSDField field) { for (ImmutableSDField structField : field.getStructFields()) { - deriveAttributesAsArrayType(structField); + deriveAttributeAsArrayType(structField); } } - private void deriveAttributesAsArrayType(ImmutableSDField field) { - for (Attribute attribute : field.getAttributes().values()) { - if (field.getName().equals(attribute.getName())) { - attributes.put(attribute.getName(), attribute.convertToArray()); - } + private void deriveAttributeAsArrayType(ImmutableSDField field) { + Attribute attribute = field.getAttributes().get(field.getName()); + if (attribute != null) { + attributes.put(attribute.getName(), attribute.convertToArray()); } } private void deriveMapOfSimpleStruct(ImmutableSDField field) { - deriveMapKeyField(field.getStructField("key")); + deriveAttributeAsArrayType(field.getStructField("key")); deriveMapValueField(field.getStructField("value")); } - private void deriveMapKeyField(ImmutableSDField keyField) { - deriveAttributesAsArrayType(keyField); - } - private void deriveMapValueField(ImmutableSDField valueField) { for (ImmutableSDField structField : valueField.getStructFields()) { - deriveAttributesAsArrayType(structField); + deriveAttributeAsArrayType(structField); } } + private void deriveMapOfPrimitiveType(ImmutableSDField field) { + deriveAttributeAsArrayType(field.getStructField("key")); + deriveAttributeAsArrayType(field.getStructField("value")); + } + /** Returns a read only attribute iterator */ public Iterator attributeIterator() { return attributes().iterator(); diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/ComplexAttributeFieldUtils.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/ComplexAttributeFieldUtils.java index a46e94398a1..89d72756512 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/document/ComplexAttributeFieldUtils.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/ComplexAttributeFieldUtils.java @@ -39,6 +39,17 @@ public class ComplexAttributeFieldUtils { } } + public static boolean isMapOfPrimitiveType(ImmutableSDField field) { + DataType fieldType = field.getDataType(); + if (fieldType instanceof MapDataType) { + MapDataType mapType = (MapDataType)fieldType; + return isPrimitiveType(mapType.getKeyType()) && + isPrimitiveType(mapType.getValueType()); + } else { + return false; + } + } + private static boolean isSimpleStruct(DataType type) { if (type instanceof StructDataType && !(type.equals(PositionDataType.INSTANCE))) { @@ -69,6 +80,9 @@ public class ComplexAttributeFieldUtils { } else if (isMapOfSimpleStruct(field)) { return hasSingleAttribute(field.getStructField("key")) && hasOnlyStructFieldAttributes(field.getStructField("value")); + } else if (isMapOfPrimitiveType(field)) { + return hasSingleAttribute(field.getStructField("key")) && + hasSingleAttribute(field.getStructField("value")); } return false; } |