summaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorTor Egge <tegge@oath.com>2018-12-06 11:23:47 +0000
committerTor Egge <tegge@oath.com>2018-12-06 14:20:58 +0000
commit25e42a83b6b6ee919bc887ec29d7dff8422cff93 (patch)
tree16e7bac47ef9f3381fbc71111bbfdd4744068ed6 /config-model
parent467b2e387ada478e06a568be7a92cbf5228f6a48 (diff)
Allow position summary with no attribute if field is not imported and
summary field name matches source.
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/processing/AdjustPositionSummaryFields.java53
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/processing/AdjustPositionSummaryFieldsTestCase.java28
2 files changed, 61 insertions, 20 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/AdjustPositionSummaryFields.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/AdjustPositionSummaryFields.java
index e847a5428c0..0bc9a517d2e 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/AdjustPositionSummaryFields.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/AdjustPositionSummaryFields.java
@@ -2,6 +2,7 @@
package com.yahoo.searchdefinition.processing;
import com.yahoo.config.application.api.DeployLogger;
+import com.yahoo.document.ArrayDataType;
import com.yahoo.document.DataType;
import com.yahoo.document.PositionDataType;
import com.yahoo.searchdefinition.RankProfileRegistry;
@@ -31,30 +32,33 @@ public class AdjustPositionSummaryFields extends Processor {
@Override
public void process(boolean validate, boolean documentsOnly) {
- List<SummaryField> fixupFields = new LinkedList<SummaryField>();
for (DocumentSummary summary : search.getSummaries().values()) {
- scanSummary(summary, fixupFields);
- }
- for (SummaryField summaryField : fixupFields) {
- String originalSource = summaryField.getSingleSource();
- summaryField.getSources().clear();
- summaryField.addSource(PositionDataType.getZCurveFieldName(originalSource));
+ scanSummary(summary);
}
}
- private void scanSummary(DocumentSummary summary, List<SummaryField> fixupFields) {
+ private void scanSummary(DocumentSummary summary) {
for (SummaryField summaryField : summary.getSummaryFields()) {
if (isPositionDataType(summaryField.getDataType())) {
String originalSource = summaryField.getSingleSource();
- ImmutableSDField sourceField = getSourceField(originalSource);
- if (sourceField != null && sourceField.getDataType().equals(summaryField.getDataType())) {
- String zCurve = PositionDataType.getZCurveFieldName(originalSource);
- if (hasPositionAttribute(zCurve)) {
- Source source = new Source(zCurve);
- adjustPositionField(summary, summaryField, source);
- fixupFields.add(summaryField);
- } else {
- fail(summaryField, "No position attribute '" + zCurve + "'");
+ if (originalSource.indexOf('.') == -1) { // Eliminate summary fields with pos.x or pos.y as source
+ ImmutableSDField sourceField = getSourceField(originalSource);
+ if (sourceField != null) {
+ String zCurve = null;
+ if (sourceField.getDataType().equals(summaryField.getDataType())) {
+ zCurve = PositionDataType.getZCurveFieldName(originalSource);
+ } else if (sourceField.getDataType().equals(makeZCurveDataType(summaryField.getDataType())) &&
+ hasZCurveSuffix(originalSource)) {
+ zCurve = originalSource;
+ }
+ if (zCurve != null) {
+ if (hasPositionAttribute(zCurve)) {
+ Source source = new Source(zCurve);
+ adjustPositionField(summary, summaryField, source);
+ } else if (sourceField.isImportedField() || !summaryField.getName().equals(originalSource)) {
+ fail(summaryField, "No position attribute '" + zCurve + "'");
+ }
+ }
}
}
}
@@ -62,9 +66,9 @@ public class AdjustPositionSummaryFields extends Processor {
}
private void adjustPositionField(DocumentSummary summary, SummaryField summaryField, Source source) {
- if (summaryField.getTransform() == SummaryTransform.NONE) {
- summaryField.setTransform(SummaryTransform.GEOPOS);
- }
+ summaryField.setTransform(SummaryTransform.GEOPOS);
+ summaryField.getSources().clear();
+ summaryField.addSource(source);
ensureSummaryField(summary, PositionDataType.getPositionSummaryFieldName(summaryField.getName()),
DataType.getArray(DataType.STRING), source, SummaryTransform.POSITIONS);
ensureSummaryField(summary, PositionDataType.getDistanceSummaryFieldName(summaryField.getName()),
@@ -116,10 +120,19 @@ public class AdjustPositionSummaryFields extends Processor {
return attribute != null && attribute.isPosition();
}
+ private static boolean hasZCurveSuffix(String name) {
+ String suffix = PositionDataType.getZCurveFieldName("");
+ return name.length() > suffix.length() && name.substring(name.length() - suffix.length()).equals(suffix);
+ }
+
private static boolean isPositionDataType(DataType dataType) {
return dataType.equals(PositionDataType.INSTANCE) || dataType.equals(DataType.getArray(PositionDataType.INSTANCE));
}
+ private static DataType makeZCurveDataType(DataType dataType) {
+ return dataType instanceof ArrayDataType ? DataType.getArray(DataType.LONG) : DataType.LONG;
+ }
+
private void fail(SummaryField summaryField, String msg) {
throw newProcessException(search.getName(), summaryField.getName(), msg);
}
diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/processing/AdjustPositionSummaryFieldsTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/processing/AdjustPositionSummaryFieldsTestCase.java
index 00df42d60c3..a385ed09809 100644
--- a/config-model/src/test/java/com/yahoo/searchdefinition/processing/AdjustPositionSummaryFieldsTestCase.java
+++ b/config-model/src/test/java/com/yahoo/searchdefinition/processing/AdjustPositionSummaryFieldsTestCase.java
@@ -54,6 +54,7 @@ public class AdjustPositionSummaryFieldsTestCase {
SearchModel model = new SearchModel();
model.addSummaryField("my_pos", PositionDataType.INSTANCE, null, "pos");
model.resolve();
+ // SummaryFieldsMustHaveValidSource processing not run in this test.
model.assertSummaryField("my_pos", PositionDataType.INSTANCE, SummaryTransform.NONE, "pos");
model.assertNoSummaryField("my_pos.position");
model.assertNoSummaryField("my_pos.distance");
@@ -69,6 +70,33 @@ public class AdjustPositionSummaryFieldsTestCase {
model.assertNoSummaryField("my_pos.distance");
}
+ @Test
+ public void test_pos_summary_no_attr_no_rename() {
+ SearchModel model = new SearchModel(false, false, false);
+ model.addSummaryField("pos", PositionDataType.INSTANCE, null, "pos");
+ model.resolve();
+ model.assertSummaryField("pos", PositionDataType.INSTANCE, SummaryTransform.NONE, "pos");
+ model.assertNoSummaryField("pos.position");
+ model.assertNoSummaryField("pos.distance");
+ }
+
+ @Test
+ public void test_pos_default_summary_no_attr_no_rename() {
+ SearchModel model = new SearchModel(false, false, false);
+ model.resolve();
+ assertNull(model.childSearch.getSummary("default")); // ImplicitSummaries processing not run in this test
+ }
+
+ @Test
+ public void test_pos_summary_no_rename() {
+ SearchModel model = new SearchModel(false, true, false);
+ model.addSummaryField("pos", PositionDataType.INSTANCE, null, "pos");
+ model.resolve();
+ model.assertSummaryField("pos", PositionDataType.INSTANCE, SummaryTransform.GEOPOS, "pos_zcurve");
+ model.assertSummaryField("pos.position", DataType.getArray(DataType.STRING), SummaryTransform.POSITIONS, "pos_zcurve");
+ model.assertSummaryField("pos.distance", DataType.INT, SummaryTransform.DISTANCE, "pos_zcurve");
+ }
+
@Rule
public final ExpectedException exceptionRule = ExpectedException.none();