Esempio n. 1
0
        public static void ApplyDelta(
            OneEventCollection newData,
            OneEventCollection oldData,
            InfraOnMergeViewFactory parent,
            NamedWindowRootViewInstance rootView,
            AgentInstanceContext agentInstanceContext,
            ViewSupport viewable)
        {
            if (!newData.IsEmpty() || oldData != null && !oldData.IsEmpty()) {
                var metricHandle = rootView.AgentInstanceContext.StatementContext.EpStatementHandle.MetricsHandle;
                if (metricHandle.IsEnabled && !newData.IsEmpty()) {
                    agentInstanceContext.MetricReportingService.AccountTime(
                        metricHandle,
                        default(PerformanceMetrics),
                        newData.ToArray().Length);
                }

                var statementResultService = agentInstanceContext.StatementResultService;

                // Events to delete are indicated via old data
                // The on-merge listeners receive the events deleted, but only if there is interest
                if (statementResultService.IsMakeNatural) {
                    var eventsPerStreamNaturalNew = newData.IsEmpty() ? null : newData.ToArray();
                    var eventsPerStreamNaturalOld = oldData == null || oldData.IsEmpty() ? null : oldData.ToArray();
                    rootView.Update(
                        EventBeanUtility.Denaturalize(eventsPerStreamNaturalNew),
                        EventBeanUtility.Denaturalize(eventsPerStreamNaturalOld));
                    viewable.Child.Update(eventsPerStreamNaturalNew, eventsPerStreamNaturalOld);
                }
                else {
                    var eventsPerStreamNew = newData.IsEmpty() ? null : newData.ToArray();
                    var eventsPerStreamOld = oldData == null || oldData.IsEmpty() ? null : oldData.ToArray();
                    rootView.Update(eventsPerStreamNew, eventsPerStreamOld);
                    if (statementResultService.IsMakeSynthetic) {
                        viewable.Child.Update(eventsPerStreamNew, eventsPerStreamOld);
                    }
                }
            }
        }
Esempio n. 2
0
        public override void HandleMatching(EventBean[] triggerEvents, EventBean[] matchingEvents)
        {
            if (InstrumentationHelper.ENABLED)
            {
                InstrumentationHelper.Get().QInfraOnAction(OnTriggerType.ON_MERGE, triggerEvents, matchingEvents);
            }

            var newData = new OneEventCollection();
            OneEventCollection oldData = null;
            var eventsPerStream        = new EventBean[3]; // first:named window, second: trigger, third:before-update (optional)

            if ((matchingEvents == null) || (matchingEvents.Length == 0))
            {
                var unmatched = _parent.NamedWindowOnMergeHelper.Unmatched;

                foreach (var triggerEvent in triggerEvents)
                {
                    eventsPerStream[1] = triggerEvent;

                    if (InstrumentationHelper.ENABLED)
                    {
                        InstrumentationHelper.Get().QInfraMergeWhenThens(false, triggerEvent, unmatched.Count);
                    }

                    var count = -1;
                    foreach (var action in unmatched)
                    {
                        count++;

                        if (InstrumentationHelper.ENABLED)
                        {
                            InstrumentationHelper.Get().QInfraMergeWhenThenItem(false, count);
                        }
                        if (!action.IsApplies(eventsPerStream, base.ExprEvaluatorContext))
                        {
                            if (InstrumentationHelper.ENABLED)
                            {
                                InstrumentationHelper.Get().AInfraMergeWhenThenItem(false, false);
                            }
                            continue;
                        }
                        action.Apply(null, eventsPerStream, newData, oldData, base.ExprEvaluatorContext);
                        if (InstrumentationHelper.ENABLED)
                        {
                            InstrumentationHelper.Get().AInfraMergeWhenThenItem(false, true);
                        }
                        break;      // apply no other actions
                    }

                    if (InstrumentationHelper.ENABLED)
                    {
                        InstrumentationHelper.Get().AInfraMergeWhenThens(false);
                    }
                }
            }
            else
            {
                // handle update/
                oldData = new OneEventCollection();

                var matched = _parent.NamedWindowOnMergeHelper.Matched;

                foreach (var triggerEvent in triggerEvents)
                {
                    eventsPerStream[1] = triggerEvent;
                    if (InstrumentationHelper.ENABLED)
                    {
                        InstrumentationHelper.Get().QInfraMergeWhenThens(true, triggerEvent, matched.Count);
                    }

                    foreach (var matchingEvent in matchingEvents)
                    {
                        eventsPerStream[0] = matchingEvent;

                        var count = -1;
                        foreach (var action in matched)
                        {
                            count++;

                            if (InstrumentationHelper.ENABLED)
                            {
                                InstrumentationHelper.Get().QInfraMergeWhenThenItem(true, count);
                            }
                            if (!action.IsApplies(eventsPerStream, base.ExprEvaluatorContext))
                            {
                                if (InstrumentationHelper.ENABLED)
                                {
                                    InstrumentationHelper.Get().AInfraMergeWhenThenItem(true, false);
                                }
                                continue;
                            }
                            action.Apply(matchingEvent, eventsPerStream, newData, oldData, base.ExprEvaluatorContext);
                            if (InstrumentationHelper.ENABLED)
                            {
                                InstrumentationHelper.Get().AInfraMergeWhenThenItem(true, true);
                            }
                            break;      // apply no other actions
                        }
                    }

                    if (InstrumentationHelper.ENABLED)
                    {
                        InstrumentationHelper.Get().AInfraMergeWhenThens(true);
                    }
                }
            }

            if (!newData.IsEmpty() || (oldData != null && !oldData.IsEmpty()))
            {
                if ((MetricReportingPath.IsMetricsEnabled) && (_parent.CreateNamedWindowMetricHandle.IsEnabled) && !newData.IsEmpty())
                {
                    _parent.MetricReportingService.AccountTime(_parent.CreateNamedWindowMetricHandle, 0, 0, newData.ToArray().Length);
                }

                // Events to delete are indicated via old data
                // The on-merge listeners receive the events deleted, but only if there is interest
                if (_parent.StatementResultService.IsMakeNatural)
                {
                    var eventsPerStreamNaturalNew = newData.IsEmpty() ? null : newData.ToArray();
                    var eventsPerStreamNaturalOld = (oldData == null || oldData.IsEmpty()) ? null : oldData.ToArray();
                    RootView.Update(EventBeanUtility.Denaturalize(eventsPerStreamNaturalNew), EventBeanUtility.Denaturalize(eventsPerStreamNaturalOld));
                    UpdateChildren(eventsPerStreamNaturalNew, eventsPerStreamNaturalOld);
                }
                else
                {
                    var eventsPerStreamNew = newData.IsEmpty() ? null : newData.ToArray();
                    var eventsPerStreamOld = (oldData == null || oldData.IsEmpty()) ? null : oldData.ToArray();
                    RootView.Update(eventsPerStreamNew, eventsPerStreamOld);
                    if (_parent.StatementResultService.IsMakeSynthetic)
                    {
                        UpdateChildren(eventsPerStreamNew, eventsPerStreamOld);
                    }
                }
            }

            // Keep the last delete records
            _lastResult = matchingEvents;
            if (InstrumentationHelper.ENABLED)
            {
                InstrumentationHelper.Get().AInfraOnAction();
            }
        }