private List<Pair<IOrder, Mutable<ILogicalExpression>>> deepCopyOrderAndExpression( List<Pair<IOrder, Mutable<ILogicalExpression>>> ordersAndExprs) { List<Pair<IOrder, Mutable<ILogicalExpression>>> newOrdersAndExprs = new ArrayList<>(); for (Pair<IOrder, Mutable<ILogicalExpression>> pair : ordersAndExprs) { newOrdersAndExprs.add(new Pair<>(pair.first, deepCopyExpressionRef(pair.second))); } return newOrdersAndExprs; }
@Override public ILogicalOperator visitWriteResultOperator(WriteResultOperator op, Void arg) throws AlgebricksException { ArrayList<Mutable<ILogicalExpression>> newKeyExpressions = new ArrayList<>(); deepCopyExpressionRefs(newKeyExpressions, op.getKeyExpressions()); List<Mutable<ILogicalExpression>> newLSMComponentFilterExpressions = new ArrayList<>(); deepCopyExpressionRefs(newKeyExpressions, op.getAdditionalFilteringExpressions()); WriteResultOperator writeResultOp = new WriteResultOperator(op.getDataSource(), deepCopyExpressionRef(op.getPayloadExpression()), newKeyExpressions); writeResultOp.setAdditionalFilteringExpressions(newLSMComponentFilterExpressions); return writeResultOp; }
@Override public ILogicalOperator visitUnnestMapOperator(UnnestMapOperator op, Void arg) throws AlgebricksException { ArrayList<LogicalVariable> newInputList = new ArrayList<>(); newInputList.addAll(op.getVariables()); Mutable<ILogicalExpression> newSelectCondition = op.getSelectCondition() != null ? deepCopyExpressionRef(op.getSelectCondition()) : null; return new UnnestMapOperator(newInputList, deepCopyExpressionRef(op.getExpressionRef()), new ArrayList<>(op.getVariableTypes()), op.propagatesInput(), newSelectCondition, op.getOutputLimit()); }
@Override public ILogicalOperator visitInsertDeleteUpsertOperator(InsertDeleteUpsertOperator op, Void arg) throws AlgebricksException { List<Mutable<ILogicalExpression>> newKeyExpressions = new ArrayList<>(); deepCopyExpressionRefs(newKeyExpressions, op.getPrimaryKeyExpressions()); List<Mutable<ILogicalExpression>> newLSMComponentFilterExpressions = new ArrayList<>(); deepCopyExpressionRefs(newKeyExpressions, op.getAdditionalFilteringExpressions()); InsertDeleteUpsertOperator insertDeleteOp = new InsertDeleteUpsertOperator(op.getDataSource(), deepCopyExpressionRef(op.getPayloadExpression()), newKeyExpressions, op.getOperation(), op.isBulkload()); insertDeleteOp.setAdditionalFilteringExpressions(newLSMComponentFilterExpressions); return insertDeleteOp; }
@Override public ILogicalOperator visitInnerJoinOperator(InnerJoinOperator op, Void arg) throws AlgebricksException { return new InnerJoinOperator(deepCopyExpressionRef(op.getCondition()), op.getInputs().get(0), op.getInputs().get(1)); }
@Override public ILogicalOperator visitWindowOperator(WindowOperator op, Void arg) throws AlgebricksException { List<Mutable<ILogicalExpression>> newPartitionExprs = new ArrayList<>(); deepCopyExpressionRefs(op.getPartitionExpressions(), newPartitionExprs); List<Pair<IOrder, Mutable<ILogicalExpression>>> newOrderExprs = deepCopyOrderAndExpression(op.getOrderExpressions()); List<Pair<IOrder, Mutable<ILogicalExpression>>> newFrameValueExprs = deepCopyOrderAndExpression(op.getFrameValueExpressions()); List<Mutable<ILogicalExpression>> newFrameStartExprs = new ArrayList<>(); deepCopyExpressionRefs(newFrameStartExprs, op.getFrameStartExpressions()); List<Mutable<ILogicalExpression>> newFrameEndExprs = new ArrayList<>(); deepCopyExpressionRefs(newFrameEndExprs, op.getFrameEndExpressions()); List<Mutable<ILogicalExpression>> newFrameExclusionExprs = new ArrayList<>(); deepCopyExpressionRefs(newFrameExclusionExprs, op.getFrameExcludeExpressions()); ILogicalExpression newFrameOffset = deepCopyExpressionRef(op.getFrameOffset()).getValue(); List<LogicalVariable> newVariables = new ArrayList<>(); deepCopyVars(newVariables, op.getVariables()); List<Mutable<ILogicalExpression>> newExpressions = new ArrayList<>(); deepCopyExpressionRefs(newExpressions, op.getExpressions()); List<ILogicalPlan> newNestedPlans = new ArrayList<>(); WindowOperator newWinOp = new WindowOperator(newPartitionExprs, newOrderExprs, newFrameValueExprs, newFrameStartExprs, newFrameEndExprs, newFrameExclusionExprs, op.getFrameExcludeNegationStartIdx(), newFrameOffset, op.getFrameMaxObjects(), newVariables, newExpressions, newNestedPlans); for (ILogicalPlan nestedPlan : op.getNestedPlans()) { newNestedPlans.add(OperatorManipulationUtil.deepCopy(nestedPlan, newWinOp)); } return newWinOp; } }
@Override public ILogicalOperator visitLeftOuterUnnestMapOperator(LeftOuterUnnestMapOperator op, Void arg) throws AlgebricksException { ArrayList<LogicalVariable> newInputList = new ArrayList<>(); newInputList.addAll(op.getVariables()); return new LeftOuterUnnestMapOperator(newInputList, deepCopyExpressionRef(op.getExpressionRef()), new ArrayList<>(op.getVariableTypes()), op.propagatesInput()); }
@Override public ILogicalOperator visitGroupByOperator(GroupByOperator op, Void arg) throws AlgebricksException { List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> groupByList = new ArrayList<>(); List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> decoList = new ArrayList<>(); ArrayList<ILogicalPlan> newSubplans = new ArrayList<>(); for (Pair<LogicalVariable, Mutable<ILogicalExpression>> pair : op.getGroupByList()) { groupByList.add(new Pair<>(pair.first, deepCopyExpressionRef(pair.second))); } for (Pair<LogicalVariable, Mutable<ILogicalExpression>> pair : op.getDecorList()) { decoList.add(new Pair<>(pair.first, deepCopyExpressionRef(pair.second))); } GroupByOperator gbyOp = new GroupByOperator(groupByList, decoList, newSubplans, op.isGroupAll()); for (ILogicalPlan plan : op.getNestedPlans()) { newSubplans.add(OperatorManipulationUtil.deepCopy(plan, gbyOp)); } return gbyOp; }
@Override public ILogicalOperator visitLeftOuterJoinOperator(LeftOuterJoinOperator op, Void arg) throws AlgebricksException { return new LeftOuterJoinOperator(deepCopyExpressionRef(op.getCondition()), op.getInputs().get(0), op.getInputs().get(1)); }
@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 visitDataScanOperator(DataSourceScanOperator op, Void arg) throws AlgebricksException { ArrayList<LogicalVariable> newInputList = new ArrayList<>(); newInputList.addAll(op.getVariables()); Mutable<ILogicalExpression> newSelectCondition = op.getSelectCondition() != null ? deepCopyExpressionRef(op.getSelectCondition()) : null; DataSourceScanOperator newOp = new DataSourceScanOperator(newInputList, op.getDataSource(), newSelectCondition, op.getOutputLimit()); return newOp; }
@Override public ILogicalOperator visitForwardOperator(ForwardOperator op, Void arg) throws AlgebricksException { return new ForwardOperator(op.getRangeMapKey(), deepCopyExpressionRef(op.getRangeMapExpression())); }
@Override public ILogicalOperator visitSelectOperator(SelectOperator op, Void arg) throws AlgebricksException { return new SelectOperator(deepCopyExpressionRef(op.getCondition()), op.getRetainMissing(), op.getMissingPlaceholderVariable()); }
@Override public ILogicalOperator visitLeftOuterUnnestOperator(LeftOuterUnnestOperator op, Void arg) throws AlgebricksException { return new LeftOuterUnnestOperator(op.getVariable(), deepCopyExpressionRef(op.getExpressionRef()), op.getPositionalVariable(), op.getPositionalVariableType(), op.getPositionWriter()); }
@Override public ILogicalOperator visitUnnestOperator(UnnestOperator op, Void arg) throws AlgebricksException { return new UnnestOperator(op.getVariable(), deepCopyExpressionRef(op.getExpressionRef()), op.getPositionalVariable(), op.getPositionalVariableType(), op.getPositionWriter()); }