summaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@yahoo-inc.com>2017-05-04 12:34:10 +0000
committerBjørn Christian Seime <bjorncs@yahoo-inc.com>2017-05-08 12:59:40 +0200
commitbd9d968854e1723b8f09f6d9ba320e9b3daf774e (patch)
tree0c11f46a573c37b5bf234c14dcfca0af36845db2 /container-search
parentb374b62e10cd3e97a74234117546ba95d29403c1 (diff)
Add aggregator for calculating the population standard deviation
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/request/StandardDeviationAggregator.java18
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/vespa/ExpressionConverter.java8
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/vespa/ResultBuilder.java51
-rw-r--r--container-search/src/main/javacc/com/yahoo/search/grouping/request/parser/GroupingParser.jj12
4 files changed, 81 insertions, 8 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/grouping/request/StandardDeviationAggregator.java b/container-search/src/main/java/com/yahoo/search/grouping/request/StandardDeviationAggregator.java
new file mode 100644
index 00000000000..7211adbfe4d
--- /dev/null
+++ b/container-search/src/main/java/com/yahoo/search/grouping/request/StandardDeviationAggregator.java
@@ -0,0 +1,18 @@
+// Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.search.grouping.request;
+
+/**
+ * This class represents an stddev-aggregator in a {@link GroupingExpression}. It evaluates to population standard deviation
+ * of the values that the contained expression evaluated to over all the inputs.
+ *
+ * @author bjorncs
+ */
+public class StandardDeviationAggregator extends AggregatorNode {
+
+ /**
+ * @param exp The expression to aggregate on.
+ */
+ public StandardDeviationAggregator(GroupingExpression exp) {
+ super("stddev", exp);
+ }
+}
diff --git a/container-search/src/main/java/com/yahoo/search/grouping/vespa/ExpressionConverter.java b/container-search/src/main/java/com/yahoo/search/grouping/vespa/ExpressionConverter.java
index 9de1c902be1..381724a08eb 100644
--- a/container-search/src/main/java/com/yahoo/search/grouping/vespa/ExpressionConverter.java
+++ b/container-search/src/main/java/com/yahoo/search/grouping/vespa/ExpressionConverter.java
@@ -68,6 +68,7 @@ import com.yahoo.search.grouping.request.ReverseFunction;
import com.yahoo.search.grouping.request.SecondOfMinuteFunction;
import com.yahoo.search.grouping.request.SizeFunction;
import com.yahoo.search.grouping.request.SortFunction;
+import com.yahoo.search.grouping.request.StandardDeviationAggregator;
import com.yahoo.search.grouping.request.StrCatFunction;
import com.yahoo.search.grouping.request.StrLenFunction;
import com.yahoo.search.grouping.request.StringValue;
@@ -86,7 +87,6 @@ import com.yahoo.search.grouping.request.YearFunction;
import com.yahoo.search.grouping.request.YmumValue;
import com.yahoo.search.grouping.request.ZCurveXFunction;
import com.yahoo.search.grouping.request.ZCurveYFunction;
-
import com.yahoo.searchlib.aggregation.AggregationResult;
import com.yahoo.searchlib.aggregation.AverageAggregationResult;
import com.yahoo.searchlib.aggregation.CountAggregationResult;
@@ -94,9 +94,9 @@ import com.yahoo.searchlib.aggregation.ExpressionCountAggregationResult;
import com.yahoo.searchlib.aggregation.HitsAggregationResult;
import com.yahoo.searchlib.aggregation.MaxAggregationResult;
import com.yahoo.searchlib.aggregation.MinAggregationResult;
+import com.yahoo.searchlib.aggregation.StandardDeviationAggregationResult;
import com.yahoo.searchlib.aggregation.SumAggregationResult;
import com.yahoo.searchlib.aggregation.XorAggregationResult;
-
import com.yahoo.searchlib.expression.AddFunctionNode;
import com.yahoo.searchlib.expression.AggregationRefNode;
import com.yahoo.searchlib.expression.AndFunctionNode;
@@ -235,6 +235,10 @@ class ExpressionConverter {
.setSummaryClass(summaryName != null ? summaryName : defaultSummaryName)
.setExpression(new ConstantNode(new IntegerResultNode(0)));
}
+ if (exp instanceof StandardDeviationAggregator) {
+ return new StandardDeviationAggregationResult()
+ .setExpression(toExpressionNode(((StandardDeviationAggregator) exp).getExpression()));
+ }
if (exp instanceof XorAggregator) {
return new XorAggregationResult()
.setExpression(toExpressionNode(((XorAggregator)exp).getExpression()));
diff --git a/container-search/src/main/java/com/yahoo/search/grouping/vespa/ResultBuilder.java b/container-search/src/main/java/com/yahoo/search/grouping/vespa/ResultBuilder.java
index 590b531812a..6caffc0d043 100644
--- a/container-search/src/main/java/com/yahoo/search/grouping/vespa/ResultBuilder.java
+++ b/container-search/src/main/java/com/yahoo/search/grouping/vespa/ResultBuilder.java
@@ -3,13 +3,50 @@ package com.yahoo.search.grouping.vespa;
import com.yahoo.search.grouping.Continuation;
import com.yahoo.search.grouping.GroupingRequest;
-import com.yahoo.search.grouping.result.*;
+import com.yahoo.search.grouping.result.DoubleBucketId;
+import com.yahoo.search.grouping.result.DoubleId;
import com.yahoo.search.grouping.result.Group;
+import com.yahoo.search.grouping.result.GroupId;
+import com.yahoo.search.grouping.result.GroupList;
+import com.yahoo.search.grouping.result.HitList;
+import com.yahoo.search.grouping.result.LongBucketId;
+import com.yahoo.search.grouping.result.LongId;
+import com.yahoo.search.grouping.result.NullId;
+import com.yahoo.search.grouping.result.RawBucketId;
+import com.yahoo.search.grouping.result.RawId;
+import com.yahoo.search.grouping.result.RootGroup;
+import com.yahoo.search.grouping.result.StringBucketId;
+import com.yahoo.search.grouping.result.StringId;
import com.yahoo.search.result.Relevance;
-import com.yahoo.searchlib.aggregation.*;
-import com.yahoo.searchlib.expression.*;
-
-import java.util.*;
+import com.yahoo.searchlib.aggregation.AggregationResult;
+import com.yahoo.searchlib.aggregation.AverageAggregationResult;
+import com.yahoo.searchlib.aggregation.CountAggregationResult;
+import com.yahoo.searchlib.aggregation.ExpressionCountAggregationResult;
+import com.yahoo.searchlib.aggregation.Grouping;
+import com.yahoo.searchlib.aggregation.Hit;
+import com.yahoo.searchlib.aggregation.HitsAggregationResult;
+import com.yahoo.searchlib.aggregation.MaxAggregationResult;
+import com.yahoo.searchlib.aggregation.MinAggregationResult;
+import com.yahoo.searchlib.aggregation.StandardDeviationAggregationResult;
+import com.yahoo.searchlib.aggregation.SumAggregationResult;
+import com.yahoo.searchlib.aggregation.XorAggregationResult;
+import com.yahoo.searchlib.expression.ExpressionNode;
+import com.yahoo.searchlib.expression.FloatBucketResultNode;
+import com.yahoo.searchlib.expression.FloatResultNode;
+import com.yahoo.searchlib.expression.IntegerBucketResultNode;
+import com.yahoo.searchlib.expression.IntegerResultNode;
+import com.yahoo.searchlib.expression.NullResultNode;
+import com.yahoo.searchlib.expression.RawBucketResultNode;
+import com.yahoo.searchlib.expression.RawResultNode;
+import com.yahoo.searchlib.expression.ResultNode;
+import com.yahoo.searchlib.expression.StringBucketResultNode;
+import com.yahoo.searchlib.expression.StringResultNode;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
/**
* This class implements the necessary logic to build a {@link RootGroup} from a list of {@link Grouping} objects. It is
@@ -211,7 +248,9 @@ class ResultBuilder {
} else if (execResult instanceof MinAggregationResult) {
return ((MinAggregationResult)execResult).getMin().getValue();
} else if (execResult instanceof SumAggregationResult) {
- return ((SumAggregationResult)execResult).getSum().getValue();
+ return ((SumAggregationResult) execResult).getSum().getValue();
+ } else if (execResult instanceof StandardDeviationAggregationResult) {
+ return ((StandardDeviationAggregationResult) execResult).getStandardDeviation();
} else if (execResult instanceof XorAggregationResult) {
return ((XorAggregationResult)execResult).getXor();
} else {
diff --git a/container-search/src/main/javacc/com/yahoo/search/grouping/request/parser/GroupingParser.jj b/container-search/src/main/javacc/com/yahoo/search/grouping/request/parser/GroupingParser.jj
index 89433ab52f5..e38195af374 100644
--- a/container-search/src/main/javacc/com/yahoo/search/grouping/request/parser/GroupingParser.jj
+++ b/container-search/src/main/javacc/com/yahoo/search/grouping/request/parser/GroupingParser.jj
@@ -139,6 +139,7 @@ TOKEN :
<SORT: "sort"> |
<INTERPOLATEDLOOKUP: "interpolatedlookup"> |
<SQRT: "sqrt"> |
+ <STDDEV: "stddev"> |
<STRCAT: "strcat"> |
<STRLEN: "strlen"> |
<SUB: "sub"> |
@@ -358,6 +359,7 @@ GroupingExpression value(GroupingOperation grp) :
exp = sortFunction(grp) |
exp = arrayAtLookup(grp) |
exp = interpolatedLookup(grp) |
+ exp = stddevAggregator(grp) |
exp = stringValue() |
exp = strCatFunction(grp) |
exp = strLenFunction(grp) |
@@ -695,6 +697,15 @@ RawValue rawValue(GroupingOperation grp) :
{ return new RawValue(buffer); }
}
+StandardDeviationAggregator stddevAggregator(GroupingOperation grp) :
+{
+ GroupingExpression exp;
+}
+{
+ ( <STDDEV> lbrace() exp = exp(grp) rbrace() )
+ { return new StandardDeviationAggregator(exp); }
+}
+
StringValue stringValueUnquoted() :
{
String str;
@@ -1018,6 +1029,7 @@ String identifier() :
<SORT> |
<INTERPOLATEDLOOKUP> |
<SQRT> |
+ <STDDEV> |
<STRCAT> |
<STRLEN> |
<SUB> |