/** * 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; }
public static StringComparator getComparatorForDimName(DefaultLimitSpec limitSpec, String dimName) { final OrderByColumnSpec orderBy = OrderByColumnSpec.getOrderByForDimName(limitSpec.getColumns(), dimName); if (orderBy == null) { return null; } return orderBy.getDimensionComparator(); }
final List<StringComparator> comparators = new ArrayList<>(); for (OrderByColumnSpec orderSpec : limitSpec.getColumns()) { boolean needsReverse = orderSpec.getDirection() != OrderByColumnSpec.Direction.ASCENDING; int dimIndex = OrderByColumnSpec.getDimIndexForOrderBy(orderSpec, dimensions);
final Set<Integer> orderByIndices = new HashSet<>(); for (OrderByColumnSpec orderSpec : limitSpec.getColumns()) { final boolean needsReverse = orderSpec.getDirection() != OrderByColumnSpec.Direction.ASCENDING; int dimIndex = OrderByColumnSpec.getDimIndexForOrderBy(orderSpec, dimensions);
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)) {
for (OrderByColumnSpec orderSpec : limitSpec.getColumns()) { needsReverse = orderSpec.getDirection() != OrderByColumnSpec.Direction.ASCENDING; int dimIndex = OrderByColumnSpec.getDimIndexForOrderBy(orderSpec, dimensions);
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; }
if (limitSpec != null && limitSpec.getColumns().size() > 0) {
if (limitSpec.getColumns().isEmpty()) { descending = false; } else { final OrderByColumnSpec firstOrderBy = limitSpec.getColumns().get(0);
&& grouping.getDimensions().size() == 1 && limitSpec != null && (limitSpec.getColumns().size() <= 1 && limitSpec.getLimit() <= plannerContext.getPlannerConfig().getMaxTopNLimit()) && grouping.getHavingFilter() == null; if (limitSpec.getColumns().isEmpty()) { limitColumn = new OrderByColumnSpec( dimensionSpec.getOutputName(), ); } else { limitColumn = Iterables.getOnlyElement(limitSpec.getColumns());
/** * 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; }
public static StringComparator getComparatorForDimName(DefaultLimitSpec limitSpec, String dimName) { final OrderByColumnSpec orderBy = OrderByColumnSpec.getOrderByForDimName(limitSpec.getColumns(), dimName); if (orderBy == null) { return null; } return orderBy.getDimensionComparator(); }
final List<StringComparator> comparators = new ArrayList<>(); for (OrderByColumnSpec orderSpec : limitSpec.getColumns()) { boolean needsReverse = orderSpec.getDirection() != OrderByColumnSpec.Direction.ASCENDING; int dimIndex = OrderByColumnSpec.getDimIndexForOrderBy(orderSpec, dimensions);
final Set<Integer> orderByIndices = new HashSet<>(); for (OrderByColumnSpec orderSpec : limitSpec.getColumns()) { final boolean needsReverse = orderSpec.getDirection() != OrderByColumnSpec.Direction.ASCENDING; int dimIndex = OrderByColumnSpec.getDimIndexForOrderBy(orderSpec, dimensions);
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)) {
for (OrderByColumnSpec orderSpec : limitSpec.getColumns()) { needsReverse = orderSpec.getDirection() != OrderByColumnSpec.Direction.ASCENDING; int dimIndex = OrderByColumnSpec.getDimIndexForOrderBy(orderSpec, dimensions);
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; }
if (limitSpec != null && limitSpec.getColumns().size() > 0) {
if (limitSpec.getColumns().isEmpty()) { descending = false; } else { final OrderByColumnSpec firstOrderBy = limitSpec.getColumns().get(0);
&& grouping.getDimensions().size() == 1 && limitSpec != null && (limitSpec.getColumns().size() <= 1 && limitSpec.getLimit() <= plannerContext.getPlannerConfig().getMaxTopNLimit()) && grouping.getHavingFilter() == null; if (limitSpec.getColumns().isEmpty()) { limitColumn = new OrderByColumnSpec( dimensionSpec.getOutputName(), ); } else { limitColumn = Iterables.getOnlyElement(limitSpec.getColumns());