Exemplo n.º 1
0
        private static IEnumerator <EventBean> DistinctEnumeration(IEnumerator <EventBean> source, EventType eventType)
        {
            EventBeanReader eventBeanReader = null;

            if (eventType is EventTypeSPI)
            {
                eventBeanReader = ((EventTypeSPI)eventType).GetReader();
            }
            if (eventBeanReader == null)
            {
                eventBeanReader = new EventBeanReaderDefaultImpl(eventType);
            }

            if (source != null)
            {
                var events = new LinkedList <EventBean>();
                while (source.MoveNext())
                {
                    events.AddLast(source.Current);
                }

                if (events.Count <= 1)
                {
                    return(events.GetEnumerator());
                }

                IList <EventBean> result = EventBeanUtility.GetDistinctByProp(events, eventBeanReader);
                return(result.GetEnumerator());
            }

            return(EnumerationHelper <EventBean> .CreateEmptyEnumerator());
        }
Exemplo n.º 2
0
        public OutputProcessViewDirectDistinctOrAfterFactory(
            StatementContext statementContext,
            OutputStrategyPostProcessFactory postProcessFactory,
            ResultSetProcessorHelperFactory resultSetProcessorHelperFactory,
            bool distinct,
            ExprTimePeriod afterTimePeriod,
            int?afterConditionNumberOfEvents,
            EventType resultEventType)
            : base(statementContext, postProcessFactory, resultSetProcessorHelperFactory)
        {
            _isDistinct     = distinct;
            AfterTimePeriod = afterTimePeriod;
            AfterConditionNumberOfEvents = afterConditionNumberOfEvents;

            if (_isDistinct)
            {
                if (resultEventType is EventTypeSPI)
                {
                    EventTypeSPI eventTypeSPI = (EventTypeSPI)resultEventType;
                    _eventBeanReader = eventTypeSPI.Reader;
                }
                if (_eventBeanReader == null)
                {
                    _eventBeanReader = new EventBeanReaderDefaultImpl(resultEventType);
                }
            }
        }
Exemplo n.º 3
0
 public static TableOnViewFactory Make(
     TableMetadata tableMetadata,
     OnTriggerDesc onTriggerDesc,
     EventType filterEventType,
     string filterStreamName,
     StatementContext statementContext,
     StatementMetricHandle metricsHandle,
     bool isDistinct,
     InternalEventRouter internalEventRouter)
 {
     if (onTriggerDesc.OnTriggerType == OnTriggerType.ON_DELETE)
     {
         return(new TableOnDeleteViewFactory(statementContext.StatementResultService, tableMetadata));
     }
     else if (onTriggerDesc.OnTriggerType == OnTriggerType.ON_SELECT)
     {
         EventBeanReader eventBeanReader = null;
         if (isDistinct)
         {
             eventBeanReader = tableMetadata.InternalEventType.GetReader();
         }
         var windowDesc = (OnTriggerWindowDesc)onTriggerDesc;
         return(new TableOnSelectViewFactory(
                    tableMetadata, internalEventRouter, statementContext.EpStatementHandle,
                    eventBeanReader, isDistinct, statementContext.StatementResultService,
                    statementContext.InternalEventEngineRouteDest, windowDesc.IsDeleteAndSelect));
     }
     else if (onTriggerDesc.OnTriggerType == OnTriggerType.ON_UPDATE)
     {
         var updateDesc   = (OnTriggerWindowUpdateDesc)onTriggerDesc;
         var updateHelper = EventBeanUpdateHelperFactory.Make(
             tableMetadata.TableName, (EventTypeSPI)tableMetadata.InternalEventType, updateDesc.Assignments,
             updateDesc.OptionalAsName, filterEventType, false);
         TableUpdateStrategy updateStrategy = statementContext.TableService.GetTableUpdateStrategy(
             tableMetadata, updateHelper, false);
         var onUpdateViewFactory =
             new TableOnUpdateViewFactory(
                 statementContext.StatementResultService, tableMetadata, updateHelper, updateStrategy);
         statementContext.TableService.AddTableUpdateStrategyReceiver(
             tableMetadata, statementContext.StatementName, onUpdateViewFactory, updateHelper, false);
         return(onUpdateViewFactory);
     }
     else if (onTriggerDesc.OnTriggerType == OnTriggerType.ON_MERGE)
     {
         var onMergeTriggerDesc = (OnTriggerMergeDesc)onTriggerDesc;
         var onMergeHelper      = new TableOnMergeHelper(
             statementContext, onMergeTriggerDesc, filterEventType, filterStreamName, internalEventRouter,
             tableMetadata);
         return(new TableOnMergeViewFactory(
                    tableMetadata, onMergeHelper, statementContext.StatementResultService, metricsHandle,
                    statementContext.MetricReportingService));
     }
     else
     {
         throw new IllegalStateException("Unknown trigger type " + onTriggerDesc.OnTriggerType);
     }
 }
