Ejemplo n.º 1
0
        public override void Start(MatchedEventMap beginState)
        {
            var agentInstanceContext = _evalFilterNode.Context.AgentInstanceContext;
            agentInstanceContext.InstrumentationProvider.QPatternFilterStart(_evalFilterNode.factoryNode, beginState);

            _beginState = beginState;
            if (_isStarted) {
                throw new IllegalStateException("Filter state node already active");
            }

            agentInstanceContext.AuditProvider.PatternInstance(true, _evalFilterNode.factoryNode, agentInstanceContext);

            // Start the filter
            _isStarted = true;

            var filterService = _evalFilterNode.Context.FilterService;
            _handle = new EPStatementHandleCallbackFilter(
                _evalFilterNode.Context.AgentInstanceContext.EpStatementAgentInstanceHandle,
                this);
            var filterSpec = _evalFilterNode.FactoryNode.FilterSpec;
            var filterValues = filterSpec.GetValueSet(
                beginState,
                _evalFilterNode.AddendumFilters,
                agentInstanceContext,
                agentInstanceContext.StatementContextFilterEvalEnv);
            if (filterValues != null) {
                filterService.Add(filterSpec.FilterForEventType, filterValues, _handle);
                var filtersVersion = filterService.FiltersVersion;
                _evalFilterNode.Context.AgentInstanceContext.EpStatementAgentInstanceHandle.StatementFilterVersion
                    .StmtFilterVersion = filtersVersion;
            }

            agentInstanceContext.InstrumentationProvider.APatternFilterStart();
        }
        public ContextControllerHashFilterEntry(
            ContextControllerHashImpl callback,
            IntSeqKey controllerPath,
            ContextControllerDetailHashItem item,
            object[] parentPartitionKeys)
        {
            this.callback = callback;
            this.controllerPath = controllerPath;
            this.item = item;

            AgentInstanceContext agentInstanceContext = callback.AgentInstanceContextCreate;
            this.filterHandle = new EPStatementHandleCallbackFilter(
                agentInstanceContext.EpStatementAgentInstanceHandle,
                this);
            FilterValueSetParam[][] addendum = ContextManagerUtil.ComputeAddendumNonStmt(
                parentPartitionKeys,
                item.FilterSpecActivatable,
                callback.Realization);
            this.filterValueSet = item.FilterSpecActivatable.GetValueSet(
                null,
                addendum,
                agentInstanceContext,
                agentInstanceContext.StatementContextFilterEvalEnv);
            agentInstanceContext.FilterService.Add(
                item.FilterSpecActivatable.FilterForEventType,
                filterValueSet,
                filterHandle);
            long filtersVersion = agentInstanceContext.FilterService.FiltersVersion;
            agentInstanceContext.EpStatementAgentInstanceHandle.StatementFilterVersion.StmtFilterVersion =
                filtersVersion;
        }
Ejemplo n.º 3
0
        public void Deactivate()
        {
            if (filterHandle == null) {
                return;
            }

            AgentInstanceContext agentInstanceContext = controller.Realization.AgentInstanceContextCreate;
            FilterValueSetParam[][] addendum = ContextManagerUtil.ComputeAddendumNonStmt(
                partitionKeys,
                filter.FilterSpecActivatable,
                controller.Realization);
            FilterValueSetParam[][] filterValueSet = filter.FilterSpecActivatable.GetValueSet(
                null,
                addendum,
                agentInstanceContext,
                agentInstanceContext.StatementContextFilterEvalEnv);
            agentInstanceContext.FilterService.Remove(
                filterHandle,
                filter.FilterSpecActivatable.FilterForEventType,
                filterValueSet);
            filterHandle = null;
            long filtersVersion = agentInstanceContext.StatementContext.FilterService.FiltersVersion;
            agentInstanceContext.EpStatementAgentInstanceHandle.StatementFilterVersion.StmtFilterVersion =
                filtersVersion;
        }
Ejemplo n.º 4
0
 public void VisitFilter(
     EvalFilterFactoryNode factoryNode,
     EvalStateNode stateNode,
     EPStatementHandleCallbackFilter handle,
     MatchedEventMap beginState)
 {
     stateNode.Transfer(services);
 }
