@Override public boolean rewritePost(Mutable<ILogicalOperator> opRef, IOptimizationContext ctx) throws AlgebricksException { parents.remove(parents.size() - 1); AbstractLogicalOperator orderOp = (AbstractLogicalOperator) opRef.getValue(); if (orderOp.getOperatorTag() == LogicalOperatorTag.ORDER && !orderOp.getAnnotations().containsKey(OperatorAnnotations.USE_STATIC_RANGE)) { // disable when sort output is consumed by limit & running agg op (result should be unpartitioned for limit) AbstractLogicalOperator parent; for (int i = parents.size() - 1; i >= 0; i--) { parent = parents.get(i); if (parent.getOperatorTag() == LogicalOperatorTag.LIMIT && ((LimitOperator) parent).isTopmostLimitOp()) { orderOp.getAnnotations().put(OperatorAnnotations.USE_DYNAMIC_RANGE, Boolean.FALSE); return true; } if (parent.getOperatorTag() == LogicalOperatorTag.RUNNINGAGGREGATE) { orderOp.getAnnotations().put(OperatorAnnotations.USE_DYNAMIC_RANGE, Boolean.FALSE); return true; } } } return false; } }
@Override public ILogicalOperator visitLimitOperator(LimitOperator op, Void arg) throws AlgebricksException { return new LimitOperator(deepCopyExpressionRef(op.getMaxObjects()).getValue(), deepCopyExpressionRef(op.getOffset()).getValue(), op.isTopmostLimitOp()); }
@Override public ILogicalOperator visitLimitOperator(LimitOperator op, ILogicalOperator arg) throws AlgebricksException { LimitOperator opCopy = new LimitOperator(exprDeepCopyVisitor.deepCopy(op.getMaxObjects().getValue()), exprDeepCopyVisitor.deepCopy(op.getOffset().getValue()), op.isTopmostLimitOp()); deepCopyInputsAnnotationsAndExecutionMode(op, arg, opCopy); return opCopy; }
if (!limitOp.isTopmostLimitOp()) { return false;
if (op.getOperatorTag() == LogicalOperatorTag.LIMIT) { LimitOperator opLim = (LimitOperator) op; if (opLim.isTopmostLimitOp()) { opLim.setExecutionMode(AbstractLogicalOperator.ExecutionMode.UNPARTITIONED); forceUnpartitioned = true;