aboutsummaryrefslogtreecommitdiffstats
path: root/config-model
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
parent89c45f947e83cec5344e3096ab784272d5c91b71 (diff)
Derive indexes for nested attribute fields in streaming search.
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/schema/derived/VsmFields.java34
-rw-r--r--config-model/src/test/java/com/yahoo/schema/derived/VsmFieldsTestCase.java74
2 files changed, 97 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) {
diff --git a/config-model/src/test/java/com/yahoo/schema/derived/VsmFieldsTestCase.java b/config-model/src/test/java/com/yahoo/schema/derived/VsmFieldsTestCase.java
index 61d636d911f..852f567ccfa 100644
--- a/config-model/src/test/java/com/yahoo/schema/derived/VsmFieldsTestCase.java
+++ b/config-model/src/test/java/com/yahoo/schema/derived/VsmFieldsTestCase.java
@@ -6,6 +6,7 @@ import com.yahoo.config.model.deploy.TestProperties;
import com.yahoo.config.model.test.MockApplicationPackage;
import com.yahoo.document.DataType;
import com.yahoo.documentmodel.NewDocumentReferenceDataType;
+import com.yahoo.schema.ApplicationBuilder;
import com.yahoo.schema.Schema;
import com.yahoo.schema.document.Case;
import com.yahoo.schema.document.MatchType;
@@ -13,9 +14,14 @@ import com.yahoo.schema.document.Matching;
import com.yahoo.schema.document.SDDocumentType;
import com.yahoo.schema.document.SDField;
import com.yahoo.schema.document.TemporarySDField;
+import com.yahoo.schema.parser.ParseException;
import com.yahoo.vespa.config.search.vsm.VsmfieldsConfig;
import org.junit.jupiter.api.Test;
+import java.util.HashSet;
+import java.util.Set;
+
+import static com.yahoo.config.model.test.TestUtil.joinLines;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
@@ -77,4 +83,72 @@ public class VsmFieldsTestCase {
testIndexMatching(new Matching(MatchType.WORD).setCase(Case.CASED),
VsmfieldsConfig.Fieldspec.Normalize.NONE, "word");
}
+
+ private static Set<String> getIndexes(VsmfieldsConfig config, String field) {
+ var indexes = new HashSet<String>();
+ var doctype = config.documenttype(0);
+ for (var index : doctype.index()) {
+ for (var indexField : index.field()) {
+ if (field.equals(indexField.name())) {
+ indexes.add(index.name());
+ break;
+ }
+ }
+ }
+ return indexes;
+ }
+
+ @Test
+ void deriveIndexFromNestedAttributes() throws ParseException {
+ String sd = joinLines(
+ "schema test {",
+ " document test {",
+ " field map_field type map<string,int> {",
+ " indexing: summary",
+ " struct-field key { indexing: attribute }",
+ " struct-field value { indexing: attribute }",
+ " }",
+ " }",
+ "}");
+ var schema = ApplicationBuilder.createFromString(sd).getSchema();
+ var config = vsmfieldsConfig(schema);
+ assertEquals(Set.of("map_field", "map_field.key"), getIndexes(config, "map_field.key"));
+ assertEquals(Set.of("map_field", "map_field.value"), getIndexes(config, "map_field.value"));
+ }
+
+ @Test
+ void deriveIndexFromIndexStatement() throws ParseException {
+ String sd = joinLines(
+ "schema test {",
+ " document test {",
+ " field map_field type map<string,int> {",
+ " indexing: summary | index",
+ " }",
+ " }",
+ "}");
+ var schema = ApplicationBuilder.createFromString(sd).getSchema();
+ var config = vsmfieldsConfig(schema);
+ assertEquals(Set.of("map_field", "map_field.key"), getIndexes(config, "map_field.key"));
+ assertEquals(Set.of("map_field", "map_field.value"), getIndexes(config, "map_field.value"));
+ }
+
+ @Test
+ void positionFieldTypeBlocksderivingOfIndexFromNestedAttributes() throws ParseException {
+ String sd = joinLines(
+ "schema test {",
+ " document test {",
+ " field pos type position {",
+ " indexing: attribute | summary",
+ " struct-field x { indexing: attribute }",
+ " struct-field y { indexing: attribute }",
+ " }",
+ " }",
+ "}");
+ var schema = ApplicationBuilder.createFromString(sd).getSchema();
+ var config = vsmfieldsConfig(schema);
+ assertEquals(Set.of("pos"), getIndexes(config, "pos"));
+ assertEquals(Set.of(), getIndexes(config, "pos.x"));
+ assertEquals(Set.of(), getIndexes(config, "pos.y"));
+ }
+
}