summaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo/searchdefinition/derived/AttributeFields.java
diff options
context:
space:
mode:
Diffstat (limited to 'config-model/src/main/java/com/yahoo/searchdefinition/derived/AttributeFields.java')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/derived/AttributeFields.java84
1 files changed, 62 insertions, 22 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 c7ca1a33ff2..fc75f7a19fc 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
@@ -5,6 +5,7 @@ import com.yahoo.config.subscription.ConfigInstanceUtil;
import com.yahoo.document.ArrayDataType;
import com.yahoo.document.DataType;
import com.yahoo.document.Field;
+import com.yahoo.document.MapDataType;
import com.yahoo.document.PositionDataType;
import com.yahoo.document.StructDataType;
import com.yahoo.searchdefinition.Search;
@@ -44,39 +45,59 @@ public class AttributeFields extends Derived implements AttributesConfig.Produce
/** Derives everything from a field */
@Override
protected void derive(ImmutableSDField field, Search search) {
- boolean fieldIsArrayOfSimpleStruct = isArrayOfSimpleStruct(field);
- if (field.usesStructOrMap() &&
- !fieldIsArrayOfSimpleStruct &&
- !field.getDataType().equals(PositionDataType.INSTANCE) &&
- !field.getDataType().equals(DataType.getArray(PositionDataType.INSTANCE))) {
- return; // Ignore struct fields for indexed search (only implemented for streaming search)
+ if (unsupportedFieldType(field)) {
+ return; // Ignore majority of struct fields for indexed search (only implemented for streaming search)
}
if (field.isImportedField()) {
deriveImportedAttributes(field);
- } else if (fieldIsArrayOfSimpleStruct) {
+ } else if (isArrayOfSimpleStruct(field)) {
deriveArrayOfSimpleStruct(field);
+ } else if (isMapOfSimpleStruct(field)) {
+ deriveMapOfSimpleStruct(field);
} else {
deriveAttributes(field);
}
}
+ private static boolean unsupportedFieldType(ImmutableSDField field) {
+ return (field.usesStructOrMap() &&
+ !isArrayOfSimpleStruct(field) &&
+ !isMapOfSimpleStruct(field) &&
+ !field.getDataType().equals(PositionDataType.INSTANCE) &&
+ !field.getDataType().equals(DataType.getArray(PositionDataType.INSTANCE)));
+ }
+
private static boolean isArrayOfSimpleStruct(ImmutableSDField field) {
DataType fieldType = field.getDataType();
if (fieldType instanceof ArrayDataType) {
ArrayDataType arrayType = (ArrayDataType)fieldType;
- DataType nestedType = arrayType.getNestedType();
- if (nestedType instanceof StructDataType &&
- !(nestedType.equals(PositionDataType.INSTANCE))) {
- StructDataType structType = (StructDataType)nestedType;
- for (Field innerField : structType.getFields()) {
- if (!isPrimitiveType(innerField.getDataType())) {
- return false;
- }
+ return isSimpleStruct(arrayType.getNestedType());
+ } else {
+ return false;
+ }
+ }
+
+ private static boolean isMapOfSimpleStruct(ImmutableSDField field) {
+ DataType fieldType = field.getDataType();
+ if (fieldType instanceof MapDataType) {
+ MapDataType mapType = (MapDataType)fieldType;
+ return isPrimitiveType(mapType.getKeyType()) &&
+ isSimpleStruct(mapType.getValueType());
+ } else {
+ return false;
+ }
+ }
+
+ private static boolean isSimpleStruct(DataType type) {
+ if (type instanceof StructDataType &&
+ !(type.equals(PositionDataType.INSTANCE))) {
+ StructDataType structType = (StructDataType) type;
+ for (Field innerField : structType.getFields()) {
+ if (!isPrimitiveType(innerField.getDataType())) {
+ return false;
}
- return true;
- } else {
- return false;
}
+ return true;
} else {
return false;
}
@@ -138,14 +159,33 @@ public class AttributeFields extends Derived implements AttributesConfig.Produce
private void deriveArrayOfSimpleStruct(ImmutableSDField field) {
for (ImmutableSDField structField : field.getStructFields()) {
- for (Attribute attribute : structField.getAttributes().values()) {
- if (structField.getName().equals(attribute.getName())) {
- attributes.put(attribute.getName(), attribute.convertToArray());
- }
+ deriveAttributesAsArrayType(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 deriveMapOfSimpleStruct(ImmutableSDField field) {
+ deriveMapKeyField(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);
+ }
+ }
+
/** Returns a read only attribute iterator */
public Iterator attributeIterator() {
return attributes().iterator();