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); } } } }
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(); } }