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 ); } }
if (limitSpec != null && limitSpec.getColumns().size() > 0) { final long scanLimit = limitSpec == null || limitSpec.getLimit() == Integer.MAX_VALUE ? 0L : (long) limitSpec.getLimit();
if (limitSpec.isLimited()) { timeseriesLimit = limitSpec.getLimit(); if (limitSpec.getColumns().isEmpty()) { descending = false; } else { final OrderByColumnSpec firstOrderBy = limitSpec.getColumns().get(0);
if (!defaultLimitSpec.isLimited()) { return false; boolean sortHasNonGroupingFields = DefaultLimitSpec.sortingOrderHasNonGroupingFields( (DefaultLimitSpec) limitSpec, getDimensions()
private boolean validateAndGetForceLimitPushDown() { final boolean forcePushDown = getContextBoolean(GroupByQueryConfig.CTX_KEY_FORCE_LIMIT_PUSH_DOWN, false); if (forcePushDown) { if (!(limitSpec instanceof DefaultLimitSpec)) { throw new IAE("When forcing limit push down, a limit spec must be provided."); } if (!((DefaultLimitSpec) limitSpec).isLimited()) { throw new IAE("When forcing limit push down, the provided limit spec must have a limit."); } if (havingSpec != null) { throw new IAE("Cannot force limit push down when a having spec is present."); } for (OrderByColumnSpec orderBySpec : ((DefaultLimitSpec) limitSpec).getColumns()) { if (OrderByColumnSpec.getPostAggIndexForOrderBy(orderBySpec, postAggregatorSpecs) > -1) { throw new UnsupportedOperationException("Limit push down when sorting by a post aggregator is not supported."); } } } return forcePushDown; }
final ValueType columnType = getOrderByType(columnSpec, dimensions); final StringComparator naturalComparator; if (columnType == ValueType.STRING) { return isLimited() ? new LimitingFn(limit) : Functions.identity(); final Ordering<Row> ordering = makeComparator(dimensions, aggs, postAggs, sortByDimsFirst); if (isLimited()) { return new TopNFunction(ordering, limit); } else {
@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() ); }
/** * Check if a limitSpec has columns in the sorting order that are not part of the grouping fields represented * by `dimensions`. * * @param limitSpec LimitSpec, assumed to be non-null * @param dimensions Grouping fields for a groupBy query * @return True if limitSpec has sorting columns not contained in dimensions */ public static boolean sortingOrderHasNonGroupingFields(DefaultLimitSpec limitSpec, List<DimensionSpec> dimensions) { for (OrderByColumnSpec orderSpec : limitSpec.getColumns()) { int dimIndex = OrderByColumnSpec.getDimIndexForOrderBy(orderSpec, dimensions); if (dimIndex < 0) { return true; } } return false; }
final Integer limit = druidQuery.getLimitSpec() != null ? druidQuery.getLimitSpec().getLimit() : null; final RowSignature outputRowSignature = druidQuery.getOutputRowSignature();
nextOrdering = metricOrdering(columnName, postAggregatorsMap.get(columnName).getComparator()); } else if (aggregatorsMap.containsKey(columnName)) { nextOrdering = metricOrdering(columnName, aggregatorsMap.get(columnName).getComparator()); } else if (dimensionsMap.containsKey(columnName)) { nextOrdering = dimensionOrdering(columnName, columnSpec.getDimensionComparator());
@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() ); }
public static StringComparator getComparatorForDimName(DefaultLimitSpec limitSpec, String dimName) { final OrderByColumnSpec orderBy = OrderByColumnSpec.getOrderByForDimName(limitSpec.getColumns(), dimName); if (orderBy == null) { return null; } return orderBy.getDimensionComparator(); }
private boolean validateAndGetForceLimitPushDown() { final boolean forcePushDown = getContextBoolean(GroupByQueryConfig.CTX_KEY_FORCE_LIMIT_PUSH_DOWN, false); if (forcePushDown) { if (!(limitSpec instanceof DefaultLimitSpec)) { throw new IAE("When forcing limit push down, a limit spec must be provided."); } if (!((DefaultLimitSpec) limitSpec).isLimited()) { throw new IAE("When forcing limit push down, the provided limit spec must have a limit."); } if (havingSpec != null) { throw new IAE("Cannot force limit push down when a having spec is present."); } for (OrderByColumnSpec orderBySpec : ((DefaultLimitSpec) limitSpec).getColumns()) { if (OrderByColumnSpec.getPostAggIndexForOrderBy(orderBySpec, postAggregatorSpecs) > -1) { throw new UnsupportedOperationException("Limit push down when sorting by a post aggregator is not supported."); } } } return forcePushDown; }
final ValueType columnType = getOrderByType(columnSpec, dimensions); final StringComparator naturalComparator; if (columnType == ValueType.STRING) { return isLimited() ? new LimitingFn(limit) : Functions.identity(); final Ordering<Row> ordering = makeComparator(dimensions, aggs, postAggs, sortByDimsFirst); if (isLimited()) { return new TopNFunction(ordering, limit); } else {
if (!defaultLimitSpec.isLimited()) { return false; boolean sortHasNonGroupingFields = DefaultLimitSpec.sortingOrderHasNonGroupingFields( (DefaultLimitSpec) limitSpec, getDimensions()
bufferGrouperMaxLoadFactor, bufferGrouperInitialBuckets, limitSpec.getLimit(), sortHasNonGroupingFields );
nextOrdering = metricOrdering(columnName, postAggregatorsMap.get(columnName).getComparator()); } else if (aggregatorsMap.containsKey(columnName)) { nextOrdering = metricOrdering(columnName, aggregatorsMap.get(columnName).getComparator()); } else if (dimensionsMap.containsKey(columnName)) { nextOrdering = dimensionOrdering(columnName, columnSpec.getDimensionComparator());
return new DefaultLimitSpec(orderBys, limit);
@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() ); }
if (limitSpec.getColumns().size() == 0) { descending = false; } else if (limitSpec.getColumns().size() == 1) { final OrderByColumnSpec orderBy = Iterables.getOnlyElement(limitSpec.getColumns()); if (!orderBy.getDimension().equals(ColumnHolder.TIME_COLUMN_NAME)) { threshold = limitSpec.getLimit(); } else { descending = false;