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);
}