diff options
author | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2022-03-30 14:58:29 +0200 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2022-03-30 14:58:29 +0200 |
commit | fcce4495945d2009e3022e137152ddacfe680c97 (patch) | |
tree | 5061d60717925aa0c5d229d88f2abce1137dbbd1 /container-search | |
parent | 93859fca3e5ed153d0503fe0c4354e6a9cabac29 (diff) |
Add query parameter for default precision factor
Diffstat (limited to 'container-search')
6 files changed, 39 insertions, 1 deletions
diff --git a/container-search/abi-spec.json b/container-search/abi-spec.json index 7cc7168c79a..4ffc4825390 100644 --- a/container-search/abi-spec.json +++ b/container-search/abi-spec.json @@ -2347,7 +2347,8 @@ "public static final com.yahoo.processing.request.CompoundName PARAM_REQUEST", "public static final com.yahoo.processing.request.CompoundName PARAM_TIMEZONE", "public static final com.yahoo.processing.request.CompoundName PARAM_DEFAULT_MAX_HITS", - "public static final com.yahoo.processing.request.CompoundName PARAM_DEFAULT_MAX_GROUPS" + "public static final com.yahoo.processing.request.CompoundName PARAM_DEFAULT_MAX_GROUPS", + "public static final com.yahoo.processing.request.CompoundName PARAM_DEFAULT_PRECISION_FACTOR" ] }, "com.yahoo.search.grouping.GroupingRequest": { @@ -2371,6 +2372,7 @@ "public void setDefaultMaxGroups(int)", "public java.util.OptionalLong globalMaxGroups()", "public void setGlobalMaxGroups(long)", + "public java.util.OptionalDouble defaultPrecisionFactor()", "public static com.yahoo.search.grouping.GroupingRequest newInstance(com.yahoo.search.Query)", "public java.lang.String toString()" ], diff --git a/container-search/src/main/java/com/yahoo/search/grouping/GroupingQueryParser.java b/container-search/src/main/java/com/yahoo/search/grouping/GroupingQueryParser.java index ee78e41d0d8..b76a856bb66 100644 --- a/container-search/src/main/java/com/yahoo/search/grouping/GroupingQueryParser.java +++ b/container-search/src/main/java/com/yahoo/search/grouping/GroupingQueryParser.java @@ -41,6 +41,7 @@ public class GroupingQueryParser extends Searcher { public static final CompoundName PARAM_TIMEZONE = new CompoundName("timezone"); @Beta public static final CompoundName PARAM_DEFAULT_MAX_HITS = new CompoundName("grouping.defaultMaxHits"); @Beta public static final CompoundName PARAM_DEFAULT_MAX_GROUPS = new CompoundName("grouping.defaultMaxGroups"); + @Beta public static final CompoundName PARAM_DEFAULT_PRECISION_FACTOR = new CompoundName("grouping.defaultPrecisionFactor"); private static final ThreadLocal<ZoneCache> zoneCache = new ThreadLocal<>(); @Override @@ -63,6 +64,7 @@ public class GroupingQueryParser extends Searcher { grpRequest.setDefaultMaxGroups(query.properties().getInteger(PARAM_DEFAULT_MAX_GROUPS, -1)); grpRequest.setDefaultMaxHits(query.properties().getInteger(PARAM_DEFAULT_MAX_HITS, -1)); grpRequest.setGlobalMaxGroups(query.properties().getLong(DefaultProperties.GROUPING_GLOBAL_MAX_GROUPS)); + grpRequest.setDefaultPrecisionFactor(query.properties().getDouble(PARAM_DEFAULT_PRECISION_FACTOR, 0.0)); } return execution.search(query); } diff --git a/container-search/src/main/java/com/yahoo/search/grouping/GroupingRequest.java b/container-search/src/main/java/com/yahoo/search/grouping/GroupingRequest.java index 9f5deb482db..5250f264423 100644 --- a/container-search/src/main/java/com/yahoo/search/grouping/GroupingRequest.java +++ b/container-search/src/main/java/com/yahoo/search/grouping/GroupingRequest.java @@ -14,6 +14,7 @@ import com.yahoo.search.result.Hit; import java.util.ArrayList; import java.util.List; +import java.util.OptionalDouble; import java.util.OptionalInt; import java.util.OptionalLong; import java.util.TimeZone; @@ -36,6 +37,7 @@ public class GroupingRequest { private int defaultMaxHits = -1; private int defaultMaxGroups = -1; private long globalMaxGroups = -1; + private double defaultPrecisionFactor = -1; private GroupingRequest(Select parent) { this.parent = parent; @@ -164,6 +166,13 @@ public class GroupingRequest { @Beta public void setGlobalMaxGroups(long v) { this.globalMaxGroups = v; } + @Beta + public OptionalDouble defaultPrecisionFactor() { + return defaultPrecisionFactor > 0 ? OptionalDouble.of(defaultPrecisionFactor) : OptionalDouble.empty(); + } + + @Beta void setDefaultPrecisionFactor(double v) { this.defaultPrecisionFactor = v; } + /** * Creates a new grouping request and adds it to the query.getSelect().getGrouping() list * diff --git a/container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java b/container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java index c7000c0cdcf..32601c4faa4 100644 --- a/container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java +++ b/container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java @@ -153,6 +153,7 @@ public class GroupingExecutor extends Searcher { req.defaultMaxGroups().ifPresent(builder::setDefaultMaxGroups); req.defaultMaxHits().ifPresent(builder::setDefaultMaxHits); req.globalMaxGroups().ifPresent(builder::setGlobalMaxGroups); + req.defaultPrecisionFactor().ifPresent(builder::setDefaultPrecisionFactor); builder.build(); RequestContext ctx = new RequestContext(req, builder.getTransform()); diff --git a/container-search/src/main/java/com/yahoo/search/grouping/vespa/RequestBuilder.java b/container-search/src/main/java/com/yahoo/search/grouping/vespa/RequestBuilder.java index b013e87fb24..a88450c7d1d 100644 --- a/container-search/src/main/java/com/yahoo/search/grouping/vespa/RequestBuilder.java +++ b/container-search/src/main/java/com/yahoo/search/grouping/vespa/RequestBuilder.java @@ -44,6 +44,7 @@ class RequestBuilder { private int defaultMaxGroups = -1; private long globalMaxGroups = -1; private long totalGroupsAndSummaries = -1; + private double defaultPrecisionFactor = -1; /** * Constructs a new instance of this class. @@ -162,6 +163,8 @@ class RequestBuilder { public RequestBuilder setGlobalMaxGroups(long v) { this.globalMaxGroups = v; return this; } + public RequestBuilder setDefaultPrecisionFactor(double v) { this.defaultPrecisionFactor = v; return this; } + OptionalLong totalGroupsAndSummaries() { return totalGroupsAndSummaries != -1 ? OptionalLong.of(totalGroupsAndSummaries) : OptionalLong.empty(); } @@ -337,6 +340,8 @@ class RequestBuilder { int precision = frame.astNode.getPrecision(); if (precision > 0) { frame.state.precision = precision; + } else if (frame.state.max != null && defaultPrecisionFactor > 0) { + frame.state.precision = Math.max(1, (int) Math.ceil(frame.state.max * defaultPrecisionFactor)); } } diff --git a/container-search/src/test/java/com/yahoo/search/grouping/vespa/RequestBuilderTestCase.java b/container-search/src/test/java/com/yahoo/search/grouping/vespa/RequestBuilderTestCase.java index ccf11d82541..5fa086c2ed1 100644 --- a/container-search/src/test/java/com/yahoo/search/grouping/vespa/RequestBuilderTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/grouping/vespa/RequestBuilderTestCase.java @@ -789,6 +789,25 @@ public class RequestBuilderTestCase { assertQueryFailsOnGlobalMax(Long.MAX_VALUE, "all(group(a) max(5) each(each(output(summary()))))", "unbounded number of summaries"); } + @Test + public void require_that_default_precision_factor_overrides_implicit_precision() { + int factor = 3; + RequestBuilder builder = new RequestBuilder(0) + .setDefaultPrecisionFactor(factor) + .setRootOperation(GroupingOperation.fromString("all(group(foo)max(5)each(output(count())))")); + builder.build(); + assertEquals(5 * factor, builder.getRequestList().get(0).getLevels().get(0).getPrecision()); + } + + @Test + public void require_that_explicit_precision_has_precedence() { + RequestBuilder builder = new RequestBuilder(0) + .setDefaultPrecisionFactor(3) + .setRootOperation(GroupingOperation.fromString("all(group(foo)max(5)precision(10)each(output(count())))")); + builder.build(); + assertEquals(10, builder.getRequestList().get(0).getLevels().get(0).getPrecision()); + } + private static void assertTotalGroupsAndSummaries(long expected, String query) { RequestBuilder builder = new RequestBuilder(0) .setRootOperation(GroupingOperation.fromString(query)).setGlobalMaxGroups(Long.MAX_VALUE); |