aboutsummaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2022-03-30 14:58:29 +0200
committerBjørn Christian Seime <bjorncs@verizonmedia.com>2022-03-30 14:58:29 +0200
commitfcce4495945d2009e3022e137152ddacfe680c97 (patch)
tree5061d60717925aa0c5d229d88f2abce1137dbbd1 /container-search
parent93859fca3e5ed153d0503fe0c4354e6a9cabac29 (diff)
Add query parameter for default precision factor
Diffstat (limited to 'container-search')
-rw-r--r--container-search/abi-spec.json4
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/GroupingQueryParser.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/GroupingRequest.java9
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java1
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/vespa/RequestBuilder.java5
-rw-r--r--container-search/src/test/java/com/yahoo/search/grouping/vespa/RequestBuilderTestCase.java19
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);