aboutsummaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2024-02-23 13:50:21 +0100
committerTor Egge <Tor.Egge@online.no>2024-02-23 13:50:21 +0100
commitb729036aa5fb9bb8db2d24db817661c7aa1ff1d1 (patch)
tree19880b2136d181400f08478530e9a9b12c730c05 /config-model/src/main/java/com
parent89c45f947e83cec5344e3096ab784272d5c91b71 (diff)
Derive indexes for nested attribute fields in streaming search.
Diffstat (limited to 'config-model/src/main/java/com')
-rw-r--r--config-model/src/main/java/com/yahoo/schema/derived/VsmFields.java34
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) {