diff options
author | Bjørn Christian Seime <bjorncs@yahoo-inc.com> | 2017-05-04 12:34:10 +0000 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@yahoo-inc.com> | 2017-05-08 12:59:40 +0200 |
commit | bd9d968854e1723b8f09f6d9ba320e9b3daf774e (patch) | |
tree | 0c11f46a573c37b5bf234c14dcfca0af36845db2 /container-search | |
parent | b374b62e10cd3e97a74234117546ba95d29403c1 (diff) |
Add aggregator for calculating the population standard deviation
Diffstat (limited to 'container-search')
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> | |