public override void Update(EventBean[] newData, EventBean[] oldData)
        {
            IntersectBatchViewLocalState localState = _factory.GetBatchViewLocalStatePerThread();

            // handle remove stream: post oldData to all views
            if (oldData != null && oldData.Length != 0)
            {
                try
                {
                    localState.IsIgnoreViewIRStream = true;
                    for (int i = 0; i < _views.Length; i++)
                    {
                        _views[i].Update(newData, oldData);
                    }
                }
                finally
                {
                    localState.IsIgnoreViewIRStream = false;
                }
            }

            if (newData != null)
            {
                // post to all non-batch views first to let them decide the remove stream, if any
                try
                {
                    localState.IsCaptureIRNonBatch = true;
                    for (int i = 0; i < _views.Length; i++)
                    {
                        if (i != _factory.BatchViewIndex)
                        {
                            _views[i].Update(newData, oldData);
                        }
                    }
                }
                finally
                {
                    localState.IsCaptureIRNonBatch = false;
                }

                // if there is any data removed from non-batch views, remove from all views
                // collect removed events
                localState.RemovedEvents.Clear();
                for (int i = 0; i < _views.Length; i++)
                {
                    if (localState.OldEventsPerView[i] != null)
                    {
                        for (int j = 0; j < _views.Length; j++)
                        {
                            if (i == j)
                            {
                                continue;
                            }
                            _views[j].Update(null, localState.OldEventsPerView[i]);

                            for (int k = 0; k < localState.OldEventsPerView[i].Length; k++)
                            {
                                localState.RemovedEvents.Add(localState.OldEventsPerView[i][k]);
                            }
                        }
                        localState.OldEventsPerView[i] = null;
                    }
                }

                // post only new events to the batch view that have not been removed
                EventBean[] newDataNonRemoved;
                if (_factory.IsAsymmetric())
                {
                    newDataNonRemoved = EventBeanUtility.GetNewDataNonRemoved(
                        newData, localState.RemovedEvents, localState.NewEventsPerView);
                }
                else
                {
                    newDataNonRemoved = EventBeanUtility.GetNewDataNonRemoved(newData, localState.RemovedEvents);
                }
                if (newDataNonRemoved != null)
                {
                    _views[_factory.BatchViewIndex].Update(newDataNonRemoved, null);
                }
            }
        }
        public void NewData(int streamId, EventBean[] newEvents, EventBean[] oldEvents)
        {
            IntersectBatchViewLocalState localState = _factory.GetBatchViewLocalStatePerThread();

            if (localState.IsIgnoreViewIRStream)
            {
                return;
            }

            if (localState.IsCaptureIRNonBatch)
            {
                localState.OldEventsPerView[streamId] = oldEvents;
                if (_factory.IsAsymmetric())
                {
                    localState.NewEventsPerView[streamId] = newEvents;
                }
                return;
            }

            // handle case where irstream originates from view, i.e. timer-based
            if (streamId == _factory.BatchViewIndex)
            {
                UpdateChildren(newEvents, oldEvents);
                if (newEvents != null)
                {
                    try
                    {
                        localState.IsIgnoreViewIRStream = true;
                        for (int i = 0; i < _views.Length; i++)
                        {
                            if (i != streamId)
                            {
                                _views[i].Update(null, newEvents);
                            }
                        }
                    }
                    finally
                    {
                        localState.IsIgnoreViewIRStream = false;
                    }
                }
            }
            // post remove stream to all other views
            else
            {
                if (oldEvents != null)
                {
                    try
                    {
                        localState.IsIgnoreViewIRStream = true;
                        for (int i = 0; i < _views.Length; i++)
                        {
                            if (i != streamId)
                            {
                                _views[i].Update(null, oldEvents);
                            }
                        }
                    }
                    finally
                    {
                        localState.IsIgnoreViewIRStream = false;
                    }
                }
            }
        }