diff options
author | Geir Storli <geirstorli@yahoo.no> | 2018-04-25 17:14:30 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-25 17:14:30 +0200 |
commit | add9063f792957502be3905d58a139d824835ed7 (patch) | |
tree | ffe9f1300cad4003d2d7b944585015e2bddbf11a /config-model | |
parent | a908dbcdaa5d33859b3151f42a112354b988429e (diff) | |
parent | 63b800d3a93ffe9365b2400ce3cc6cc61fbadae8 (diff) |
Merge pull request #5680 from vespa-engine/geirst/enable-grand-parent-support-in-config-model
Geirst/enable grand parent support in config model
Diffstat (limited to 'config-model')
14 files changed, 83 insertions, 33 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableImportedSDField.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableImportedSDField.java index 4502468379f..125e6b976b5 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableImportedSDField.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableImportedSDField.java @@ -27,6 +27,10 @@ public class ImmutableImportedSDField implements ImmutableSDField { this.importedField = importedField; } + public ImportedField getImportedField() { + return importedField; + } + @Override public <T extends Expression> boolean containsExpression(Class<T> searchFor) { throw createUnsupportedException(searchFor.getSimpleName()); diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/ImportedField.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/ImportedField.java index 5c3f8bf18bf..1a6a24275ac 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/document/ImportedField.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/ImportedField.java @@ -12,11 +12,11 @@ public class ImportedField { private final String fieldName; private final DocumentReference reference; - private final SDField targetField; + private final ImmutableSDField targetField; public ImportedField(String fieldName, DocumentReference reference, - SDField targetField) { + ImmutableSDField targetField) { this.fieldName = fieldName; this.reference = reference; this.targetField = targetField; @@ -30,7 +30,7 @@ public class ImportedField { return reference; } - public SDField targetField() { + public ImmutableSDField targetField() { return targetField; } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/ImportedFieldsResolver.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/ImportedFieldsResolver.java index 9997351d246..50e24e2f07d 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/ImportedFieldsResolver.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/ImportedFieldsResolver.java @@ -6,6 +6,7 @@ import com.yahoo.searchdefinition.DocumentReference; import com.yahoo.searchdefinition.DocumentReferences; import com.yahoo.searchdefinition.RankProfileRegistry; import com.yahoo.searchdefinition.Search; +import com.yahoo.searchdefinition.document.ImmutableSDField; import com.yahoo.searchdefinition.document.ImportedField; import com.yahoo.searchdefinition.document.ImportedFields; import com.yahoo.searchdefinition.document.SDField; @@ -39,7 +40,7 @@ public class ImportedFieldsResolver extends Processor { private void resolveImportedField(TemporaryImportedField importedField, boolean validate) { DocumentReference reference = validateDocumentReference(importedField); - SDField targetField = validateTargetField(importedField, reference, validate); + ImmutableSDField targetField = validateTargetField(importedField, reference, validate); importedFields.put(importedField.fieldName(), new ImportedField(importedField.fieldName(), reference, targetField)); } @@ -52,16 +53,12 @@ public class ImportedFieldsResolver extends Processor { return reference; } - private SDField validateTargetField(TemporaryImportedField importedField, - DocumentReference reference, - boolean validate) { + private ImmutableSDField validateTargetField(TemporaryImportedField importedField, + DocumentReference reference, + boolean validate) { String targetFieldName = importedField.targetFieldName(); Search targetSearch = reference.targetSearch(); - if (validate && isImportedField(targetSearch, targetFieldName)) { - fail(importedField, targetFieldAsString(targetFieldName, reference) + - ": Is an imported field. Not supported"); - } - SDField targetField = targetSearch.getConcreteField(targetFieldName); + ImmutableSDField targetField = targetSearch.getField(targetFieldName); if (targetField == null) { fail(importedField, targetFieldAsString(targetFieldName, reference) + ": Not found"); @@ -77,10 +74,6 @@ public class ImportedFieldsResolver extends Processor { return targetField; } - private static boolean isImportedField(Search targetSearch, String targetFieldName) { - return targetSearch.importedFields().isPresent() && targetSearch.importedFields().get().fields().containsKey(targetFieldName); - } - private static String targetFieldAsString(String targetFieldName, DocumentReference reference) { return "Field '" + targetFieldName + "' via reference field '" + reference.referenceField().getName() + "'"; } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/multifieldresolver/RankProfileTypeSettingsProcessor.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/multifieldresolver/RankProfileTypeSettingsProcessor.java index e402217cb9f..21567edb94b 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/multifieldresolver/RankProfileTypeSettingsProcessor.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/multifieldresolver/RankProfileTypeSettingsProcessor.java @@ -11,6 +11,7 @@ import com.yahoo.searchdefinition.RankProfile; import com.yahoo.searchdefinition.RankProfileRegistry; import com.yahoo.searchdefinition.Search; import com.yahoo.searchdefinition.document.Attribute; +import com.yahoo.searchdefinition.document.ImmutableSDField; import com.yahoo.searchdefinition.document.ImportedField; import com.yahoo.searchdefinition.document.ImportedFields; import com.yahoo.searchdefinition.document.SDField; @@ -57,7 +58,7 @@ public class RankProfileTypeSettingsProcessor extends Processor { } private void processImportedField(ImportedField field) { - SDField targetField = field.targetField(); + ImmutableSDField targetField = field.targetField(); Attribute attribute = targetField.getAttributes().get(targetField.getName()); if (attribute != null && attribute.tensorType().isPresent()) { addAttributeTypeToRankProfiles(field.fieldName(), attribute.tensorType().get().toString()); diff --git a/config-model/src/test/derived/importedfields/attributes.cfg b/config-model/src/test/derived/importedfields/attributes.cfg index f51bbc012b9..f1cfab59e65 100644 --- a/config-model/src/test/derived/importedfields/attributes.cfg +++ b/config-model/src/test/derived/importedfields/attributes.cfg @@ -158,3 +158,23 @@ attribute[].upperbound 300 attribute[].densepostinglistthreshold 0.4 attribute[].tensortype "" attribute[].imported true +attribute[].name "my_ancient_int_field" +attribute[].datatype INT32 +attribute[].collectiontype SINGLE +attribute[].removeifzero false +attribute[].createifnonexistent false +attribute[].fastsearch false +attribute[].huge false +attribute[].sortascending true +attribute[].sortfunction UCA +attribute[].sortstrength PRIMARY +attribute[].sortlocale "" +attribute[].enablebitvectors false +attribute[].enableonlybitvector false +attribute[].fastaccess false +attribute[].arity 8 +attribute[].lowerbound -9223372036854775808 +attribute[].upperbound 9223372036854775807 +attribute[].densepostinglistthreshold 0.4 +attribute[].tensortype "" +attribute[].imported true diff --git a/config-model/src/test/derived/importedfields/child.sd b/config-model/src/test/derived/importedfields/child.sd index 07fa7d15719..e7a2953506c 100644 --- a/config-model/src/test/derived/importedfields/child.sd +++ b/config-model/src/test/derived/importedfields/child.sd @@ -10,9 +10,10 @@ search child { import field a_ref.int_array_field as my_int_array_field {} import field a_ref.int_wset_field as my_int_wset_field {} import field a_ref.predicate_field as my_predicate_field {} + import field a_ref.ancient_int_field as my_ancient_int_field {} fieldset myfieldset { - fields: my_int_field, my_string_field + fields: my_int_field, my_string_field, my_ancient_int_field } document-summary mysummary { @@ -22,5 +23,6 @@ search child { summary my_string_field type string {} summary my_int_array_field type array<int> {} summary my_int_wset_field type weightedset<int> {} + summary my_ancient_int_field type int {} } } diff --git a/config-model/src/test/derived/importedfields/grandparent.sd b/config-model/src/test/derived/importedfields/grandparent.sd new file mode 100644 index 00000000000..9e0e628f742 --- /dev/null +++ b/config-model/src/test/derived/importedfields/grandparent.sd @@ -0,0 +1,8 @@ +# Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +search grandparent { + document grandparent { + field int_field type int { + indexing: attribute + } + } +} diff --git a/config-model/src/test/derived/importedfields/imported-fields.cfg b/config-model/src/test/derived/importedfields/imported-fields.cfg index 59413ca5eb7..2c36fee177d 100644 --- a/config-model/src/test/derived/importedfields/imported-fields.cfg +++ b/config-model/src/test/derived/importedfields/imported-fields.cfg @@ -23,3 +23,8 @@ attribute[].referencefield "a_ref" attribute[].targetfield "predicate_field" attribute[].datatype NONE attribute[].collectiontype SINGLE +attribute[].name "my_ancient_int_field" +attribute[].referencefield "a_ref" +attribute[].targetfield "ancient_int_field" +attribute[].datatype NONE +attribute[].collectiontype SINGLE diff --git a/config-model/src/test/derived/importedfields/index-info.cfg b/config-model/src/test/derived/importedfields/index-info.cfg index adba0036409..9291956447b 100644 --- a/config-model/src/test/derived/importedfields/index-info.cfg +++ b/config-model/src/test/derived/importedfields/index-info.cfg @@ -55,6 +55,12 @@ indexinfo[].command[].indexname "my_predicate_field" indexinfo[].command[].command "index" indexinfo[].command[].indexname "my_predicate_field" indexinfo[].command[].command "attribute" +indexinfo[].command[].indexname "my_ancient_int_field" +indexinfo[].command[].command "index" +indexinfo[].command[].indexname "my_ancient_int_field" +indexinfo[].command[].command "attribute" +indexinfo[].command[].indexname "my_ancient_int_field" +indexinfo[].command[].command "numerical" indexinfo[].command[].indexname "myfieldset" indexinfo[].command[].command "attribute" indexinfo[].command[].indexname "myfieldset" diff --git a/config-model/src/test/derived/importedfields/indexschema.cfg b/config-model/src/test/derived/importedfields/indexschema.cfg index 5905de5e42e..9d479cefcd4 100644 --- a/config-model/src/test/derived/importedfields/indexschema.cfg +++ b/config-model/src/test/derived/importedfields/indexschema.cfg @@ -1,3 +1,4 @@ fieldset[].name "myfieldset" +fieldset[].field[].name "my_ancient_int_field" fieldset[].field[].name "my_int_field" fieldset[].field[].name "my_string_field" diff --git a/config-model/src/test/derived/importedfields/parent_a.sd b/config-model/src/test/derived/importedfields/parent_a.sd index edc81df5609..4950e5e01c3 100644 --- a/config-model/src/test/derived/importedfields/parent_a.sd +++ b/config-model/src/test/derived/importedfields/parent_a.sd @@ -1,6 +1,9 @@ # Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. search parent_a { document parent_a { + field grandparent_ref type reference<grandparent> { + indexing: attribute + } field int_field type int { indexing: attribute } @@ -19,4 +22,5 @@ search parent_a { } } } + import field grandparent_ref.int_field as ancient_int_field {} } diff --git a/config-model/src/test/derived/importedfields/summary.cfg b/config-model/src/test/derived/importedfields/summary.cfg index 17bb1fd1e23..68ad270a314 100644 --- a/config-model/src/test/derived/importedfields/summary.cfg +++ b/config-model/src/test/derived/importedfields/summary.cfg @@ -9,7 +9,7 @@ classes[].fields[].name "summaryfeatures" classes[].fields[].type "featuredata" classes[].fields[].name "documentid" classes[].fields[].type "longstring" -classes[].id 762794406 +classes[].id 1660388492 classes[].name "mysummary" classes[].fields[].name "a_ref" classes[].fields[].type "longstring" @@ -23,6 +23,8 @@ classes[].fields[].name "my_int_array_field" classes[].fields[].type "jsonstring" classes[].fields[].name "my_int_wset_field" classes[].fields[].type "jsonstring" +classes[].fields[].name "my_ancient_int_field" +classes[].fields[].type "integer" classes[].fields[].name "rankfeatures" classes[].fields[].type "featuredata" classes[].fields[].name "summaryfeatures" diff --git a/config-model/src/test/derived/importedfields/summarymap.cfg b/config-model/src/test/derived/importedfields/summarymap.cfg index 84f76490dd9..d038e2313a8 100644 --- a/config-model/src/test/derived/importedfields/summarymap.cfg +++ b/config-model/src/test/derived/importedfields/summarymap.cfg @@ -11,6 +11,9 @@ override[].arguments "my_int_array_field" override[].field "my_int_wset_field" override[].command "attribute" override[].arguments "my_int_wset_field" +override[].field "my_ancient_int_field" +override[].command "attribute" +override[].arguments "my_ancient_int_field" override[].field "rankfeatures" override[].command "rankfeatures" override[].arguments "" diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/processing/ImportedFieldsResolverTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/processing/ImportedFieldsResolverTestCase.java index ff801c122b2..815f696acdc 100644 --- a/config-model/src/test/java/com/yahoo/searchdefinition/processing/ImportedFieldsResolverTestCase.java +++ b/config-model/src/test/java/com/yahoo/searchdefinition/processing/ImportedFieldsResolverTestCase.java @@ -11,6 +11,8 @@ import com.yahoo.document.TensorDataType; import com.yahoo.searchdefinition.DocumentReference; import com.yahoo.searchdefinition.DocumentReferences; import com.yahoo.searchdefinition.Search; +import com.yahoo.searchdefinition.document.ImmutableImportedSDField; +import com.yahoo.searchdefinition.document.ImmutableSDField; import com.yahoo.searchdefinition.document.ImportedField; import com.yahoo.searchdefinition.document.ImportedFields; import com.yahoo.searchdefinition.document.SDDocumentType; @@ -48,13 +50,23 @@ public class ImportedFieldsResolverTestCase { assertEquals(fieldName, myField.fieldName()); assertSame(model.childSearch.getConcreteField("ref"), myField.reference().referenceField()); assertSame(model.parentSearch, myField.reference().targetSearch()); - assertSame(model.parentSearch.getConcreteField(targetFieldName), myField.targetField()); + ImmutableSDField targetField = model.parentSearch.getField(targetFieldName); + if (targetField instanceof SDField) { + assertSame(targetField, myField.targetField()); + } else { + assertSame(getImportedField(targetField), getImportedField(myField.targetField())); + } + } + + private static ImportedField getImportedField(ImmutableSDField field) { + return ((ImmutableImportedSDField) field).getImportedField(); } @Test public void valid_imported_fields_are_resolved() { - resolve_imported_field("my_attribute_field", "attribute_field"); - resolve_imported_field("my_tensor_field", "tensor_field"); + resolve_imported_field("my_attribute_field", "attribute_field"); + resolve_imported_field("my_tensor_field", "tensor_field"); + resolve_imported_field("my_ancient_field", "ancient_field"); } @Test @@ -92,17 +104,6 @@ public class ImportedFieldsResolverTestCase { .resolve(); } - @Test - public void resolver_fails_if_imported_field_is_also_an_imported_field() { - exceptionRule.expect(IllegalArgumentException.class); - exceptionRule.expectMessage( - "For search 'child', import field 'my_ancient_field': " + - "Field 'ancient_field' via reference field 'ref': Is an imported field. Not supported"); - new SearchModel() - .addImportedField("my_ancient_field", "ref", "ancient_field") - .resolve(); - } - static class SearchModel { private final ApplicationPackage app = MockApplicationPackage.createEmpty(); |