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));
        }
Beispiel #3
0
        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);
        }
Beispiel #5
0
        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);
                                }
                            }
                        }
                    }
                }
            }
        }