summaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'config-model/src/main/java')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/derived/AttributeFields.java14
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/document/ComplexAttributeFieldUtils.java59
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/processing/ImplicitSummaries.java2
3 files changed, 56 insertions, 19 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 6070aeb0ee1..55f3a94bb70 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
@@ -8,6 +8,7 @@ import com.yahoo.searchdefinition.Search;
import com.yahoo.searchdefinition.document.Attribute;
import com.yahoo.searchdefinition.document.ImmutableSDField;
import com.yahoo.searchdefinition.document.Ranking;
+import com.yahoo.searchdefinition.document.SDDocumentType;
import com.yahoo.searchdefinition.document.Sorting;
import com.yahoo.vespa.config.search.AttributesConfig;
import com.yahoo.vespa.indexinglanguage.expressions.ToPositionExpression;
@@ -23,6 +24,7 @@ import java.util.stream.Collectors;
import static com.yahoo.searchdefinition.document.ComplexAttributeFieldUtils.isArrayOfSimpleStruct;
import static com.yahoo.searchdefinition.document.ComplexAttributeFieldUtils.isMapOfPrimitiveType;
import static com.yahoo.searchdefinition.document.ComplexAttributeFieldUtils.isMapOfSimpleStruct;
+import static com.yahoo.searchdefinition.document.ComplexAttributeFieldUtils.isSupportedComplexField;
/**
* The set of all attribute fields defined by a search definition
@@ -46,14 +48,14 @@ public class AttributeFields extends Derived implements AttributesConfig.Produce
/** Derives everything from a field */
@Override
protected void derive(ImmutableSDField field, Search search) {
- if (unsupportedFieldType(field)) {
+ if (unsupportedFieldType(field, search.getDocument())) {
return; // Ignore complex struct and map fields for indexed search (only supported for streaming search)
}
if (field.isImportedField()) {
deriveImportedAttributes(field);
- } else if (isArrayOfSimpleStruct(field)) {
+ } else if (isArrayOfSimpleStruct(field, search.getDocument())) {
deriveArrayOfSimpleStruct(field);
- } else if (isMapOfSimpleStruct(field)) {
+ } else if (isMapOfSimpleStruct(field, search.getDocument())) {
deriveMapOfSimpleStruct(field);
} else if (isMapOfPrimitiveType(field)) {
deriveMapOfPrimitiveType(field);
@@ -62,11 +64,9 @@ public class AttributeFields extends Derived implements AttributesConfig.Produce
}
}
- private static boolean unsupportedFieldType(ImmutableSDField field) {
+ private static boolean unsupportedFieldType(ImmutableSDField field, SDDocumentType docType) {
return (field.usesStructOrMap() &&
- !isArrayOfSimpleStruct(field) &&
- !isMapOfSimpleStruct(field) &&
- !isMapOfPrimitiveType(field) &&
+ !isSupportedComplexField(field, docType) &&
!field.getDataType().equals(PositionDataType.INSTANCE) &&
!field.getDataType().equals(DataType.getArray(PositionDataType.INSTANCE)));
}
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 a56364a6975..857959d0678 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
@@ -7,6 +7,11 @@ import com.yahoo.document.Field;
import com.yahoo.document.MapDataType;
import com.yahoo.document.PositionDataType;
import com.yahoo.document.StructDataType;
+import com.yahoo.document.TemporaryStructuredDataType;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Optional;
/**
* Utils used to check whether a complex field supports being represented as struct field attributes.
@@ -14,33 +19,48 @@ import com.yahoo.document.StructDataType;
* Currently we support:
* - array of simple struct
* - map of primitive type to simple struct
+ * - map of primitive type to primitive type
*
* @author geirst
*/
public class ComplexAttributeFieldUtils {
- public static boolean isArrayOfSimpleStruct(ImmutableSDField field) {
- return isArrayOfSimpleStruct(field.getDataType());
+ public static boolean isSupportedComplexField(ImmutableSDField field, SDDocumentType docType) {
+ return (isArrayOfSimpleStruct(field, docType) ||
+ isMapOfSimpleStruct(field, docType) ||
+ isMapOfPrimitiveType(field));
+ }
+
+ public static boolean isArrayOfSimpleStruct(ImmutableSDField field, SDDocumentType docType) {
+ return isArrayOfSimpleStruct(field.getDataType(), Optional.of(docType));
}
public static boolean isArrayOfSimpleStruct(DataType fieldType) {
+ return isArrayOfSimpleStruct(fieldType, Optional.empty());
+ }
+
+ private static boolean isArrayOfSimpleStruct(DataType fieldType, Optional<SDDocumentType> docType) {
if (fieldType instanceof ArrayDataType) {
ArrayDataType arrayType = (ArrayDataType)fieldType;
- return isSimpleStruct(arrayType.getNestedType());
+ return isSimpleStruct(arrayType.getNestedType(), docType);
} else {
return false;
}
}
- public static boolean isMapOfSimpleStruct(ImmutableSDField field) {
- return isMapOfSimpleStruct(field.getDataType());
+ public static boolean isMapOfSimpleStruct(ImmutableSDField field, SDDocumentType docType) {
+ return isMapOfSimpleStruct(field.getDataType(), Optional.of(docType));
}
public static boolean isMapOfSimpleStruct(DataType fieldType) {
+ return isMapOfSimpleStruct(fieldType, Optional.empty());
+ }
+
+ private static boolean isMapOfSimpleStruct(DataType fieldType, Optional<SDDocumentType> docType) {
if (fieldType instanceof MapDataType) {
MapDataType mapType = (MapDataType)fieldType;
return isPrimitiveType(mapType.getKeyType()) &&
- isSimpleStruct(mapType.getValueType());
+ isSimpleStruct(mapType.getValueType(), docType);
} else {
return false;
}
@@ -60,11 +80,15 @@ public class ComplexAttributeFieldUtils {
}
}
- private static boolean isSimpleStruct(DataType type) {
+ private static boolean isSimpleStruct(DataType type, Optional<SDDocumentType> docType) {
if (type instanceof StructDataType &&
!(type.equals(PositionDataType.INSTANCE))) {
StructDataType structType = (StructDataType) type;
- for (Field innerField : structType.getFields()) {
+ Collection<Field> structFields = getStructFields(structType, docType);
+ if (structFields.isEmpty()) {
+ return false;
+ }
+ for (Field innerField : structFields) {
if (!isPrimitiveType(innerField.getDataType())) {
return false;
}
@@ -75,6 +99,19 @@ public class ComplexAttributeFieldUtils {
}
}
+ private static Collection<Field> getStructFields(StructDataType structType, Optional<SDDocumentType> docType) {
+ // The struct data type might be unresolved at this point. If so we use the document type to resolve it.
+ if (docType.isPresent() && (structType instanceof TemporaryStructuredDataType)) {
+ SDDocumentType realStructType = docType.get().getOwnedType(structType.getName());
+ if (structType != null) {
+ return realStructType.getDocumentType().getFields();
+ }
+ return Collections.emptyList();
+ } else {
+ return structType.getFields();
+ }
+ }
+
private static boolean isPrimitiveType(DataType dataType) {
return dataType.equals(DataType.BYTE) ||
dataType.equals(DataType.INT) ||
@@ -84,10 +121,10 @@ public class ComplexAttributeFieldUtils {
dataType.equals(DataType.STRING);
}
- public static boolean isComplexFieldWithOnlyStructFieldAttributes(ImmutableSDField field) {
- if (isArrayOfSimpleStruct(field)) {
+ public static boolean isComplexFieldWithOnlyStructFieldAttributes(ImmutableSDField field, SDDocumentType docType) {
+ if (isArrayOfSimpleStruct(field, docType)) {
return hasOnlyStructFieldAttributes(field);
- } else if (isMapOfSimpleStruct(field)) {
+ } else if (isMapOfSimpleStruct(field, docType)) {
return hasSingleAttribute(field.getStructField("key")) &&
hasOnlyStructFieldAttributes(field.getStructField("value"));
} else if (isMapOfPrimitiveType(field)) {
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/ImplicitSummaries.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/ImplicitSummaries.java
index b51524b7e62..2d2fc10d9c5 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/ImplicitSummaries.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/ImplicitSummaries.java
@@ -83,7 +83,7 @@ public class ImplicitSummaries extends Processor {
}
}
- if (addedSummaryField != null && isComplexFieldWithOnlyStructFieldAttributes(field)) {
+ if (addedSummaryField != null && isComplexFieldWithOnlyStructFieldAttributes(field, search.getDocument())) {
addedSummaryField.setTransform(SummaryTransform.ATTRIBUTECOMBINER);
}