protected ILogicalOperator translateDelete()

in asterix-bad/src/main/java/org/apache/asterix/bad/lang/BADExpressionToPlanTranslator.java [75:117]


    protected ILogicalOperator translateDelete(DatasetDataSource targetDatasource, Mutable<ILogicalExpression> varRef,
            List<Mutable<ILogicalExpression>> varRefsForLoading, LogicalVariable seqVar, ILogicalOperator pkeyAssignOp,
            CompiledStatements.ICompiledDmlStatement stmt) throws AlgebricksException {
        SourceLocation sourceLoc = stmt.getSourceLocation();
        InsertDeleteUpsertOperator deleteOp;
        LogicalVariable metaVar = null;

        if (!targetDatasource.getDataset().hasMetaPart()) {
            deleteOp = new InsertDeleteUpsertOperator(targetDatasource, varRef, varRefsForLoading,
                    InsertDeleteUpsertOperator.Kind.DELETE, false);
        } else {
            // prepare meta record
            IAType metaType = metadataProvider.findMetaType(targetDatasource.getDataset());
            metaVar = context.newVar();
            AssignOperator metaVariableAssignOp =
                    new AssignOperator(metaVar, new MutableObject<>(makeMetaRecordExpr(metaType)));
            metaVariableAssignOp.getInputs().add(new MutableObject<>(pkeyAssignOp));
            metaVariableAssignOp.setSourceLocation(sourceLoc);
            // create insert op uses meta record
            deleteOp = new InsertDeleteUpsertOperator(targetDatasource, varRef, varRefsForLoading,
                    Collections.singletonList(new MutableObject<>(new VariableReferenceExpression(metaVar))),
                    InsertDeleteUpsertOperator.Kind.DELETE, false);
            // change current inputOp to be meta op
            pkeyAssignOp = metaVariableAssignOp;
        }

        deleteOp.getInputs().add(new MutableObject<>(pkeyAssignOp));
        deleteOp.setSourceLocation(sourceLoc);

        List<String> filterField = DatasetUtil.getFilterField(targetDatasource.getDataset());
        List<Mutable<ILogicalExpression>> filterExprs = null;
        Integer filterSourceIndicator = DatasetUtil.getFilterSourceIndicator(targetDatasource.getDataset());
        if (filterField != null) {
            filterExprs = generatedFilterExprs(deleteOp, filterField, filterSourceIndicator == 0 ? seqVar : metaVar,
                    sourceLoc);
        }
        deleteOp.setAdditionalFilteringExpressions(filterExprs);

        DelegateOperator leafOperator = new DelegateOperator(new CommitOperator(true));
        leafOperator.getInputs().add(new MutableObject<>(deleteOp));
        leafOperator.setSourceLocation(sourceLoc);
        return leafOperator;
    }