diff options
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/tests/aggregator/perdocexpr.cpp | 32 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/aggregation/aggregation.cpp | 10 |
2 files changed, 40 insertions, 2 deletions
diff --git a/searchlib/src/tests/aggregator/perdocexpr.cpp b/searchlib/src/tests/aggregator/perdocexpr.cpp index 66d2e48194d..c3667c36f8e 100644 --- a/searchlib/src/tests/aggregator/perdocexpr.cpp +++ b/searchlib/src/tests/aggregator/perdocexpr.cpp @@ -1325,6 +1325,38 @@ TEST("testAggregationResults") { FloatResultNode(15.54)); } +TEST("test Average over integer") { + AggregationResult::Configure conf; + AverageAggregationResult avg; + avg.setExpression(createScalarInt(I4)).select(conf, conf); + avg.aggregate(0, 0); + EXPECT_EQUAL(I4, avg.getAverage().getInteger()); +} + +TEST("test Average over float") { + AggregationResult::Configure conf; + AverageAggregationResult avg; + avg.setExpression(createScalarFloat(I4)).select(conf, conf); + avg.aggregate(0, 0); + EXPECT_EQUAL(I4, avg.getAverage().getInteger()); +} + +TEST("test Average over numeric string") { + AggregationResult::Configure conf; + AverageAggregationResult avg; + avg.setExpression(createScalarString("7.8")).select(conf, conf); + avg.aggregate(0, 0); + EXPECT_EQUAL(7.8, avg.getAverage().getFloat()); +} + +TEST("test Average over non-numeric string") { + AggregationResult::Configure conf; + AverageAggregationResult avg; + avg.setExpression(createScalarString("ABC")).select(conf, conf); + avg.aggregate(0, 0); + EXPECT_EQUAL(0, avg.getAverage().getInteger()); +} + TEST("testGrouping") { AttributeGuard attr1 = createInt64Attribute(); ExpressionNode::UP result1(new CountAggregationResult()); diff --git a/searchlib/src/vespa/searchlib/aggregation/aggregation.cpp b/searchlib/src/vespa/searchlib/aggregation/aggregation.cpp index 0b8ed669874..006d26a53b0 100644 --- a/searchlib/src/vespa/searchlib/aggregation/aggregation.cpp +++ b/searchlib/src/vespa/searchlib/aggregation/aggregation.cpp @@ -155,7 +155,13 @@ AverageAggregationResult::onPrepare(const ResultNode & result, bool useForInit) if (isReady(_sum.get(), result)) { return; } - _sum.reset(dynamic_cast<NumericResultNode *>(result.createBaseType().release())); + + ResultNode::UP tmp = result.createBaseType(); + if (dynamic_cast<NumericResultNode *>(tmp.get())) { + _sum.reset(static_cast<NumericResultNode *>(tmp.release())); + } else { + _sum.reset(new FloatResultNode()); + } if ( useForInit ) { _sum->set(result); } @@ -546,7 +552,7 @@ ExpressionCountAggregationResult::ExpressionCountAggregationResult() = default; ExpressionCountAggregationResult::~ExpressionCountAggregationResult() = default; StandardDeviationAggregationResult::StandardDeviationAggregationResult() - : AggregationResult(), _count(), _sum(), _sumOfSquared(), _stdDevScratchPad() + : AggregationResult(), _count(), _sum(), _sumOfSquared(), _stdDevScratchPad() { _stdDevScratchPad.reset(new expression::FloatResultNode()); } |