Exemplo n.º 4
0
 public TableOnSelectViewFactory(TableMetadata tableMetadata, InternalEventRouter internalEventRouter, EPStatementHandle statementHandle, EventBeanReader eventBeanReader, bool distinct, StatementResultService statementResultService, InternalEventRouteDest internalEventRouteDest, bool deleteAndSelect)
 {
     _tableMetadata = tableMetadata;
     InternalEventRouter = internalEventRouter;
     StatementHandle = statementHandle;
     EventBeanReader = eventBeanReader;
     IsDistinct = distinct;
     StatementResultService = statementResultService;
     InternalEventRouteDest = internalEventRouteDest;
     _deleteAndSelect = deleteAndSelect;
 }
Exemplo n.º 5
0
 public NamedWindowOnSelectViewFactory(EventType namedWindowEventType, InternalEventRouter internalEventRouter, bool addToFront, EPStatementHandle statementHandle, EventBeanReader eventBeanReader, bool distinct, StatementResultService statementResultService, InternalEventRouteDest internalEventRouteDest, bool deleteAndSelect, StreamSelector?optionalStreamSelector, string optionalInsertIntoTableName)
     : base(namedWindowEventType)
 {
     InternalEventRouter          = internalEventRouter;
     IsAddToFront                 = addToFront;
     StatementHandle              = statementHandle;
     EventBeanReader              = eventBeanReader;
     IsDistinct                   = distinct;
     StatementResultService       = statementResultService;
     InternalEventRouteDest       = internalEventRouteDest;
     _deleteAndSelect             = deleteAndSelect;
     OptionalStreamSelector       = optionalStreamSelector;
     _optionalInsertIntoTableName = optionalInsertIntoTableName;
 }
Exemplo n.º 6
0
        protected internal static EPPreparedQueryResult ProcessedNonJoin(
            ResultSetProcessor resultSetProcessor,
            ICollection<EventBean> events,
            EventBeanReader distinctHandler)
        {
            var rows = events.ToArray();
            var results = resultSetProcessor.ProcessViewResult(rows, null, true);

            EventBean[] distinct;
            if (distinctHandler == null) {
                distinct = results.First;
            }
            else {
                distinct = EventBeanUtility.GetDistinctByProp(results.First, distinctHandler);
            }

            return new EPPreparedQueryResult(resultSetProcessor.ResultEventType, distinct);
        }
Exemplo n.º 7
0
        /// <summary>Returns the distinct events by properties. </summary>
        /// <param name="events">to inspect</param>
        /// <param name="reader">for retrieving properties</param>
        /// <returns>distinct events</returns>
        public static EventBean[] GetDistinctByProp(LinkedList <EventBean> events,
                                                    EventBeanReader reader)
        {
            if (events == null || events.IsEmpty())
            {
                return(new EventBean[0]);
            }
            if (events.Count < 2)
            {
                return(events.ToArray());
            }

            var set = new LinkedHashSet <MultiKeyUntypedEventPair>();

            if (events.First.Value is NaturalEventBean)
            {
                foreach (EventBean theEvent in events)
                {
                    var inner = ((NaturalEventBean)theEvent).OptionalSynthetic;
                    var keys  = reader.Read(inner);
                    var pair  = new MultiKeyUntypedEventPair(keys, theEvent);
                    set.Add(pair);
                }
            }
            else
            {
                foreach (EventBean theEvent in events)
                {
                    Object[] keys = reader.Read(theEvent);
                    var      pair = new MultiKeyUntypedEventPair(keys, theEvent);
                    set.Add(pair);
                }
            }

            var result = new EventBean[set.Count];
            var count  = 0;

            foreach (MultiKeyUntypedEventPair row in set)
            {
                result[count++] = row.EventBean;
            }
            return(result);
        }
