Пример #1
0
        public EPPreparedQueryResult Execute(
            FAFQueryMethodSelect select,
            ContextPartitionSelector[] contextPartitionSelectors,
            FAFQueryMethodAssignerSetter assignerSetter,
            ContextManagementService contextManagementService)
        {
            var processor = select.Processors[0];

            var singleSelector = contextPartitionSelectors != null && contextPartitionSelectors.Length > 0
                ? contextPartitionSelectors[0]
                : null;
            var agentInstanceIds = AgentInstanceIds(processor, singleSelector, contextManagementService);

            IList<ContextPartitionResult> contextPartitionResults = new List<ContextPartitionResult>();
            foreach (var agentInstanceId in agentInstanceIds) {
                var processorInstance = processor.GetProcessorInstanceContextById(agentInstanceId);
                if (processorInstance != null) {
                    var coll = processorInstance.SnapshotBestEffort(select.QueryGraph, select.Annotations);
                    contextPartitionResults.Add(
                        new ContextPartitionResult(coll, processorInstance.AgentInstanceContext));
                }
            }

            // process context partitions
            var events = new ArrayDeque<EventBean[]>();
            ResultSetProcessor resultSetProcessor = null;
            foreach (var contextPartitionResult in contextPartitionResults) {
                if (resultSetProcessor == null) {
                    resultSetProcessor = ProcessorWithAssign(
                        select.ResultSetProcessorFactoryProvider,
                        contextPartitionResult.Context,
                        assignerSetter,
                        select.TableAccesses);
                }

                var snapshot = contextPartitionResult.Events;
                if (select.WhereClause != null) {
                    snapshot = Filtered(
                        snapshot,
                        select.WhereClause,
                        contextPartitionResult.Context);
                }

                var rows = snapshot.ToArray();
                resultSetProcessor.SetAgentInstanceContext(contextPartitionResult.Context);
                var results = resultSetProcessor.ProcessViewResult(rows, null, true);
                if (results != null && results.First != null && results.First.Length > 0) {
                    events.Add(results.First);
                }
            }

            var distinct = EventBeanUtility.GetDistinctByProp(
                EventBeanUtility.Flatten(events),
                select.EventBeanReaderDistinct);
            return new EPPreparedQueryResult(select.EventType, distinct);
        }
        /// <summary>
        /// Executes the prepared query.
        /// </summary>
        /// <returns>query results</returns>
        public EPPreparedQueryResult Execute(ContextPartitionSelector[] contextPartitionSelectors)
        {
            try {
                var numStreams = _processors.Length;

                if (contextPartitionSelectors != null && contextPartitionSelectors.Length != numStreams)
                {
                    throw new ArgumentException("Number of context partition selectors does not match the number of named windows in the from-clause");
                }

                // handle non-context case
                if (_statementSpec.OptionalContextName == null)
                {
                    ICollection <EventBean>[] snapshots = new ICollection <EventBean> [numStreams];
                    for (var i = 0; i < numStreams; i++)
                    {
                        var selector = contextPartitionSelectors == null ? null : contextPartitionSelectors[i];
                        snapshots[i] = GetStreamFilterSnapshot(i, selector);
                    }

                    _resultSetProcessor.Clear();
                    return(Process(snapshots));
                }

                IList <ContextPartitionResult> contextPartitionResults = new List <ContextPartitionResult>();
                var singleSelector = contextPartitionSelectors != null && contextPartitionSelectors.Length > 0 ? contextPartitionSelectors[0] : null;

                // context partition runtime query
                ICollection <int> agentInstanceIds = EPPreparedExecuteMethodHelper.GetAgentInstanceIds(_processors[0], singleSelector, _services.ContextManagementService, _statementSpec.OptionalContextName);

                // collect events and agent instances
                foreach (int agentInstanceId in agentInstanceIds)
                {
                    var processorInstance = _processors[0].GetProcessorInstanceContextById(agentInstanceId);
                    if (processorInstance != null)
                    {
                        EPPreparedExecuteTableHelper.AssignTableAccessStrategies(_services, _statementSpec.TableNodes, processorInstance.AgentInstanceContext);
                        var coll = processorInstance.SnapshotBestEffort(this, _filters[0], _statementSpec.Annotations);
                        contextPartitionResults.Add(new ContextPartitionResult(coll, processorInstance.AgentInstanceContext));
                    }
                }

                // process context partitions
                var events = new ArrayDeque <EventBean[]>();
                foreach (var contextPartitionResult in contextPartitionResults)
                {
                    var snapshot = contextPartitionResult.Events;
                    if (_statementSpec.FilterRootNode != null)
                    {
                        snapshot = GetFiltered(snapshot, Collections.SingletonList(_statementSpec.FilterRootNode));
                    }
                    EventBean[] rows = snapshot.ToArray();
                    _resultSetProcessor.AgentInstanceContext = contextPartitionResult.Context;
                    var results = _resultSetProcessor.ProcessViewResult(rows, null, true);
                    if (results != null && results.First != null && results.First.Length > 0)
                    {
                        events.Add(results.First);
                    }
                }
                return(new EPPreparedQueryResult(_resultSetProcessor.ResultEventType, EventBeanUtility.Flatten(events)));
            }
            finally {
                if (_hasTableAccess)
                {
                    _services.TableService.TableExprEvaluatorContext.ReleaseAcquiredLocks();
                }
            }
        }