final FilteredAggregatorFactory filteredAgg = (FilteredAggregatorFactory) agg; newAggregators.add( new FilteredAggregatorFactory( filteredAgg.getAggregator(), Filtration.create(new AndDimFilter(ImmutableList.of(filteredAgg.getFilter(), baseOptimizedFilter))) newAggregators.add(new FilteredAggregatorFactory(agg, baseOptimizedFilter));
@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); }
@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); }
@Override public Aggregator apply(Cursor input) { Aggregator agg = new FilteredAggregatorFactory( new CountAggregatorFactory("count"), maybeOptimize(filter) ).factorize(input.getColumnSelectorFactory()); for (; !input.isDone(); input.advance()) { agg.aggregate(); } return agg; } }
@Test public void testSimpleNaming() { Assert.assertEquals("overrideName", new FilteredAggregatorFactory( new CountAggregatorFactory("foo"), new TrueDimFilter(), "overrideName" ).getName()); Assert.assertEquals("delegateName", new FilteredAggregatorFactory( new CountAggregatorFactory("delegateName"), new TrueDimFilter(), "" ).getName()); Assert.assertEquals("delegateName", new FilteredAggregatorFactory( new CountAggregatorFactory("delegateName"), new TrueDimFilter(), null ).getName()); } }
@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); }
FilteredAggregatorFactory factory; factory = new FilteredAggregatorFactory( new DoubleSumAggregatorFactory("billy", "value"), new BoundDimFilter("dim", "a", "a", false, false, true, null, StringComparators.ALPHANUMERIC) validateFilteredAggs(factory, values, selector); factory = new FilteredAggregatorFactory( new DoubleSumAggregatorFactory("billy", "value"), new RegexDimFilter("dim", "a", null) validateFilteredAggs(factory, values, selector); factory = new FilteredAggregatorFactory( new DoubleSumAggregatorFactory("billy", "value"), new SearchQueryDimFilter("dim", new ContainsSearchQuerySpec("a", true), null) factory = new FilteredAggregatorFactory( new DoubleSumAggregatorFactory("billy", "value"), new JavaScriptDimFilter("dim", jsFn, null, JavaScriptConfig.getEnabledInstance())
@Test public void testCountNullableColumn() throws Exception { testQuery( "SELECT COUNT(dim2) FROM druid.foo", ImmutableList.of( Druids.newTimeseriesQueryBuilder() .dataSource(CalciteTests.DATASOURCE1) .intervals(QSS(Filtration.eternity())) .granularity(Granularities.ALL) .aggregators(AGGS( new FilteredAggregatorFactory( new CountAggregatorFactory("a0"), NOT(SELECTOR("dim2", null, null)) ) )) .context(TIMESERIES_CONTEXT_DEFAULT) .build() ), NullHandling.replaceWithDefault() ? ImmutableList.of( new Object[]{3L} ) : ImmutableList.of( new Object[]{4L} ) ); }
aggregatorFactoryList, Collections.singletonList( new FilteredAggregatorFactory( new CountAggregatorFactory("filteredAgg"), new SelectorDimFilter("abraKaDabra", "Lol", null)
FilteredAggregatorFactory aggregatorFactory = new FilteredAggregatorFactory( longSumAggregatorFactory, new IntervalDimFilter( AggregatorFactory expectedPartialFilteredAgg = new FilteredAggregatorFactory( longSumAggregatorFactory, new IntervalDimFilter(
Iterables.concat( aggregatorFactoryList, Collections.singletonList(new FilteredAggregatorFactory( new CountAggregatorFactory("filteredAgg"), new SelectorDimFilter(QueryRunnerTestHelper.marketDimension, "spot", null)
@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); }
.aggregators( AGGS( new FilteredAggregatorFactory( new CountAggregatorFactory("a0"), NOT(SELECTOR("dim1", "1", null)) ), new FilteredAggregatorFactory( new CountAggregatorFactory("a1"), AND(
aggregatorFactoryList, Collections.singletonList( new FilteredAggregatorFactory( new CountAggregatorFactory("filteredAgg"), new NotDimFilter(new SelectorDimFilter(QueryRunnerTestHelper.marketDimension, null, null))
@Test public void testCountNullableExpression() throws Exception { testQuery( "SELECT COUNT(CASE WHEN dim2 = 'abc' THEN 'yes' WHEN dim2 = 'def' THEN 'yes' END) FROM druid.foo", ImmutableList.of( Druids.newTimeseriesQueryBuilder() .dataSource(CalciteTests.DATASOURCE1) .intervals(QSS(Filtration.eternity())) .granularity(Granularities.ALL) .aggregators(AGGS( new FilteredAggregatorFactory( new CountAggregatorFactory("a0"), EXPRESSION_FILTER( "notnull(case_searched((\"dim2\" == 'abc'),'yes',(\"dim2\" == 'def'),'yes'," + DruidExpression.nullLiteral() + "))" ) ) )) .context(TIMESERIES_CONTEXT_DEFAULT) .build() ), ImmutableList.of( new Object[]{1L} ) ); }
.setDimensions(DIMS(new DefaultDimensionSpec("cnt", "d0", ValueType.LONG))) .setAggregatorSpecs(AGGS( new FilteredAggregatorFactory( new CountAggregatorFactory("a0"), NOT(SELECTOR("dim1", "1", null))
@Test public void testSubqueryWithOuterFilterAggregator() { final GroupByQuery subquery = GroupByQuery .builder() .setDataSource(QueryRunnerTestHelper.dataSource) .setQuerySegmentSpec(QueryRunnerTestHelper.fullOnIntervalSpec) .setDimensions(new DefaultDimensionSpec("market", "market"), new DefaultDimensionSpec("quality", "quality")) .setAggregatorSpecs(QueryRunnerTestHelper.rowsCount, new LongSumAggregatorFactory("index", "index")) .setGranularity(QueryRunnerTestHelper.dayGran) .build(); final DimFilter filter = new SelectorDimFilter("market", "spot", null); final GroupByQuery query = GroupByQuery .builder() .setDataSource(subquery) .setQuerySegmentSpec(QueryRunnerTestHelper.fullOnIntervalSpec) .setDimensions(Collections.emptyList()) .setAggregatorSpecs(new FilteredAggregatorFactory(QueryRunnerTestHelper.rowsCount, filter)) .setGranularity(QueryRunnerTestHelper.allGran) .build(); List<Row> expectedResults = Collections.singletonList( GroupByQueryRunnerTestHelper.createExpectedRow("1970-01-01", "rows", 837L) ); Iterable<Row> results = GroupByQueryRunnerTestHelper.runQuery(factory, runner, query); TestHelper.assertExpectedObjects(expectedResults, results, "subquery-filter-agg"); }
@Test public void testFilteredAggregatorDontOptimizeOnNonTimeColumn() { // Filter is not on __time, so no optimizations should be made. LongSumAggregatorFactory longSumAggregatorFactory = new LongSumAggregatorFactory("test", "test"); FilteredAggregatorFactory aggregatorFactory = new FilteredAggregatorFactory( longSumAggregatorFactory, new IntervalDimFilter( "not_time", Collections.singletonList(Intervals.utc(1000, 2000)), null ) ); Interval exclude = Intervals.utc(2000, 3000); Interval include = Intervals.utc(1500, 1600); Interval partial = Intervals.utc(1500, 2500); AggregatorFactory excludedAgg = aggregatorFactory.optimizeForSegment(getOptimizationContext(exclude)); Assert.assertEquals(aggregatorFactory, excludedAgg); AggregatorFactory includedAgg = aggregatorFactory.optimizeForSegment(getOptimizationContext(include)); Assert.assertEquals(aggregatorFactory, includedAgg); AggregatorFactory partialAgg = aggregatorFactory.optimizeForSegment(getOptimizationContext(partial)); Assert.assertEquals(aggregatorFactory, partialAgg); }
.setDimensions(DIMS(new DefaultDimensionSpec("dim1", "d0"))) .setAggregatorSpecs(AGGS( new FilteredAggregatorFactory( new CountAggregatorFactory("a0"), NOT(SELECTOR("dim2", "a", null))
.setGranularity(Granularities.ALL) .setAggregatorSpecs(AGGS( new FilteredAggregatorFactory( new CountAggregatorFactory("a0"), NOT(SELECTOR("d0", null, null))