コード例 #1
0
        private void Apply(
            EventBean theEvent,
            EventBean[] eventsPerStream,
            InternalEventRouterEntry entry,
            ExprEvaluatorContext exprEvaluatorContext,
            InstrumentationCommon instrumentation)
        {
            // evaluate
            object[] values;
            if (entry.IsSubselect) {
                StatementResourceHolder holder = entry.StatementContext.StatementCPCacheService.MakeOrGetEntryCanNull(
                    StatementCPCacheService.DEFAULT_AGENT_INSTANCE_ID, entry.StatementContext);
                using (holder.AgentInstanceContext.AgentInstanceLock.AcquireWriteLock())
                {
                    values = ObtainValues(eventsPerStream, entry, exprEvaluatorContext, instrumentation);
                }
            }
            else {
                values = ObtainValues(eventsPerStream, entry, exprEvaluatorContext, instrumentation);
            }

            // apply
            entry.Writer.Write(values, theEvent);
            
            if (entry.SpecialPropWriters.Length > 0) {
                foreach (var special in entry.SpecialPropWriters) {
                    if (special is InternalEventRouterWriterArrayElement array) {
                        var value = array.RhsExpression.Evaluate(eventsPerStream, true, exprEvaluatorContext);
                        if ((value != null) && (array.TypeWidener != null)) {
                            value = array.TypeWidener.Widen(value);
                        }
                        var arrayValue = theEvent.Get(array.PropertyName);
                        if (arrayValue is Array asArrayValue) {
                            var index = array.IndexExpression.Evaluate(eventsPerStream, true, exprEvaluatorContext).AsBoxedInt32();
                            if (index != null) {
                                int len = asArrayValue.Length;
                                if (index < len) {
                                    if (value != null || !asArrayValue.GetType().GetElementType().IsPrimitive) {
                                        asArrayValue.SetValue(value, index.Value);
                                    }
                                } else {
                                    throw new EPException("Array length " + len + " less than index " + index + " for property '" + array.PropertyName + "'");
                                }
                            }
                        }
                    } else if (special is InternalEventRouterWriterCurly) {
                        InternalEventRouterWriterCurly curly = (InternalEventRouterWriterCurly) special;
                        curly.Expression.Evaluate(eventsPerStream, true, exprEvaluatorContext);
                    } else {
                        throw new IllegalStateException("Unrecognized writer " + special);
                    }
                }
            }
        }
コード例 #2
0
        private object[] ObtainValues(
            EventBean[] eventsPerStream,
            InternalEventRouterEntry entry,
            ExprEvaluatorContext exprEvaluatorContext,
            InstrumentationCommon instrumentation)
        {
            instrumentation.QUpdateIStreamApplyAssignments(entry);
            var values = new object[entry.Assignments.Length];
            for (var i = 0; i < entry.Assignments.Length; i++) {
                instrumentation.QUpdateIStreamApplyAssignmentItem(i);
                var value = entry.Assignments[i].Evaluate(eventsPerStream, true, exprEvaluatorContext);
                if (value != null && entry.Wideners[i] != null) {
                    value = entry.Wideners[i].Widen(value);
                }

                values[i] = value;
                instrumentation.AUpdateIStreamApplyAssignmentItem(value);
            }

            instrumentation.AUpdateIStreamApplyAssignments(values);
            return values;
        }
コード例 #3
0
        private void Apply(
            EventBean theEvent,
            EventBean[] eventsPerStream,
            InternalEventRouterEntry entry,
            ExprEvaluatorContext exprEvaluatorContext,
            InstrumentationCommon instrumentation)
        {
            // evaluate
            object[] values;
            if (entry.IsSubselect) {
                using (entry.AgentInstanceLock.AcquireWriteLock())
                {
                    values = ObtainValues(eventsPerStream, entry, exprEvaluatorContext, instrumentation);
                }
            }
            else {
                values = ObtainValues(eventsPerStream, entry, exprEvaluatorContext, instrumentation);
            }

            // apply
            entry.Writer.Write(values, theEvent);
        }
コード例 #4
0
        /// <summary>
        ///     Pre-proces the event.
        /// </summary>
        /// <param name="theEvent">to pre-process</param>
        /// <param name="exprEvaluatorContext">expression evaluation context</param>
        /// <param name="instrumentation">instrumentation</param>
        /// <returns>processed event</returns>
        public EventBean Process(
            EventBean theEvent,
            ExprEvaluatorContext exprEvaluatorContext,
            InstrumentationCommon instrumentation)
        {
            if (empty) {
                return theEvent;
            }

            instrumentation.QUpdateIStream(entries);

            var oldEvent = theEvent;
            var haveCloned = false;
            var eventsPerStream = new EventBean[1];
            eventsPerStream[0] = theEvent;
            InternalEventRouterEntry lastEntry = null;

            for (var i = 0; i < entries.Length; i++) {
                var entry = entries[i];
                instrumentation.QUpdateIStreamApply(i, entry);

                var whereClause = entry.OptionalWhereClause;
                if (whereClause != null) {
                    instrumentation.QUpdateIStreamApplyWhere();
                    var result = whereClause.Evaluate(eventsPerStream, true, exprEvaluatorContext);
                    if (result == null || false.Equals(result)) {
                        instrumentation.AUpdateIStreamApplyWhere(false);
                        instrumentation.AUpdateIStreamApply(null, false);
                        continue;
                    }

                    instrumentation.AUpdateIStreamApplyWhere(true);
                }

                if (entry.IsDrop) {
                    instrumentation.AUpdateIStreamApply(null, false);
                    return null;
                }

                // before applying the changes, indicate to last-entries output view
                if (lastEntry != null) {
                    var view = lastEntry.OutputView;
                    if (view.IsIndicate) {
                        var copied = copyMethod.Copy(theEvent);
                        view.Indicate(copied, oldEvent);
                        oldEvent = copied;
                    }
                    else {
                        if (entries[i].OutputView.IsIndicate) {
                            oldEvent = copyMethod.Copy(theEvent);
                        }
                    }
                }

                // copy event for the first update that applies
                if (!haveCloned) {
                    var copiedEvent = copyMethod.Copy(theEvent);
                    if (copiedEvent == null) {
                        Log.Warn("Event of type " + theEvent.EventType.Name + " could not be copied");
                        instrumentation.AUpdateIStreamApply(null, false);
                        return null;
                    }

                    haveCloned = true;
                    eventsPerStream[0] = copiedEvent;
                    theEvent = copiedEvent;
                }

                Apply(theEvent, eventsPerStream, entry, exprEvaluatorContext, instrumentation);
                lastEntry = entry;

                instrumentation.AUpdateIStreamApply(theEvent, true);
            }

            if (lastEntry != null) {
                var view = lastEntry.OutputView;
                if (view.IsIndicate) {
                    view.Indicate(theEvent, oldEvent);
                }
            }

            instrumentation.AUpdateIStream(theEvent, haveCloned);
            return theEvent;
        }