diff options
author | Geir Storli <geirst@oath.com> | 2018-04-23 16:26:14 +0200 |
---|---|---|
committer | Geir Storli <geirst@oath.com> | 2018-04-23 16:26:14 +0200 |
commit | 09c54b6fdd0a19e4edbb02dba48428ed9f35e55b (patch) | |
tree | ba4f094240d4685788f779aac8b92c636fa9ff16 /config-model | |
parent | 3cd5365b10b30b0be89ed3a286510e5ffcf8f441 (diff) |
Allow importing a field from a parent document type that also is imported.
This functionality is now supported by the search backend.
Diffstat (limited to 'config-model')
5 files changed, 30 insertions, 31 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/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(); |