diff options
author | Tor Egge <tegge@oath.com> | 2018-12-06 11:23:47 +0000 |
---|---|---|
committer | Tor Egge <tegge@oath.com> | 2018-12-06 14:20:58 +0000 |
commit | 25e42a83b6b6ee919bc887ec29d7dff8422cff93 (patch) | |
tree | 16e7bac47ef9f3381fbc71111bbfdd4744068ed6 /config-model | |
parent | 467b2e387ada478e06a568be7a92cbf5228f6a48 (diff) |
Allow position summary with no attribute if field is not imported and
summary field name matches source.
Diffstat (limited to 'config-model')
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(); |