diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2017-01-17 14:43:50 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2017-01-17 14:43:50 +0100 |
commit | 587eb2de3c1139dd681b444e4ae3df03ad4a9b34 (patch) | |
tree | 740a5c01de11278b251fa26cc9af0d8a368e98e7 /config-model | |
parent | 7c136a06e1a792a1147417db02d7999290bb945a (diff) |
Relax summary field tensor type compatibility check
Diffstat (limited to 'config-model')
4 files changed, 64 insertions, 51 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/IndexingValidation.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/IndexingValidation.java index d8b95391ecb..a35be31298b 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/IndexingValidation.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/IndexingValidation.java @@ -145,4 +145,5 @@ public class IndexingValidation extends Processor { } } } + } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryConsistency.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryConsistency.java index bb8d1f8a3fe..c946fd59e78 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryConsistency.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryConsistency.java @@ -2,6 +2,8 @@ package com.yahoo.searchdefinition.processing; import com.yahoo.config.application.api.DeployLogger; +import com.yahoo.document.DataType; +import com.yahoo.document.TensorDataType; import com.yahoo.searchdefinition.RankProfileRegistry; import com.yahoo.searchdefinition.document.Attribute; import com.yahoo.document.WeightedSetDataType; @@ -28,46 +30,54 @@ public class SummaryConsistency extends Processor { for (DocumentSummary summary : search.getSummaries().values()) { if (summary.getName().equals("default")) continue; for (SummaryField summaryField : summary.getSummaryFields() ) { - assertConsistency(summaryField,search); - makeAttributeTransformIfAppropriate(summaryField,search); + assertConsistency(summaryField, search); + makeAttributeTransformIfAppropriate(summaryField, search); } } } /** If the source is an attribute, make this use the attribute transform */ private void makeAttributeTransformIfAppropriate(SummaryField summaryField,Search search) { - if (summaryField.getTransform()!=SummaryTransform.NONE) return; - Attribute attribute=search.getAttribute(summaryField.getSingleSource()); - if (attribute==null) return; + if (summaryField.getTransform() != SummaryTransform.NONE) return; + Attribute attribute = search.getAttribute(summaryField.getSingleSource()); + if (attribute == null) return; summaryField.setTransform(SummaryTransform.ATTRIBUTE); } - private void assertConsistency(SummaryField summaryField,Search search) { - SummaryField existingDefault=search.getSummary("default").getSummaryField(summaryField.getName()); // Compare to default - if (existingDefault!=null) { - assertConsistentTypes(existingDefault,summaryField); - makeConsistentWithDefaultOrThrow(existingDefault,summaryField); + private void assertConsistency(SummaryField summaryField, Search search) { + SummaryField existingDefault = search.getSummary("default").getSummaryField(summaryField.getName()); // Compare to default + if (existingDefault != null) { + assertConsistentTypes(existingDefault, summaryField); + makeConsistentWithDefaultOrThrow(existingDefault, summaryField); } else { // If no default, compare to whichever definition of the field - SummaryField existing=search.getExplicitSummaryField(summaryField.getName()); - if (existing==null) return; - assertConsistentTypes(existing,summaryField); - makeConsistentOrThrow(existing,summaryField,search); + SummaryField existing = search.getExplicitSummaryField(summaryField.getName()); + if (existing == null) return; + assertConsistentTypes(existing, summaryField); + makeConsistentOrThrow(existing, summaryField, search); } } - private void assertConsistentTypes(SummaryField field1,SummaryField field2) { - if (field1.getDataType() instanceof WeightedSetDataType && field2.getDataType() instanceof WeightedSetDataType && - ((WeightedSetDataType)field1.getDataType()).getNestedType().equals(((WeightedSetDataType)field2.getDataType()).getNestedType())) + private void assertConsistentTypes(SummaryField existing, SummaryField seen) { + if (existing.getDataType() instanceof WeightedSetDataType && seen.getDataType() instanceof WeightedSetDataType && + ((WeightedSetDataType)existing.getDataType()).getNestedType().equals(((WeightedSetDataType)seen.getDataType()).getNestedType())) return; // Disregard create-if-nonexistent and create-if-zero distinction - if ( ! field1.getDataType().equals(field2.getDataType())) - throw new IllegalArgumentException(field1.toLocateString() + " is inconsistent with " + field2.toLocateString() + ": All declarations of the same summary field must have the same type"); + if ( ! compatibleTypes(seen.getDataType(), existing.getDataType())) + throw new IllegalArgumentException(existing.toLocateString() + " is inconsistent with " + + seen.toLocateString() + ": All declarations of the same summary field must have the same type"); } - private void makeConsistentOrThrow(SummaryField field1, SummaryField field2,Search search) { - if (field2.getTransform()==SummaryTransform.ATTRIBUTE && field1.getTransform()==SummaryTransform.NONE) { - Attribute attribute=search.getAttribute(field1.getName()); + private boolean compatibleTypes(DataType summaryType, DataType existingType) { + if (summaryType instanceof TensorDataType && existingType instanceof TensorDataType) { + return summaryType.isAssignableFrom(existingType); // TODO: Just do this for all types + } + return summaryType.equals(existingType); + } + + private void makeConsistentOrThrow(SummaryField field1, SummaryField field2, Search search) { + if (field2.getTransform() == SummaryTransform.ATTRIBUTE && field1.getTransform() == SummaryTransform.NONE) { + Attribute attribute = search.getAttribute(field1.getName()); if (attribute != null) { field1.setTransform(SummaryTransform.ATTRIBUTE); } @@ -80,7 +90,7 @@ public class SummaryConsistency extends Processor { assertEqualTransform(field1,field2); } } - private void makeConsistentWithDefaultOrThrow(SummaryField defaultField,SummaryField newField) { + private void makeConsistentWithDefaultOrThrow(SummaryField defaultField, SummaryField newField) { if (newField.getTransform().equals(SummaryTransform.NONE)) { newField.setTransform(defaultField.getTransform()); } @@ -90,8 +100,8 @@ public class SummaryConsistency extends Processor { } - private void assertEqualTransform(SummaryField field1,SummaryField field2) { - if (!field2.getTransform().equals(field1.getTransform())) { + private void assertEqualTransform(SummaryField field1, SummaryField field2) { + if ( ! field2.getTransform().equals(field1.getTransform())) { throw new IllegalArgumentException("Conflicting summary transforms. " + field2 +" is already defined as " + field1 + ". A field with the same name " + "can not have different transforms in different summary classes"); diff --git a/config-model/src/test/derived/tensor/summary.cfg b/config-model/src/test/derived/tensor/summary.cfg index b6d00bc4799..212895d7686 100644 --- a/config-model/src/test/derived/tensor/summary.cfg +++ b/config-model/src/test/derived/tensor/summary.cfg @@ -1,25 +1,27 @@ -defaultsummaryid 657634105 -classes[0].id 657634105 -classes[0].name "default" -classes[0].fields[0].name "f1" -classes[0].fields[0].type "jsonstring" -classes[0].fields[1].name "f3" -classes[0].fields[1].type "jsonstring" -classes[0].fields[2].name "rankfeatures" -classes[0].fields[2].type "featuredata" -classes[0].fields[3].name "summaryfeatures" -classes[0].fields[3].type "featuredata" -classes[0].fields[4].name "documentid" -classes[0].fields[4].type "longstring" -classes[1].id 457955124 -classes[1].name "attributeprefetch" -classes[1].fields[0].name "f2" -classes[1].fields[0].type "jsonstring" -classes[1].fields[1].name "f3" -classes[1].fields[1].type "jsonstring" -classes[1].fields[2].name "f4" -classes[1].fields[2].type "jsonstring" -classes[1].fields[3].name "rankfeatures" -classes[1].fields[3].type "featuredata" -classes[1].fields[4].name "summaryfeatures" -classes[1].fields[4].type "featuredata"
\ No newline at end of file +defaultsummaryid 1113059691 +classes[].id 1113059691 +classes[].name "default" +classes[].fields[].name "f1" +classes[].fields[].type "jsonstring" +classes[].fields[].name "f3" +classes[].fields[].type "jsonstring" +classes[].fields[].name "f4" +classes[].fields[].type "jsonstring" +classes[].fields[].name "rankfeatures" +classes[].fields[].type "featuredata" +classes[].fields[].name "summaryfeatures" +classes[].fields[].type "featuredata" +classes[].fields[].name "documentid" +classes[].fields[].type "longstring" +classes[].id 457955124 +classes[].name "attributeprefetch" +classes[].fields[].name "f2" +classes[].fields[].type "jsonstring" +classes[].fields[].name "f3" +classes[].fields[].type "jsonstring" +classes[].fields[].name "f4" +classes[].fields[].type "jsonstring" +classes[].fields[].name "rankfeatures" +classes[].fields[].type "featuredata" +classes[].fields[].name "summaryfeatures" +classes[].fields[].type "featuredata"
\ No newline at end of file diff --git a/config-model/src/test/derived/tensor/tensor.sd b/config-model/src/test/derived/tensor/tensor.sd index 18f1245e0b4..8b779147ddd 100644 --- a/config-model/src/test/derived/tensor/tensor.sd +++ b/config-model/src/test/derived/tensor/tensor.sd @@ -12,7 +12,7 @@ search tensor { indexing: attribute | summary } field f4 type tensor(x[],y[]) { - indexing: attribute + indexing: attribute | summary attribute: tensor(x[10],y[20]) } } |