public GroupByQuery build() { final LimitSpec theLimitSpec; if (limitSpec == null) { if (orderByColumnSpecs.isEmpty() && limit == Integer.MAX_VALUE) { theLimitSpec = NoopLimitSpec.instance(); } else { theLimitSpec = new DefaultLimitSpec(orderByColumnSpecs, limit); } } else { theLimitSpec = limitSpec; } return new GroupByQuery( dataSource, querySegmentSpec, virtualColumns, dimFilter, granularity, dimensions, aggregatorSpecs, postAggregatorSpecs, havingSpec, theLimitSpec, subtotalsSpec, postProcessingFn, context ); } }
@Test public void testBuildSimple() { DefaultLimitSpec limitSpec = new DefaultLimitSpec( ImmutableList.of(), 2 ); Function<Sequence<Row>, Sequence<Row>> limitFn = limitSpec.build( ImmutableList.of(), ImmutableList.of(), ImmutableList.of(), Granularities.NONE, false ); Assert.assertEquals( ImmutableList.of(testRowsList.get(0), testRowsList.get(1)), limitFn.apply(testRowsSequence).toList() ); }
@Test public void testWithAllGranularity() { DefaultLimitSpec limitSpec = new DefaultLimitSpec( ImmutableList.of(new OrderByColumnSpec("k1", OrderByColumnSpec.Direction.ASCENDING, StringComparators.NUMERIC)), 2 ); Function<Sequence<Row>, Sequence<Row>> limitFn = limitSpec.build( ImmutableList.of(new DefaultDimensionSpec("k1", "k1", ValueType.DOUBLE)), ImmutableList.of(), ImmutableList.of(), Granularities.ALL, true ); Assert.assertEquals( ImmutableList.of(testRowsList.get(0), testRowsList.get(1)), limitFn.apply(testRowsSequence).toList() ); }
@Test public void testWithSortByDimsFirst() { DefaultLimitSpec limitSpec = new DefaultLimitSpec( ImmutableList.of(new OrderByColumnSpec("k1", OrderByColumnSpec.Direction.ASCENDING, StringComparators.NUMERIC)), 2 ); Function<Sequence<Row>, Sequence<Row>> limitFn = limitSpec.build( ImmutableList.of(new DefaultDimensionSpec("k1", "k1", ValueType.DOUBLE)), ImmutableList.of(), ImmutableList.of(), Granularities.NONE, true ); Assert.assertEquals( ImmutableList.of(testRowsList.get(2), testRowsList.get(0)), limitFn.apply(testRowsSequence).toList() ); }
@Test public void testSortDimensionDescending() { DefaultLimitSpec limitSpec = new DefaultLimitSpec( ImmutableList.of(new OrderByColumnSpec("k1", OrderByColumnSpec.Direction.DESCENDING)), 2 ); Function<Sequence<Row>, Sequence<Row>> limitFn = limitSpec.build( ImmutableList.of(new DefaultDimensionSpec("k1", "k1")), ImmutableList.of(), ImmutableList.of(), Granularities.NONE, false ); // Note: This test encodes the fact that limitSpec sorts numbers like strings; we might want to change this // in the future. Assert.assertEquals( ImmutableList.of(testRowsList.get(2), testRowsList.get(1)), limitFn.apply(testRowsSequence).toList() ); }
new DefaultLimitSpec( Collections.singletonList(new OrderByColumnSpec("rows", OrderByColumnSpec.Direction.DESCENDING)),
@Test public void testQuerySerialization() throws IOException { Query query = GroupByQuery .builder() .setDataSource(QueryRunnerTestHelper.dataSource) .setQuerySegmentSpec(QueryRunnerTestHelper.firstToThird) .setDimensions(new DefaultDimensionSpec("quality", "alias")) .setAggregatorSpecs(QueryRunnerTestHelper.rowsCount, new LongSumAggregatorFactory("idx", "index")) .setGranularity(QueryRunnerTestHelper.dayGran) .setPostAggregatorSpecs(ImmutableList.of(new FieldAccessPostAggregator("x", "idx"))) .setLimitSpec( new DefaultLimitSpec( ImmutableList.of(new OrderByColumnSpec( "alias", OrderByColumnSpec.Direction.ASCENDING, StringComparators.LEXICOGRAPHIC )), 100 ) ) .build(); String json = jsonMapper.writeValueAsString(query); Query serdeQuery = jsonMapper.readValue(json, Query.class); Assert.assertEquals(query, serdeQuery); }
.setAggregatorSpecs(QueryRunnerTestHelper.rowsCount, new LongSumAggregatorFactory("idx", "index")) .setLimitSpec( new DefaultLimitSpec( Collections.singletonList(new OrderByColumnSpec( "alias", .setQuerySegmentSpec(QueryRunnerTestHelper.firstToThird) .setAggregatorSpecs(new DoubleMaxAggregatorFactory("idx", "idx")) .setLimitSpec(new DefaultLimitSpec(null, 5)) .setGranularity(QueryRunnerTestHelper.dayGran) .build();
.setGranularity(Granularities.ALL) .setLimitSpec( new DefaultLimitSpec( ImmutableList.of( new OrderByColumnSpec(
.setInterval(QueryRunnerTestHelper.fullOnIntervalSpec) .setLimitSpec( new DefaultLimitSpec( Collections.singletonList(new OrderByColumnSpec( "constant",
@Test public void testRejectForceLimitPushDownWithHaving() { expectedException.expect(IAE.class); expectedException.expectMessage("Cannot force limit push down when a having spec is present."); GroupByQuery .builder() .setDataSource(QueryRunnerTestHelper.dataSource) .setGranularity(QueryRunnerTestHelper.allGran) .setDimensions(new DefaultDimensionSpec(QueryRunnerTestHelper.marketDimension, "marketalias")) .setInterval(QueryRunnerTestHelper.fullOnIntervalSpec) .setLimitSpec( new DefaultLimitSpec( Collections.singletonList(new OrderByColumnSpec("marketalias", OrderByColumnSpec.Direction.DESCENDING)), 2 ) ) .setAggregatorSpecs(QueryRunnerTestHelper.rowsCount) .setContext(ImmutableMap.of(GroupByQueryConfig.CTX_KEY_FORCE_LIMIT_PUSH_DOWN, true)) .setHavingSpec(new GreaterThanHavingSpec("rows", 10)) .build(); }
.setAggregatorSpecs(AGGS(new CountAggregatorFactory("a0"))) .setLimitSpec( new DefaultLimitSpec( ImmutableList.of( new OrderByColumnSpec(
.setInterval(QueryRunnerTestHelper.fullOnIntervalSpec) .setLimitSpec( new DefaultLimitSpec( Collections.singletonList(new OrderByColumnSpec("marketalias", OrderByColumnSpec.Direction.DESCENDING)),
new DefaultLimitSpec( Collections.singletonList( new OrderByColumnSpec("a0", Direction.ASCENDING, StringComparators.NUMERIC)
.setAggregatorSpecs(AGGS(new CountAggregatorFactory("a0"))) .setLimitSpec( new DefaultLimitSpec( ImmutableList.of( new OrderByColumnSpec(
.setInterval(QueryRunnerTestHelper.fullOnIntervalSpec) .setLimitSpec( new DefaultLimitSpec( Collections.singletonList( new OrderByColumnSpec(QueryRunnerTestHelper.marketDimension, OrderByColumnSpec.Direction.DESCENDING)
.setLimitSpec(new DefaultLimitSpec(ImmutableList.of(), 1)) .build();
new DefaultLimitSpec( ImmutableList.of( new OrderByColumnSpec("d1", OrderByColumnSpec.Direction.ASCENDING)
@Test public void testGroupByWithUnderUnderTimeAsDimensionNameWithHavingAndLimit() { expectedException.expect(IAE.class); expectedException.expectMessage( "'__time' cannot be used as an output name for dimensions, aggregators, or post-aggregators." ); GroupByQuery .builder() .setDataSource(QueryRunnerTestHelper.dataSource) .setQuerySegmentSpec(QueryRunnerTestHelper.firstToThird) .setDimensions(new DefaultDimensionSpec("quality", "__time")) .setAggregatorSpecs(QueryRunnerTestHelper.rowsCount, new LongSumAggregatorFactory("idx", "index")) .setGranularity(QueryRunnerTestHelper.dayGran) .setHavingSpec( new OrHavingSpec( ImmutableList.of( new DimensionSelectorHavingSpec("__time", "automotive", null), new DimensionSelectorHavingSpec("__time", "business", null) ) ) ) .setLimitSpec( new DefaultLimitSpec( ImmutableList.of(new OrderByColumnSpec("__time", OrderByColumnSpec.Direction.DESCENDING)), null ) ) .build(); }
.setGranularity(QueryRunnerTestHelper.dayGran) .setLimitSpec( new DefaultLimitSpec( ImmutableList.of(new OrderByColumnSpec("alias", OrderByColumnSpec.Direction.ASCENDING)), null