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