Exemplo n.º 8
0
        /// <summary>Returns the distinct events by properties. </summary>
        /// <param name="events">to inspect</param>
        /// <param name="reader">for retrieving properties</param>
        /// <returns>distinct events</returns>
        public static EventBean[] GetDistinctByProp(EventBean[] events,
                                                    EventBeanReader reader)
        {
            if ((events == null) || (events.Length < 2))
            {
                return(events);
            }

            var set = new LinkedHashSet <MultiKeyUntypedEventPair>();

            if (events[0] is NaturalEventBean)
            {
                foreach (EventBean theEvent in events)
                {
                    var inner = ((NaturalEventBean)theEvent).OptionalSynthetic;
                    var keys  = reader.Read(inner);
                    var pair  = new MultiKeyUntypedEventPair(keys, theEvent);
                    set.Add(pair);
                }
            }
            else
            {
                foreach (EventBean theEvent in events)
                {
                    Object[] keys = reader.Read(theEvent);
                    var      pair = new MultiKeyUntypedEventPair(keys, theEvent);
                    set.Add(pair);
                }
            }

            var result = new EventBean[set.Count];
            int count  = 0;

            foreach (MultiKeyUntypedEventPair row in set)
            {
                result[count++] = row.EventBean;
            }
            return(result);
        }
        /// <summary>
        /// Ctor.
        /// </summary>
        /// <param name="statementSpec">is a container for the definition of all statement constructs thatmay have been used in the statement, i.e. if defines the select clauses, insert into, outer joins etc.
        /// </param>
        /// <param name="services">is the service instances for dependency injection</param>
        /// <param name="statementContext">is statement-level information and statement services</param>
        /// <throws>ExprValidationException if the preparation failed</throws>
        public EPPreparedExecuteMethodQuery(StatementSpecCompiled statementSpec,
                                            EPServicesContext services,
                                            StatementContext statementContext)

        {
            var queryPlanLogging = services.ConfigSnapshot.EngineDefaults.LoggingConfig.IsEnableQueryPlan;

            if (queryPlanLogging)
            {
                QueryPlanLog.Info("Query plans for Fire-and-forget query '" + statementContext.Expression + "'");
            }

            _hasTableAccess = (statementSpec.TableNodes != null && statementSpec.TableNodes.Length > 0);
            foreach (var streamSpec in statementSpec.StreamSpecs)
            {
                _hasTableAccess |= streamSpec is TableQueryStreamSpec;
            }

            _statementSpec = statementSpec;
            _services      = services;

            EPPreparedExecuteMethodHelper.ValidateFAFQuery(statementSpec);

            var numStreams     = statementSpec.StreamSpecs.Length;
            var typesPerStream = new EventType[numStreams];
            var namesPerStream = new string[numStreams];

            _processors           = new FireAndForgetProcessor[numStreams];
            _agentInstanceContext = new AgentInstanceContext(statementContext, null, -1, null, null, statementContext.DefaultAgentInstanceScriptContext);

            // resolve types and processors
            for (var i = 0; i < numStreams; i++)
            {
                var streamSpec = statementSpec.StreamSpecs[i];
                _processors[i] = FireAndForgetProcessorFactory.ValidateResolveProcessor(streamSpec, services);

                string streamName = _processors[i].NamedWindowOrTableName;
                if (streamSpec.OptionalStreamName != null)
                {
                    streamName = streamSpec.OptionalStreamName;
                }
                namesPerStream[i] = streamName;
                typesPerStream[i] = _processors[i].EventTypeResultSetProcessor;
            }

            // compile filter to optimize access to named window
            _filters = new FilterSpecCompiled[numStreams];
            if (statementSpec.FilterRootNode != null)
            {
                var tagged = new LinkedHashMap <string, Pair <EventType, string> >();
                for (var i = 0; i < numStreams; i++)
                {
                    try {
                        var types = new StreamTypeServiceImpl(typesPerStream, namesPerStream, new bool[numStreams], services.EngineURI, false);
                        _filters[i] = FilterSpecCompiler.MakeFilterSpec(typesPerStream[i], namesPerStream[i],
                                                                        Collections.SingletonList(statementSpec.FilterRootNode), null,
                                                                        tagged, tagged, types,
                                                                        null, statementContext, Collections.SingletonList(i));
                    }
                    catch (Exception ex) {
                        Log.Warn("Unexpected exception analyzing filter paths: " + ex.Message, ex);
                    }
                }
            }

            // obtain result set processor
            var isIStreamOnly = new bool[namesPerStream.Length];

            CompatExtensions.Fill(isIStreamOnly, true);
            StreamTypeService typeService = new StreamTypeServiceImpl(typesPerStream, namesPerStream, isIStreamOnly, services.EngineURI, true);

            EPStatementStartMethodHelperValidate.ValidateNodes(statementSpec, statementContext, typeService, null);

            var resultSetProcessorPrototype = ResultSetProcessorFactoryFactory.GetProcessorPrototype(statementSpec, statementContext, typeService, null, new bool[0], true, ContextPropertyRegistryImpl.EMPTY_REGISTRY, null, _services.ConfigSnapshot);

            _resultSetProcessor = EPStatementStartMethodHelperAssignExpr.GetAssignResultSetProcessor(_agentInstanceContext, resultSetProcessorPrototype);

            if (statementSpec.SelectClauseSpec.IsDistinct)
            {
                if (_resultSetProcessor.ResultEventType is EventTypeSPI)
                {
                    _eventBeanReader = ((EventTypeSPI)_resultSetProcessor.ResultEventType).GetReader();
                }
                if (_eventBeanReader == null)
                {
                    _eventBeanReader = new EventBeanReaderDefaultImpl(_resultSetProcessor.ResultEventType);
                }
            }

            // plan joins or simple queries
            if (numStreams > 1)
            {
                var streamJoinAnalysisResult = new StreamJoinAnalysisResult(numStreams);
                CompatExtensions.Fill(streamJoinAnalysisResult.NamedWindow, true);
                for (var i = 0; i < numStreams; i++)
                {
                    var processorInstance = _processors[i].GetProcessorInstance(_agentInstanceContext);
                    if (_processors[i].IsVirtualDataWindow)
                    {
                        streamJoinAnalysisResult.ViewExternal[i] = agentInstanceContext => processorInstance.VirtualDataWindow;
                    }
                    var uniqueIndexes = _processors[i].GetUniqueIndexes(processorInstance);
                    streamJoinAnalysisResult.UniqueKeys[i] = uniqueIndexes;
                }

                var hasAggregations = !resultSetProcessorPrototype.AggregationServiceFactoryDesc.Expressions.IsEmpty();
                _joinSetComposerPrototype = JoinSetComposerPrototypeFactory.MakeComposerPrototype(
                    null, null,
                    statementSpec.OuterJoinDescList, statementSpec.FilterRootNode, typesPerStream, namesPerStream,
                    streamJoinAnalysisResult, queryPlanLogging, statementContext, new HistoricalViewableDesc(numStreams),
                    _agentInstanceContext, false, hasAggregations, services.TableService, true);
            }

            // check context partition use
            if (statementSpec.OptionalContextName != null)
            {
                if (numStreams > 1)
                {
                    throw new ExprValidationException("Joins in runtime queries for context partitions are not supported");
                }
            }
        }
