private static void VisitSubselectOnTrigger( OnTriggerDesc onTriggerDesc, ExprNodeSubselectDeclaredDotVisitor visitor) { if (onTriggerDesc is OnTriggerWindowUpdateDesc) { OnTriggerWindowUpdateDesc updates = (OnTriggerWindowUpdateDesc) onTriggerDesc; foreach (OnTriggerSetAssignment assignment in updates.Assignments) { assignment.Expression.Accept(visitor); } } else if (onTriggerDesc is OnTriggerSetDesc) { OnTriggerSetDesc sets = (OnTriggerSetDesc) onTriggerDesc; foreach (OnTriggerSetAssignment assignment in sets.Assignments) { assignment.Expression.Accept(visitor); } } else if (onTriggerDesc is OnTriggerSplitStreamDesc) { OnTriggerSplitStreamDesc splits = (OnTriggerSplitStreamDesc) onTriggerDesc; foreach (OnTriggerSplitStream split in splits.SplitStreams) { split.WhereClause?.Accept(visitor); if (split.SelectClause.SelectExprList != null) { WalkSubselectSelectClause(split.SelectClause.SelectExprList, visitor); } } } else if (onTriggerDesc is OnTriggerMergeDesc) { OnTriggerMergeDesc merge = (OnTriggerMergeDesc) onTriggerDesc; foreach (OnTriggerMergeMatched matched in merge.Items) { matched.OptionalMatchCond?.Accept(visitor); foreach (OnTriggerMergeAction action in matched.Actions) { action.OptionalWhereClause?.Accept(visitor); if (action is OnTriggerMergeActionUpdate) { OnTriggerMergeActionUpdate update = (OnTriggerMergeActionUpdate) action; foreach (OnTriggerSetAssignment assignment in update.Assignments) { assignment.Expression.Accept(visitor); } } if (action is OnTriggerMergeActionInsert) { OnTriggerMergeActionInsert insert = (OnTriggerMergeActionInsert) action; WalkSubselectSelectClause(insert.SelectClause, visitor); } } } if (merge.OptionalInsertNoMatch != null) { WalkSubselectSelectClause(merge.OptionalInsertNoMatch.SelectClause, visitor); } } }
private NamedWindowOnMergeActionIns SetupInsert( string namedWindowName, InternalEventRouter internalEventRouter, EventTypeSPI eventTypeNamedWindow, int selectClauseNumber, OnTriggerMergeActionInsert desc, EventType triggeringEventType, string triggeringStreamName, StatementContext statementContext) { // Compile insert-into info var streamName = desc.OptionalStreamName ?? eventTypeNamedWindow.Name; var insertIntoDesc = InsertIntoDesc.FromColumns(streamName, desc.Columns); // rewrite any wildcards to use "stream.wildcard" if (triggeringStreamName == null) { triggeringStreamName = UuidGenerator.Generate(); } var selectNoWildcard = CompileSelectNoWildcard(triggeringStreamName, desc.SelectClauseCompiled); // Set up event types for select-clause evaluation: The first type does not contain anything as its the named window row which is not present for insert EventType dummyTypeNoProperties = new MapEventType(EventTypeMetadata.CreateAnonymous("merge_named_window_insert"), "merge_named_window_insert", 0, null, Collections.GetEmptyMap <string, object>(), null, null, null); var eventTypes = new EventType[] { dummyTypeNoProperties, triggeringEventType }; var streamNames = new string[] { UuidGenerator.Generate(), triggeringStreamName }; StreamTypeService streamTypeService = new StreamTypeServiceImpl(eventTypes, streamNames, new bool[1], statementContext.EngineURI, false); // Get select expr processor var selectExprEventTypeRegistry = new SelectExprEventTypeRegistry(statementContext.StatementName, statementContext.StatementEventTypeRef); var exprEvaluatorContext = new ExprEvaluatorContextStatement(statementContext, false); var insertHelper = SelectExprProcessorFactory.GetProcessor( Collections.SingletonSet <int>(selectClauseNumber), selectNoWildcard.ToArray(), false, insertIntoDesc, null, null, streamTypeService, statementContext.EventAdapterService, statementContext.StatementResultService, statementContext.ValueAddEventService, selectExprEventTypeRegistry, statementContext.MethodResolutionService, exprEvaluatorContext, statementContext.VariableService, statementContext.ScriptingService, statementContext.TableService, statementContext.TimeProvider, statementContext.EngineURI, statementContext.StatementId, statementContext.StatementName, statementContext.Annotations, statementContext.ContextDescriptor, statementContext.ConfigSnapshot, null, statementContext.NamedWindowService, null); var filterEval = desc.OptionalWhereClause == null ? null : desc.OptionalWhereClause.ExprEvaluator; var routerToUser = streamName.Equals(namedWindowName) ? null : internalEventRouter; var audit = AuditEnum.INSERT.GetAudit(statementContext.Annotations) != null; string insertIntoTableName = null; if (statementContext.TableService.GetTableMetadata(insertIntoDesc.EventTypeName) != null) { insertIntoTableName = insertIntoDesc.EventTypeName; } return(new NamedWindowOnMergeActionIns(filterEval, insertHelper, routerToUser, insertIntoTableName, statementContext.TableService, statementContext.EpStatementHandle, statementContext.InternalEventEngineRouteDest, audit)); }
public static bool IsWritesToTables(StatementSpecRaw statementSpec, TableService tableService) { // determine if writing to a table: // insert-into (single) if (statementSpec.InsertIntoDesc != null) { if (IsTable(statementSpec.InsertIntoDesc.EventTypeName, tableService)) { return(true); } } // into-table if (statementSpec.IntoTableSpec != null) { return(true); } // triggers if (statementSpec.OnTriggerDesc != null) { OnTriggerDesc onTriggerDesc = statementSpec.OnTriggerDesc; // split-stream insert-into if (onTriggerDesc.OnTriggerType == OnTriggerType.ON_SPLITSTREAM) { OnTriggerSplitStreamDesc split = (OnTriggerSplitStreamDesc)onTriggerDesc; foreach (OnTriggerSplitStream stream in split.SplitStreams) { if (IsTable(stream.InsertInto.EventTypeName, tableService)) { return(true); } } } // on-delete/update/merge/on-selectdelete if (onTriggerDesc is OnTriggerWindowDesc) { OnTriggerWindowDesc window = (OnTriggerWindowDesc)onTriggerDesc; if (onTriggerDesc.OnTriggerType == OnTriggerType.ON_DELETE || onTriggerDesc.OnTriggerType == OnTriggerType.ON_UPDATE || onTriggerDesc.OnTriggerType == OnTriggerType.ON_MERGE || window.IsDeleteAndSelect) { if (IsTable(window.WindowName, tableService)) { return(true); } } } // on-merge with insert-action if (onTriggerDesc is OnTriggerMergeDesc) { OnTriggerMergeDesc merge = (OnTriggerMergeDesc)onTriggerDesc; foreach (OnTriggerMergeMatched item in merge.Items) { foreach (OnTriggerMergeAction action in item.Actions) { if (action is OnTriggerMergeActionInsert) { OnTriggerMergeActionInsert insert = (OnTriggerMergeActionInsert)action; if (insert.OptionalStreamName != null && IsTable(insert.OptionalStreamName, tableService)) { return(true); } } } } } } // end of trigger handling // fire-and-forget insert/update/delete if (statementSpec.FireAndForgetSpec != null) { FireAndForgetSpec faf = statementSpec.FireAndForgetSpec; if (faf is FireAndForgetSpecDelete || faf is FireAndForgetSpecInsert || faf is FireAndForgetSpecUpdate) { if (statementSpec.StreamSpecs.Count == 1) { return(IsTable(((FilterStreamSpecRaw)statementSpec.StreamSpecs[0]).RawFilterSpec.EventTypeName, tableService)); } } } return(false); }
private InfraOnMergeActionInsForge SetupInsert( string infraName, EventType infraType, OnTriggerMergeActionInsert desc, EventType triggeringEventType, string triggeringStreamName, StatementRawInfo statementRawInfo, StatementCompileTimeServices services, bool isTable) { // Compile insert-into info var streamName = desc.OptionalStreamName != null ? desc.OptionalStreamName : infraName; InsertIntoDesc insertIntoDesc = InsertIntoDesc.FromColumns(streamName, desc.Columns); // rewrite any wildcards to use "stream.wildcard" if (triggeringStreamName == null) { triggeringStreamName = UuidGenerator.Generate(); } var selectNoWildcard = CompileSelectNoWildcard(triggeringStreamName, desc.SelectClauseCompiled); // Set up event types for select-clause evaluation: The first type does not contain anything as its the named-window or table row which is not present for insert var eventTypeMetadata = new EventTypeMetadata( "merge_infra_insert", statementRawInfo.ModuleName, EventTypeTypeClass.STREAM, EventTypeApplicationType.MAP, NameAccessModifier.TRANSIENT, EventTypeBusModifier.NONBUS, false, EventTypeIdPair.Unassigned()); EventType dummyTypeNoProperties = BaseNestableEventUtil.MakeMapTypeCompileTime( eventTypeMetadata, Collections.GetEmptyMap<string, object>(), null, null, null, null, services.BeanEventTypeFactoryPrivate, services.EventTypeCompileTimeResolver); var eventTypes = new EventType[] {dummyTypeNoProperties, triggeringEventType}; var streamNames = new string[] {UuidGenerator.Generate(), triggeringStreamName}; StreamTypeService streamTypeService = new StreamTypeServiceImpl( eventTypes, streamNames, new bool[eventTypes.Length], false, false); // Get select expr processor var selectClause = selectNoWildcard.ToArray(); var args = new SelectProcessorArgs( selectClause, null, false, null, null, streamTypeService, null, false, statementRawInfo.Annotations, statementRawInfo, services); if (isTable && streamName.Equals(infraName)) { args.OptionalInsertIntoEventType = infraType; } SelectExprProcessorForge insertHelperForge = SelectExprProcessorFactory.GetProcessor(args, insertIntoDesc, false).Forge; ExprNode filterEval = desc.OptionalWhereClause; var route = !streamName.Equals(infraName); bool audit = AuditEnum.INSERT.GetAudit(statementRawInfo.Annotations) != null; TableMetaData insertIntoTable = services.TableCompileTimeResolver.Resolve(insertIntoDesc.EventTypeName); return new InfraOnMergeActionInsForge(filterEval, insertHelperForge, insertIntoTable, audit, route); }
private static void VisitSubselectOnTrigger(OnTriggerDesc onTriggerDesc, ExprNodeSubselectDeclaredDotVisitor visitor) { if (onTriggerDesc is OnTriggerWindowUpdateDesc) { OnTriggerWindowUpdateDesc updates = (OnTriggerWindowUpdateDesc)onTriggerDesc; foreach (OnTriggerSetAssignment assignment in updates.Assignments) { assignment.Expression.Accept(visitor); } } else if (onTriggerDesc is OnTriggerSetDesc) { OnTriggerSetDesc sets = (OnTriggerSetDesc)onTriggerDesc; foreach (OnTriggerSetAssignment assignment in sets.Assignments) { assignment.Expression.Accept(visitor); } } else if (onTriggerDesc is OnTriggerSplitStreamDesc) { OnTriggerSplitStreamDesc splits = (OnTriggerSplitStreamDesc)onTriggerDesc; foreach (OnTriggerSplitStream split in splits.SplitStreams) { if (split.WhereClause != null) { split.WhereClause.Accept(visitor); } if (split.SelectClause.SelectExprList != null) { foreach (SelectClauseElementRaw element in split.SelectClause.SelectExprList) { if (element is SelectClauseExprRawSpec) { SelectClauseExprRawSpec selectExpr = (SelectClauseExprRawSpec)element; selectExpr.SelectExpression.Accept(visitor); } } } } } else if (onTriggerDesc is OnTriggerMergeDesc) { OnTriggerMergeDesc merge = (OnTriggerMergeDesc)onTriggerDesc; foreach (OnTriggerMergeMatched matched in merge.Items) { if (matched.OptionalMatchCond != null) { matched.OptionalMatchCond.Accept(visitor); } foreach (OnTriggerMergeAction action in matched.Actions) { if (action.OptionalWhereClause != null) { action.OptionalWhereClause.Accept(visitor); } if (action is OnTriggerMergeActionUpdate) { OnTriggerMergeActionUpdate update = (OnTriggerMergeActionUpdate)action; foreach (OnTriggerSetAssignment assignment in update.Assignments) { assignment.Expression.Accept(visitor); } } if (action is OnTriggerMergeActionInsert) { OnTriggerMergeActionInsert insert = (OnTriggerMergeActionInsert)action; foreach (SelectClauseElementRaw element in insert.SelectClause) { if (element is SelectClauseExprRawSpec) { SelectClauseExprRawSpec selectExpr = (SelectClauseExprRawSpec)element; selectExpr.SelectExpression.Accept(visitor); } } } } } } }