Ejemplo n.º 5
0
 /// <summary>
 ///     Ctor.
 /// </summary>
 /// <param name="epRuntime">runtime to process</param>
 /// <param name="handleCallback">callback</param>
 /// <param name="theEvent">event</param>
 /// <param name="filterVersion">version of filter</param>
 public RouteUnitSingle(
     EPEventServiceImpl epRuntime,
     EPStatementHandleCallbackFilter handleCallback,
     EventBean theEvent,
     long filterVersion)
 {
     this.epRuntime = epRuntime;
     this.theEvent = theEvent;
     this.handleCallback = handleCallback;
     this.filterVersion = filterVersion;
 }
Ejemplo n.º 6
0
 public void AddFilterCallback(
     FilterHandleCallback filterHandleCallback,
     AgentInstanceContext agentInstanceContext,
     EventType eventType,
     FilterValueSetParam[][] @params,
     int filterCallbackId)
 {
     var handle = new EPStatementHandleCallbackFilter(
         agentInstanceContext.EpStatementAgentInstanceHandle,
         filterHandleCallback);
     agentInstanceContext.FilterService.Add(eventType, @params, handle);
     handlesPerOp.Put(filterHandleCallback, handle);
 }
Ejemplo n.º 7
0
        protected void Stop(FilterSpecActivatable activatable)
        {
            if (filterHandle == null) {
                return;
            }

            var agentInstanceContext = callback.AgentInstanceContextCreate;
            agentInstanceContext.FilterService.Remove(filterHandle, activatable.FilterForEventType, filterValueSet);
            var filtersVersion = agentInstanceContext.FilterService.FiltersVersion;
            agentInstanceContext.EpStatementAgentInstanceHandle.StatementFilterVersion.StmtFilterVersion =
                filtersVersion;
            filterHandle = null;
            filterValueSet = null;
        }
Ejemplo n.º 8
0
        public bool Activate(
            EventBean optionalTriggeringEvent,
            ContextControllerEndConditionMatchEventProvider endConditionMatchEventProvider)
        {
            AgentInstanceContext agentInstanceContext = controller.Realization.AgentInstanceContextCreate;

            FilterHandleCallback filterCallback = new ProxyFilterHandleCallback() {
                ProcMatchFound = (
                    theEvent,
                    allStmtMatches) => FilterMatchFound(theEvent),
                ProcIsSubselect = () => false,
            };

            FilterValueSetParam[][] addendum = ContextManagerUtil.ComputeAddendumNonStmt(
                partitionKeys,
                filter.FilterSpecActivatable,
                controller.Realization);
            filterHandle = new EPStatementHandleCallbackFilter(
                agentInstanceContext.EpStatementAgentInstanceHandle,
                filterCallback);
            FilterValueSetParam[][] filterValueSet = filter.FilterSpecActivatable.GetValueSet(
                null,
                addendum,
                agentInstanceContext,
                agentInstanceContext.StatementContextFilterEvalEnv);
            agentInstanceContext.FilterService.Add(
                filter.FilterSpecActivatable.FilterForEventType,
                filterValueSet,
                filterHandle);
            long filtersVersion = agentInstanceContext.FilterService.FiltersVersion;
            agentInstanceContext.EpStatementAgentInstanceHandle.StatementFilterVersion.StmtFilterVersion =
                filtersVersion;

            bool match = false;
            if (optionalTriggeringEvent != null) {
                match = AgentInstanceUtil.EvaluateFilterForStatement(
                    optionalTriggeringEvent,
                    agentInstanceContext,
                    filterHandle);
            }

            return match;
        }
Ejemplo n.º 9
0
        public void Deactivate()
        {
            if (filterHandle == null) {
                return;
            }

            var agentInstanceContext = controller.Realization.AgentInstanceContextCreate;
            var filterValueSet = ComputeFilterValues(agentInstanceContext);
            if (filterValueSet != null) {

                agentInstanceContext.FilterService.Remove(
                    filterHandle,
                    filter.FilterSpecActivatable.FilterForEventType,
                    filterValueSet);
                var filtersVersion = agentInstanceContext.StatementContext.FilterService.FiltersVersion;
                agentInstanceContext.EpStatementAgentInstanceHandle.StatementFilterVersion.StmtFilterVersion =
                    filtersVersion;
            }

            filterHandle = null;
        }
