summaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorGeir Storli <geirst@oath.com>2018-04-23 16:26:14 +0200
committerGeir Storli <geirst@oath.com>2018-04-23 16:26:14 +0200
commit09c54b6fdd0a19e4edbb02dba48428ed9f35e55b (patch)
treeba4f094240d4685788f779aac8b92c636fa9ff16 /config-model
parent3cd5365b10b30b0be89ed3a286510e5ffcf8f441 (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')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/document/ImmutableImportedSDField.java4
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/document/ImportedField.java6
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/processing/ImportedFieldsResolver.java19
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/processing/multifieldresolver/RankProfileTypeSettingsProcessor.java3
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/processing/ImportedFieldsResolverTestCase.java29
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();