protected ILogicalOperator translateInsert()

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


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

        InsertDeleteUpsertOperator insertOp;
        if (!targetDatasource.getDataset().hasMetaPart()) {
            insertOp = new InsertDeleteUpsertOperator(targetDatasource, varRef, varRefsForLoading,
                    InsertDeleteUpsertOperator.Kind.INSERT, 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
            insertOp = new InsertDeleteUpsertOperator(targetDatasource, varRef, varRefsForLoading,
                    Collections.singletonList(new MutableObject<>(new VariableReferenceExpression(metaVar))),
                    InsertDeleteUpsertOperator.Kind.INSERT, false);
            // change current inputOp to be meta op
            pkeyAssignOp = metaVariableAssignOp;
        }

        insertOp.getInputs().add(new MutableObject<>(pkeyAssignOp));
        insertOp.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(insertOp, filterField, filterSourceIndicator == 0 ? seqVar : metaVar,
                    sourceLoc);
        }
        insertOp.setAdditionalFilteringExpressions(filterExprs);

        // Adds the commit operator.
        CompiledStatements.CompiledInsertStatement compiledInsert = (CompiledStatements.CompiledInsertStatement) stmt;
        Expression returnExpression = compiledInsert.getReturnExpression();
        DelegateOperator rootOperator = new DelegateOperator(new CommitOperator(returnExpression == null));
        rootOperator.getInputs().add(new MutableObject<>(insertOp));
        rootOperator.setSourceLocation(sourceLoc);

        // Compiles the return expression.
        return processReturningExpression(rootOperator, insertOp, compiledInsert, resultMetadata);
    }