Ejemplo n.º 10
0
        private void StopFiltering()
        {
            var agentInstanceContext = _evalFilterNode.Context.AgentInstanceContext;
            var filterSpec = _evalFilterNode.FactoryNode.FilterSpec;
            var filterValues = filterSpec.GetValueSet(
                _beginState,
                _evalFilterNode.AddendumFilters,
                agentInstanceContext,
                agentInstanceContext.StatementContextFilterEvalEnv);
            var filterService = _evalFilterNode.Context.FilterService;
            if (_handle != null && filterValues != null) {
                filterService.Remove(_handle, filterSpec.FilterForEventType, filterValues);
                var filtersVersionX = filterService.FiltersVersion;
                _evalFilterNode.Context.AgentInstanceContext.EpStatementAgentInstanceHandle.StatementFilterVersion.StmtFilterVersion = filtersVersionX;
            }

            _handle = null;
            _isStarted = false;
            var filtersVersion = filterService.FiltersVersion;
            _evalFilterNode.Context.AgentInstanceContext.EpStatementAgentInstanceHandle.StatementFilterVersion
                .StmtFilterVersion = filtersVersion;
        }
        private static void Process(
            AgentInstance agentInstance,
            ICollection<FilterHandle> callbacks,
            EventBean theEvent)
        {
            AgentInstanceContext agentInstanceContext = agentInstance.AgentInstanceContext;
            using (agentInstance.AgentInstanceContext.AgentInstanceLock.AcquireWriteLock()) {
                try {
                    agentInstance.AgentInstanceContext.VariableManagementService.SetLocalVersion();

                    // sub-selects always go first
                    foreach (FilterHandle handle in callbacks) {
                        EPStatementHandleCallbackFilter callback = (EPStatementHandleCallbackFilter) handle;
                        if (callback.AgentInstanceHandle != agentInstanceContext.EpStatementAgentInstanceHandle) {
                            continue;
                        }

                        callback.FilterCallback.MatchFound(theEvent, null);
                    }

                    agentInstanceContext.EpStatementAgentInstanceHandle.InternalDispatch();
                }
                catch (EPException) {
                    throw;
                }
                catch (Exception ex) {
                    agentInstanceContext.ExceptionHandlingService.HandleException(
                        ex,
                        agentInstanceContext.EpStatementAgentInstanceHandle,
                        ExceptionHandlerExceptionType.PROCESS,
                        theEvent);
                }
                finally {
                    if (agentInstanceContext.StatementContext.EpStatementHandle.HasTableAccess) {
                        agentInstanceContext.TableExprEvaluatorContext.ReleaseAcquiredLocks();
                    }
                }
            }
        }
Ejemplo n.º 12
0
        public bool Activate(
            EventBean optionalTriggeringEvent,
            ContextControllerEndConditionMatchEventProvider endConditionMatchEventProvider,
            IDictionary<string, object> optionalTriggeringPattern)
        {
            var agentInstanceContext = controller.Realization.AgentInstanceContextCreate;

            FilterHandleCallback filterCallback = new ProxyFilterHandleCallback() {
                ProcMatchFound = (
                    theEvent,
                    allStmtMatches) => FilterMatchFound(theEvent),
                ProcIsSubselect = () => false,
            };

            filterHandle = new EPStatementHandleCallbackFilter(
                agentInstanceContext.EpStatementAgentInstanceHandle,
                filterCallback);
            var filterValueSet = ComputeFilterValues(agentInstanceContext);
            if (filterValueSet != null) {
                agentInstanceContext.FilterService.Add(
                    filter.FilterSpecActivatable.FilterForEventType,
                    filterValueSet,
                    filterHandle);
                var filtersVersion = agentInstanceContext.FilterService.FiltersVersion;
                agentInstanceContext.EpStatementAgentInstanceHandle.StatementFilterVersion.StmtFilterVersion = filtersVersion;
            }

            var match = false;
            if (optionalTriggeringEvent != null) {
                match = AgentInstanceUtil.EvaluateFilterForStatement(
                    optionalTriggeringEvent,
                    agentInstanceContext,
                    filterHandle);
            }

            return match;
        }