Exemplo n.º 10
0
 public static NamedWindowOnExprFactory Make(
     EventType namedWindowEventType,
     string namedWindowName,
     string namedWindowAlias,
     OnTriggerDesc onTriggerDesc,
     EventType filterEventType,
     string filterStreamName,
     bool addToFront,
     InternalEventRouter internalEventRouter,
     EventType outputEventType,
     StatementContext statementContext,
     StatementMetricHandle createNamedWindowMetricsHandle,
     bool isDistinct,
     StreamSelector?optionalStreamSelector,
     string optionalInsertIntoTableName)
 {
     if (onTriggerDesc.OnTriggerType == OnTriggerType.ON_DELETE)
     {
         return(new NamedWindowOnDeleteViewFactory(namedWindowEventType, statementContext.StatementResultService));
     }
     else if (onTriggerDesc.OnTriggerType == OnTriggerType.ON_SELECT)
     {
         EventBeanReader eventBeanReader = null;
         if (isDistinct)
         {
             if (outputEventType is EventTypeSPI)
             {
                 eventBeanReader = ((EventTypeSPI)outputEventType).GetReader();
             }
             if (eventBeanReader == null)
             {
                 eventBeanReader = new EventBeanReaderDefaultImpl(outputEventType);
             }
         }
         var windowDesc = (OnTriggerWindowDesc)onTriggerDesc;
         return(new NamedWindowOnSelectViewFactory(
                    namedWindowEventType, internalEventRouter, addToFront,
                    statementContext.EpStatementHandle, eventBeanReader, isDistinct, statementContext.StatementResultService,
                    statementContext.InternalEventEngineRouteDest, windowDesc.IsDeleteAndSelect, optionalStreamSelector,
                    optionalInsertIntoTableName));
     }
     else if (onTriggerDesc.OnTriggerType == OnTriggerType.ON_UPDATE)
     {
         var updateDesc   = (OnTriggerWindowUpdateDesc)onTriggerDesc;
         var updateHelper = EventBeanUpdateHelperFactory.Make(
             namedWindowName, (EventTypeSPI)namedWindowEventType, updateDesc.Assignments, namedWindowAlias,
             filterEventType, true);
         return(new NamedWindowOnUpdateViewFactory(
                    namedWindowEventType, statementContext.StatementResultService, updateHelper));
     }
     else if (onTriggerDesc.OnTriggerType == OnTriggerType.ON_MERGE)
     {
         var onMergeTriggerDesc = (OnTriggerMergeDesc)onTriggerDesc;
         var onMergeHelper      = new NamedWindowOnMergeHelper(
             statementContext, onMergeTriggerDesc, filterEventType, filterStreamName, internalEventRouter,
             namedWindowName, (EventTypeSPI)namedWindowEventType);
         return(new NamedWindowOnMergeViewFactory(
                    namedWindowEventType, onMergeHelper, statementContext.StatementResultService,
                    createNamedWindowMetricsHandle, statementContext.MetricReportingService));
     }
     else
     {
         throw new IllegalStateException("Unknown trigger type " + onTriggerDesc.OnTriggerType);
     }
 }