summaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2017-01-17 14:43:50 +0100
committerJon Bratseth <bratseth@yahoo-inc.com>2017-01-17 14:43:50 +0100
commit587eb2de3c1139dd681b444e4ae3df03ad4a9b34 (patch)
tree740a5c01de11278b251fa26cc9af0d8a368e98e7 /config-model
parent7c136a06e1a792a1147417db02d7999290bb945a (diff)
Relax summary field tensor type compatibility check
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/processing/IndexingValidation.java1
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/processing/SummaryConsistency.java60
-rw-r--r--config-model/src/test/derived/tensor/summary.cfg52
-rw-r--r--config-model/src/test/derived/tensor/tensor.sd2
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])
}
}