Ejemplo n.º 13
0
        protected void Start(FilterSpecActivatable activatable)
        {
            if (filterHandle != null) {
                throw new IllegalStateException("Already started");
            }

            var agentInstanceContext = callback.AgentInstanceContextCreate;
            filterHandle = new EPStatementHandleCallbackFilter(
                agentInstanceContext.EpStatementAgentInstanceHandle,
                this);
            var addendum = ContextManagerUtil.ComputeAddendumNonStmt(
                parentPartitionKeys,
                activatable,
                callback.Realization);
            filterValueSet = activatable.GetValueSet(
                null,
                addendum,
                agentInstanceContext,
                agentInstanceContext.StatementContextFilterEvalEnv);
            agentInstanceContext.FilterService.Add(activatable.FilterForEventType, filterValueSet, filterHandle);
            var filtersVersion = agentInstanceContext.FilterService.FiltersVersion;
            agentInstanceContext.EpStatementAgentInstanceHandle.StatementFilterVersion.StmtFilterVersion =
                filtersVersion;
        }
Ejemplo n.º 14
0
        public ViewableActivationResult Activate(
            AgentInstanceContext agentInstanceContext,
            bool isSubselect,
            bool isRecoveringResilient)
        {
            FilterValueSetParam[][] addendum = null;
            if (agentInstanceContext.AgentInstanceFilterProxy != null) {
                addendum = agentInstanceContext.AgentInstanceFilterProxy.GetAddendumFilters(
                    FilterSpec,
                    agentInstanceContext);
            }

            var filterValues = FilterSpec.GetValueSet(
                null,
                addendum,
                agentInstanceContext,
                agentInstanceContext.StatementContextFilterEvalEnv);

            EventStream theStream;
            if (!agentInstanceContext.AuditProvider.Activated() &&
                !agentInstanceContext.InstrumentationProvider.Activated()) {
                theStream = CanIterate
                    ? new ZeroDepthStreamIterable(FilterSpec.ResultEventType)
                    : (EventStream) new ZeroDepthStreamNoIterate(FilterSpec.ResultEventType);
            }
            else {
                var streamNum = StreamNumFromClause ?? -1;
                theStream = CanIterate
                    ? new ZeroDepthStreamIterableWAudit(
                        FilterSpec.ResultEventType,
                        agentInstanceContext,
                        FilterSpec,
                        streamNum,
                        isSubselect,
                        SubselectNumber)
                    : (EventStream) new ZeroDepthStreamNoIterateWAudit(
                        FilterSpec.ResultEventType,
                        agentInstanceContext,
                        FilterSpec,
                        streamNum,
                        isSubselect,
                        SubselectNumber);
            }

            var statementId = agentInstanceContext.StatementId;
            FilterHandleCallback filterCallback;
            if (FilterSpec.OptionalPropertyEvaluator == null) {
                filterCallback = new ProxyFilterHandleCallback {
                    ProcMatchFound = (
                        theEvent,
                        allStmtMatches) => theStream.Insert(theEvent),

                    ProcIsSubselect = () => IsSubSelect
                };
            }
            else {
                filterCallback = new ProxyFilterHandleCallback {
                    ProcMatchFound = (
                        theEvent,
                        allStmtMatches) => {
                        var result = FilterSpec.OptionalPropertyEvaluator.GetProperty(theEvent, agentInstanceContext);
                        if (result == null) {
                            return;
                        }

                        theStream.Insert(result);
                    },

                    ProcIsSubselect = () => IsSubSelect
                };
            }

            var filterHandle = new EPStatementHandleCallbackFilter(
                agentInstanceContext.EpStatementAgentInstanceHandle,
                filterCallback);
            agentInstanceContext.StatementContext.StatementContextRuntimeServices.FilterService.Add(
                FilterSpec.FilterForEventType,
                filterValues,
                filterHandle);
            var filterStopCallback = new ViewableActivatorFilterStopCallback(Container, filterHandle, FilterSpec);
            return new ViewableActivationResult(theStream, filterStopCallback, null, false, false, null, null);
        }
        public void EvaluateEventForStatement(
            EventBean theEvent,
            IList<AgentInstance> agentInstances,
            AgentInstanceContext agentInstanceContextCreate)
        {
            // context was created - reevaluate for the given event
            ArrayDeque<FilterHandle> callbacks = new ArrayDeque<FilterHandle>(2);
            agentInstanceContextCreate.FilterService.Evaluate(theEvent, callbacks, agentInstanceContextCreate); // evaluates for ALL statements
            if (callbacks.IsEmpty()) {
                return;
            }

            // there is a single callback and a single context, if they match we are done
            if (agentInstances.Count == 1 && callbacks.Count == 1) {
                AgentInstance agentInstance = agentInstances[0];
                AgentInstanceContext agentInstanceContext = agentInstance.AgentInstanceContext;
                FilterHandle callback = callbacks.First;
                if (agentInstanceContext.StatementId == callback.StatementId &&
                    agentInstanceContext.AgentInstanceId == callback.AgentInstanceId) {
                    Process(agentInstance, callbacks, theEvent);
                }

                return;
            }

            // use the right sorted/unsorted Map keyed by AgentInstance to sort
            bool isPrioritized = agentInstanceContextCreate.RuntimeSettingsService.ConfigurationRuntime.Execution
                .IsPrioritized;
            IDictionary<AgentInstance, object> stmtCallbacks;
            if (!isPrioritized) {
                stmtCallbacks = new Dictionary<AgentInstance, object>();
            }
            else {
                stmtCallbacks = new OrderedListDictionary<AgentInstance, object>(AgentInstanceComparator.INSTANCE);
            }

            // process all callbacks
            foreach (FilterHandle filterHandle in callbacks) {
                EPStatementHandleCallbackFilter handleCallback = (EPStatementHandleCallbackFilter) filterHandle;

                // determine if this filter entry applies to any of the affected agent instances
                int statementId = filterHandle.StatementId;
                AgentInstance agentInstanceFound = null;
                foreach (AgentInstance agentInstance in agentInstances) {
                    AgentInstanceContext agentInstanceContext = agentInstance.AgentInstanceContext;
                    if (agentInstanceContext.StatementId == statementId &&
                        agentInstanceContext.AgentInstanceId == handleCallback.AgentInstanceId) {
                        agentInstanceFound = agentInstance;
                        break;
                    }
                }

                if (agentInstanceFound == null) { // when the callback is for some other stmt
                    continue;
                }

                EPStatementAgentInstanceHandle handle = handleCallback.AgentInstanceHandle;

                // Self-joins require that the internal dispatch happens after all streams are evaluated.
                // Priority or preemptive settings also require special ordering.
                if (handle.IsCanSelfJoin || isPrioritized) {
                    var stmtCallback = stmtCallbacks.Get(agentInstanceFound);
                    if (stmtCallback == null) {
                        stmtCallbacks.Put(agentInstanceFound, handleCallback);
                    }
                    else if (stmtCallback is ArrayDeque<FilterHandle> callbackFilterDeque) {
                        if (!callbackFilterDeque.Contains(handleCallback)) {
                            // De-duplicate for Filter OR expression paths
                            callbackFilterDeque.Add(handleCallback);
                        }
                    }
                    else {
                        var filterDeque = new ArrayDeque<FilterHandle>(4);
                        filterDeque.Add((FilterHandle) stmtCallback);
                        if (stmtCallback != handleCallback) { // De-duplicate for Filter OR expression paths
                            filterDeque.Add(handleCallback);
                        }

                        stmtCallbacks.Put(agentInstanceFound, filterDeque);
                    }

                    continue;
                }

                // no need to be sorted, process
                Process(agentInstanceFound, Collections.SingletonList<FilterHandle>(handleCallback), theEvent);
            }

            if (stmtCallbacks.IsEmpty()) {
                return;
            }

            // Process self-join or sorted prioritized callbacks
            foreach (KeyValuePair<AgentInstance, object> entry in stmtCallbacks) {
                AgentInstance agentInstance = entry.Key;
                object callbackList = entry.Value;
                if (callbackList is ICollection<FilterHandle> filterHandleCollection) {
                    Process(agentInstance, filterHandleCollection, theEvent);
                }
                else {
                    Process(
                        agentInstance,
                        Collections.SingletonList<FilterHandle>((FilterHandle) callbackList),
                        theEvent);
                }

                if (agentInstance.AgentInstanceContext.EpStatementAgentInstanceHandle.IsPreemptive) {
                    return;
                }
            }
        }