@Override public AggregatorFactory getCombiningFactory() { return new DoubleSumAggregatorFactory(name, name, null, macroTable); }
@Override public List<AggregatorFactory> getRequiredColumns() { return Collections.singletonList(new DoubleSumAggregatorFactory(fieldName, fieldName, expression, macroTable)); }
static AggregatorFactory createSumAggregatorFactory( final ValueType aggregationType, final String name, final String fieldName, final String expression, final ExprMacroTable macroTable ) { switch (aggregationType) { case LONG: return new LongSumAggregatorFactory(name, fieldName, expression, macroTable); case FLOAT: return new FloatSumAggregatorFactory(name, fieldName, expression, macroTable); case DOUBLE: return new DoubleSumAggregatorFactory(name, fieldName, expression, macroTable); default: throw new ISE("Cannot create aggregator factory for type[%s]", aggregationType); } } }
@Test public void testAggregate() { final float[] values = {0.15f, 0.27f}; final TestFloatColumnSelector selector = new TestFloatColumnSelector(values); FilteredAggregatorFactory factory = new FilteredAggregatorFactory( new DoubleSumAggregatorFactory("billy", "value"), new SelectorDimFilter("dim", "a", null) ); FilteredAggregator agg = (FilteredAggregator) factory.factorize(makeColumnSelector(selector)); double expectedFirst = new Float(values[0]).doubleValue(); double expectedSecond = new Float(values[1]).doubleValue() + expectedFirst; double expectedThird = expectedSecond; assertValues(agg, selector, expectedFirst, expectedSecond, expectedThird); }
parser, new AggregatorFactory[]{ new DoubleSumAggregatorFactory("metric1", "col1"), new DoubleSumAggregatorFactory("metric2", "col2"), new DoubleSumAggregatorFactory("metric1", "col3"), }, new ArbitraryGranularitySpec(Granularities.DAY, ImmutableList.of(Intervals.of("2014/2015"))),
@Test public void testAggregateWithOrFilter() { final float[] values = {0.15f, 0.27f, 0.14f}; final TestFloatColumnSelector selector = new TestFloatColumnSelector(values); FilteredAggregatorFactory factory = new FilteredAggregatorFactory( new DoubleSumAggregatorFactory("billy", "value"), new OrDimFilter(Lists.newArrayList(new SelectorDimFilter("dim", "a", null), new SelectorDimFilter("dim", "b", null))) ); FilteredAggregator agg = (FilteredAggregator) factory.factorize( makeColumnSelector(selector) ); double expectedFirst = new Float(values[0]).doubleValue(); double expectedSecond = new Float(values[1]).doubleValue() + expectedFirst; double expectedThird = expectedSecond + new Float(values[2]).doubleValue(); assertValues(agg, selector, expectedFirst, expectedSecond, expectedThird); }
@Test public void testVerifyAggregations() { List<AggregatorFactory> aggFactories = Arrays.asList( new CountAggregatorFactory("count"), new DoubleSumAggregatorFactory("idx", "index"), new DoubleSumAggregatorFactory("rev", "revenue") ); List<PostAggregator> postAggs = Collections.singletonList( new ArithmeticPostAggregator( "addStuff", "+", Arrays.asList( new FieldAccessPostAggregator("idx", "idx"), new FieldAccessPostAggregator("count", "count") ) ) ); boolean exceptionOccured = false; try { Queries.prepareAggregations(ImmutableList.of(), aggFactories, postAggs); } catch (IllegalArgumentException e) { exceptionOccured = true; } Assert.assertFalse(exceptionOccured); }
@Test public void testVerifyAggregationsMissingVal() { List<AggregatorFactory> aggFactories = Arrays.asList( new CountAggregatorFactory("count"), new DoubleSumAggregatorFactory("idx", "index"), new DoubleSumAggregatorFactory("rev", "revenue") ); List<PostAggregator> postAggs = Collections.singletonList( new ArithmeticPostAggregator( "addStuff", "+", Arrays.asList( new FieldAccessPostAggregator("idx", "idx2"), new FieldAccessPostAggregator("count", "count") ) ) ); boolean exceptionOccured = false; try { Queries.prepareAggregations(ImmutableList.of(), aggFactories, postAggs); } catch (IllegalArgumentException e) { exceptionOccured = true; } Assert.assertTrue(exceptionOccured); }
@Test public void testAggregateWithNotFilter() { final float[] values = {0.15f, 0.27f}; final TestFloatColumnSelector selector = new TestFloatColumnSelector(values); FilteredAggregatorFactory factory = new FilteredAggregatorFactory( new DoubleSumAggregatorFactory("billy", "value"), new NotDimFilter(new SelectorDimFilter("dim", "b", null)) ); validateFilteredAggs(factory, values, selector); }
parser, new AggregatorFactory[]{ new DoubleSumAggregatorFactory("metric1", "col1"), new DoubleSumAggregatorFactory("metric2", "col2"), }, new ArbitraryGranularitySpec(Granularities.DAY, ImmutableList.of(Intervals.of("2014/2015"))),
@Test public void testNullPostAggregatorNames() { AggregatorFactory agg1 = new DoubleSumAggregatorFactory("agg1", "value"); AggregatorFactory agg2 = new DoubleSumAggregatorFactory("agg2", "count"); PostAggregator postAgg1 = new ArithmeticPostAggregator( null, "*", Lists.newArrayList(new FieldAccessPostAggregator(null, "agg1"), new FieldAccessPostAggregator(null, "agg2")) ); PostAggregator postAgg2 = new ArithmeticPostAggregator( "postAgg", "/", Lists.newArrayList(new FieldAccessPostAggregator(null, "agg1"), new FieldAccessPostAggregator(null, "agg2")) ); Assert.assertEquals( new Pair<>(Lists.newArrayList(agg1, agg2), Collections.singletonList(postAgg2)), AggregatorUtil.condensedAggregators( Lists.newArrayList(agg1, agg2), Lists.newArrayList(postAgg1, postAgg2), "postAgg" ) ); }
@Test public void testCasing() { AggregatorFactory agg1 = new DoubleSumAggregatorFactory("Agg1", "value"); AggregatorFactory agg2 = new DoubleSumAggregatorFactory("Agg2", "count"); PostAggregator postAgg1 = new ArithmeticPostAggregator( null, "*", Lists.newArrayList(new FieldAccessPostAggregator(null, "Agg1"), new FieldAccessPostAggregator(null, "Agg2")) ); PostAggregator postAgg2 = new ArithmeticPostAggregator( "postAgg", "/", Lists.newArrayList(new FieldAccessPostAggregator(null, "Agg1"), new FieldAccessPostAggregator(null, "Agg2")) ); Assert.assertEquals( new Pair<>(Lists.newArrayList(agg1, agg2), Collections.singletonList(postAgg2)), AggregatorUtil.condensedAggregators( Lists.newArrayList(agg1, agg2), Lists.newArrayList(postAgg1, postAgg2), "postAgg" ) ); }
new DoubleSumAggregatorFactory("billy", "value"), new BoundDimFilter("dim", "a", "a", false, false, true, null, StringComparators.ALPHANUMERIC) ); new DoubleSumAggregatorFactory("billy", "value"), new RegexDimFilter("dim", "a", null) ); new DoubleSumAggregatorFactory("billy", "value"), new SearchQueryDimFilter("dim", new ContainsSearchQuerySpec("a", true), null) ); new DoubleSumAggregatorFactory("billy", "value"), new JavaScriptDimFilter("dim", jsFn, null, JavaScriptConfig.getEnabledInstance()) );
parser, new AggregatorFactory[]{ new DoubleSumAggregatorFactory("metric1", "col1"), new DoubleSumAggregatorFactory("metric2", "col2"), }, new ArbitraryGranularitySpec(Granularities.DAY, ImmutableList.of(Intervals.of("2014/2015"))),
@Test public void testComparator() { final TestDoubleColumnSelectorImpl selector = new TestDoubleColumnSelectorImpl(new double[]{0.15d, 0.27d}); DoubleSumAggregator agg = new DoubleSumAggregator(selector); Object first = agg.get(); agg.aggregate(); Comparator comp = new DoubleSumAggregatorFactory("null", "null").getComparator(); Assert.assertEquals(-1, comp.compare(first, agg.get())); Assert.assertEquals(0, comp.compare(first, first)); Assert.assertEquals(0, comp.compare(agg.get(), agg.get())); Assert.assertEquals(1, comp.compare(agg.get(), first)); } }
@Test public void testAggregateWithAndFilter() { final float[] values = {0.15f, 0.27f}; final TestFloatColumnSelector selector = new TestFloatColumnSelector(values); FilteredAggregatorFactory factory = new FilteredAggregatorFactory( new DoubleSumAggregatorFactory("billy", "value"), new AndDimFilter(Lists.newArrayList(new NotDimFilter(new SelectorDimFilter("dim", "b", null)), new SelectorDimFilter("dim", "a", null)))); validateFilteredAggs(factory, values, selector); }
@Test public void testPruneDeadAggregatorsThroughPostProjection() throws Exception { // Test for ProjectAggregatePruneUnusedCallRule. testQuery( "SELECT\n" + " CASE 'foo'\n" + " WHEN 'bar' THEN SUM(cnt) / 10\n" + " WHEN 'foo' THEN SUM(m1) / 10\n" + " WHEN 'baz' THEN SUM(m2) / 10\n" + " END\n" + "FROM foo", ImmutableList.of( Druids.newTimeseriesQueryBuilder() .dataSource(CalciteTests.DATASOURCE1) .intervals(QSS(Filtration.eternity())) .granularity(Granularities.ALL) .aggregators(AGGS(new DoubleSumAggregatorFactory("a0", "m1"))) .postAggregators(ImmutableList.of(EXPRESSION_POST_AGG("p0", "(\"a0\" / 10)"))) .context(TIMESERIES_CONTEXT_DEFAULT) .build() ), ImmutableList.of(new Object[]{2.1}) ); }
@Test public void testPruneDeadAggregators() throws Exception { // Test for ProjectAggregatePruneUnusedCallRule. testQuery( "SELECT\n" + " CASE 'foo'\n" + " WHEN 'bar' THEN SUM(cnt)\n" + " WHEN 'foo' THEN SUM(m1)\n" + " WHEN 'baz' THEN SUM(m2)\n" + " END\n" + "FROM foo", ImmutableList.of( Druids.newTimeseriesQueryBuilder() .dataSource(CalciteTests.DATASOURCE1) .intervals(QSS(Filtration.eternity())) .granularity(Granularities.ALL) .aggregators(AGGS(new DoubleSumAggregatorFactory("a0", "m1"))) .context(TIMESERIES_CONTEXT_DEFAULT) .build() ), ImmutableList.of(new Object[]{21.0}) ); }
@Test public void testHavingOnGrandTotal() throws Exception { testQuery( "SELECT SUM(m1) AS m1_sum FROM foo HAVING m1_sum = 21", ImmutableList.of( GroupByQuery.builder() .setDataSource(CalciteTests.DATASOURCE1) .setInterval(QSS(Filtration.eternity())) .setGranularity(Granularities.ALL) .setAggregatorSpecs(AGGS(new DoubleSumAggregatorFactory("a0", "m1"))) .setHavingSpec(HAVING(NUMERIC_SELECTOR("a0", "21", null))) .setContext(QUERY_CONTEXT_DEFAULT) .build() ), ImmutableList.of( new Object[]{21d} ) ); }
@Test public void testPruneDeadAggregatorsThroughHaving() throws Exception { // Test for ProjectAggregatePruneUnusedCallRule. testQuery( "SELECT\n" + " CASE 'foo'\n" + " WHEN 'bar' THEN SUM(cnt)\n" + " WHEN 'foo' THEN SUM(m1)\n" + " WHEN 'baz' THEN SUM(m2)\n" + " END AS theCase\n" + "FROM foo\n" + "HAVING theCase = 21", ImmutableList.of( GroupByQuery.builder() .setDataSource(CalciteTests.DATASOURCE1) .setInterval(QSS(Filtration.eternity())) .setGranularity(Granularities.ALL) .setAggregatorSpecs(AGGS(new DoubleSumAggregatorFactory("a0", "m1"))) .setHavingSpec(HAVING(NUMERIC_SELECTOR("a0", "21", null))) .setContext(QUERY_CONTEXT_DEFAULT) .build() ), ImmutableList.of(new Object[]{21.0}) ); }