@Override public String visitInsertDeleteUpsertOperator(InsertDeleteUpsertOperator op, Boolean showDetails) { stringBuilder.setLength(0); String header = getIndexOpString(op.getOperation()); stringBuilder.append(header).append(str(op.getDataSource())).append(" from record: ") .append(op.getPayloadExpression().getValue().toString()); if (op.getAdditionalNonFilteringExpressions() != null) { stringBuilder.append(", meta: "); printExprList(op.getAdditionalNonFilteringExpressions()); } stringBuilder.append(" partitioned by "); printExprList(op.getPrimaryKeyExpressions()); if (op.getOperation() == Kind.UPSERT) { stringBuilder.append(" out: ([record-before-upsert:").append(op.getBeforeOpRecordVar()); if (op.getBeforeOpAdditionalNonFilteringVars() != null) { stringBuilder.append(", additional-before-upsert: ").append(op.getBeforeOpAdditionalNonFilteringVars()); } stringBuilder.append("]) "); } if (op.isBulkload()) { stringBuilder.append(" [bulkload]"); } appendSchema(op, showDetails); appendAnnotations(op, showDetails); appendPhysicalOperatorInfo(op, showDetails); return stringBuilder.toString(); }
@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; }
@SuppressWarnings({ "rawtypes", "unchecked" }) @Override public void contributeRuntimeOperator(IHyracksJobBuilder builder, JobGenContext context, ILogicalOperator op, IOperatorSchema propagatedSchema, IOperatorSchema[] inputSchemas, IOperatorSchema outerPlanSchema) throws AlgebricksException { InsertDeleteUpsertOperator insertDeleteOp = (InsertDeleteUpsertOperator) op; assert insertDeleteOp.getOperation() == Kind.INSERT; assert insertDeleteOp.isBulkload(); IMetadataProvider mp = context.getMetadataProvider(); IVariableTypeEnvironment typeEnv = context.getTypeEnvironment(op); JobSpecification spec = builder.getJobSpec(); RecordDescriptor inputDesc = JobGenHelper.mkRecordDescriptor( context.getTypeEnvironment(op.getInputs().get(0).getValue()), inputSchemas[0], context); Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> runtimeAndConstraints = mp.getInsertRuntime(dataSource, propagatedSchema, typeEnv, primaryKeys, payload, additionalFilteringKeys, additionalNonFilterVars, inputDesc, context, spec, true); IOperatorDescriptor opDesc = runtimeAndConstraints.first; opDesc.setSourceLocation(insertDeleteOp.getSourceLocation()); builder.contributeHyracksOperator(insertDeleteOp, opDesc); builder.contributeAlgebricksPartitionConstraint(opDesc, runtimeAndConstraints.second); ILogicalOperator src = insertDeleteOp.getInputs().get(0).getValue(); builder.contributeGraphEdge(src, 0, insertDeleteOp, 0); }
@Override public Void visitInsertDeleteUpsertOperator(InsertDeleteUpsertOperator op, Integer indent) throws AlgebricksException { String header = getIndexOpString(op.getOperation()); addIndent(indent).append(header).append(str(op.getDataSource())).append(" from record: ") .append(op.getPayloadExpression().getValue().accept(exprVisitor, indent)); if (op.getAdditionalNonFilteringExpressions() != null) { buffer.append(", meta: "); pprintExprList(op.getAdditionalNonFilteringExpressions(), indent); } buffer.append(" partitioned by "); pprintExprList(op.getPrimaryKeyExpressions(), indent); if (op.getOperation() == Kind.UPSERT) { buffer.append(" out: ([record-before-upsert:" + op.getBeforeOpRecordVar() + ((op.getBeforeOpAdditionalNonFilteringVars() != null) ? (", additional-before-upsert: " + op.getBeforeOpAdditionalNonFilteringVars()) : "") + "]) "); } if (op.isBulkload()) { buffer.append(" [bulkload]"); } return null; }
if (insertDeleteOp.getOperation() == InsertDeleteUpsertOperator.Kind.DELETE) { return false;
@Override public Void visitInsertDeleteUpsertOperator(InsertDeleteUpsertOperator op, Integer indent) throws AlgebricksException { String header = "\"operator\": \"" + getIndexOpString(op.getOperation()) + "\",\n"; addIndent(indent).append(header); addIndent(indent).append(str("\"data-source\": \"" + op.getDataSource() + "\",\n")); pprintExprList(op.getPrimaryKeyExpressions(), 0); buffer.append("}"); if (op.getOperation() == Kind.UPSERT) { addIndent(indent).append(",\n\"out\": {\n"); addIndent(indent).append("\"record-before-upsert\": \"" + op.getBeforeOpRecordVar() + "\"");
if (primaryIndexModificationOp.getOperation() == Kind.INSERT || primaryIndexModificationOp.getOperation() == Kind.UPSERT || primaryIndexModificationOp.getOperation() == Kind.DELETE) { injectFieldAccessesForIndexes(context, dataset, indexes, fieldVarsForNewRecord, recType, metaType, newRecordVar, newMetaVar, primaryIndexModificationOp, false); if (primaryIndexModificationOp.getOperation() == Kind.UPSERT skVarRef.setSourceLocation(sourceLoc); secondaryExpressions.add(new MutableObject<ILogicalExpression>(skVarRef)); if (primaryIndexModificationOp.getOperation() == Kind.UPSERT) { VariableReferenceExpression varRef = new VariableReferenceExpression(fieldVarsForBeforeOperation.get(indexFieldId)); (primaryIndexModificationOp.getOperation() == Kind.UPSERT) ? null : createFilterExpression(secondaryKeyVars, context.getOutputTypeEnvironment(currentTop), index.isOverridingKeyFieldTypes(), sourceLoc); tokenizeKeyVars, filterExpression, primaryIndexModificationOp.getOperation(), primaryIndexModificationOp.isBulkload(), isPartitioned, varTypes); tokenUpdate.setSourceLocation(sourceLoc); indexUpdate = new IndexInsertDeleteUpsertOperator(dataSourceIndex, primaryIndexModificationOp.getPrimaryKeyExpressions(), tokenizeKeyExprs, filterExpression, primaryIndexModificationOp.getOperation(), primaryIndexModificationOp.isBulkload(), primaryIndexModificationOp.getAdditionalNonFilteringExpressions() == null ? 0 : primaryIndexModificationOp.getAdditionalNonFilteringExpressions().size());
if (op2.getOperatorTag() == LogicalOperatorTag.INSERT_DELETE_UPSERT) { InsertDeleteUpsertOperator insertDeleteOp = (InsertDeleteUpsertOperator) op2; if (insertDeleteOp.getOperation() == InsertDeleteUpsertOperator.Kind.DELETE) { return false;
if (insertOp.getOperation() != Kind.INSERT && insertOp.getOperation() != Kind.UPSERT) { return false;
} else { op.setPhysicalOperator(new InsertDeleteUpsertPOperator(payload, keys, additionalFilteringKeys, opLoad.getDataSource(), opLoad.getOperation(), additionalNonFilterVariables));