示例#1
0
        private void Initialize()
        {
            Name = Components.Event;

            _mEvaluator = new EventEvaluator(this);
            SetService(_mEvaluator);
        }
示例#2
0
        public override void MatchEvent(EventBean theEvent, ICollection <FilterHandle> matches)
        {
            var attributeValue = Lookupable.Getter.Get(theEvent);
            var returnValue    = new Mutable <bool>(false);

            using (Instrument.With(
                       i => i.QFilterReverseIndex(this, attributeValue),
                       i => i.AFilterReverseIndex(returnValue.Value)))
            {
                EventEvaluator evaluator = null;
                using (ConstantsMapRwLock.AcquireReadLock())
                {
                    evaluator = ConstantsMap.Get(attributeValue);
                }

                // No listener found for the value, return
                if (evaluator == null)
                {
                    returnValue.Value = false;
                }
                else
                {
                    evaluator.MatchEvent(theEvent, matches);
                    returnValue.Value = true;
                }
            }
        }
示例#3
0
        public override void Put(Object filterConstant, EventEvaluator evaluator)
        {
            // Store evaluator keyed to set of values
            var keys = (MultiKeyUntyped)filterConstant;

            // make sure to remove the old evaluator for this constant
            var oldEvaluator = _evaluatorsMap.Push(keys, evaluator);

            // Store each value to match against in Map with it's evaluator as a list
            var keyValues = keys.Keys;

            for (var i = 0; i < keyValues.Length; i++)
            {
                var evaluators = _constantsMap.Get(keyValues[i]);
                if (evaluators == null)
                {
                    evaluators = new List <EventEvaluator>();
                    _constantsMap.Put(keyValues[i], evaluators);
                }
                else
                {
                    if (oldEvaluator != null)
                    {
                        evaluators.Remove(oldEvaluator);
                    }
                }
                evaluators.Add(evaluator);
            }
        }
示例#4
0
        /// <summary>
        /// Add filter callback to an event evaluator, which could be either an index node or a set node.
        /// </summary>
        /// <param name="remainingParameters">The remaining parameters.</param>
        /// <param name="filterCallback">The filter callback.</param>
        /// <param name="eventEvaluator">to add the filterCallback to.</param>
        /// <param name="treePathInfo">is for holding the information on where the add occured</param>
        /// <param name="lockFactory">The lock factory.</param>
        /// <returns>
        /// bool indicating if the eventEvaluator was successfully added
        /// </returns>
        private static bool AddToEvaluator(
            ArrayDeque <FilterValueSetParam> remainingParameters,
            FilterHandle filterCallback,
            EventEvaluator eventEvaluator,
            ArrayDeque <EventTypeIndexBuilderIndexLookupablePair> treePathInfo,
            FilterServiceGranularLockFactory lockFactory)
        {
            if (eventEvaluator is FilterHandleSetNode)
            {
                var node = (FilterHandleSetNode)eventEvaluator;
                AddToNode(remainingParameters, filterCallback, node, treePathInfo, lockFactory);
                return(true);
            }

            // Check if the next index matches any of the remaining filterCallback parameters
            var nextIndex = (FilterParamIndexBase)eventEvaluator;

            var parameter = IndexHelper.FindParameter(remainingParameters, nextIndex);

            if (parameter != null)
            {
                remainingParameters.Remove(parameter);
                treePathInfo.Add(new EventTypeIndexBuilderIndexLookupablePair(nextIndex, parameter.FilterForValue));
                AddToIndex(remainingParameters, filterCallback, nextIndex, parameter.FilterForValue, treePathInfo, lockFactory);
                return(true);
            }

            // This eventEvaluator does not work with any of the remaining filter parameters
            return(false);
        }
示例#5
0
        /// <summary>
        /// Add filter callback to an event evaluator, which could be either an index node or a set node.
        /// </summary>
        /// <param name="remainingParameters">The remaining parameters.</param>
        /// <param name="filterCallback">The filter callback.</param>
        /// <param name="eventEvaluator">to add the filterCallback to.</param>
        /// <param name="treePathInfo">is for holding the information on where the add occured</param>
        /// <param name="lockFactory">The lock factory.</param>
        /// <returns>
        /// bool indicating if the eventEvaluator was successfully added
        /// </returns>
        private static bool AddToEvaluator(
            ArrayDeque <FilterValueSetParam> remainingParameters,
            FilterHandle filterCallback,
            EventEvaluator eventEvaluator,
            ArrayDeque <EventTypeIndexBuilderIndexLookupablePair> treePathInfo,
            FilterServiceGranularLockFactory lockFactory)
        {
            if (eventEvaluator is FilterHandleSetNode)
            {
                var node = (FilterHandleSetNode)eventEvaluator;
#if DEBUG && DIAGNOSTICS
                System.Diagnostics.Debug.WriteLine("{0}: AddToEvaluator: {1}", Thread.CurrentThread.ManagedThreadId, node);
#endif
                AddToNode(remainingParameters, filterCallback, node, treePathInfo, lockFactory);
                return(true);
            }

            // Check if the next index matches any of the remaining filterCallback parameters
            var nextIndex = (FilterParamIndexBase)eventEvaluator;

            var parameter = IndexHelper.FindParameter(remainingParameters, nextIndex);
            if (parameter != null)
            {
                remainingParameters.Remove(parameter);
                treePathInfo.Add(new EventTypeIndexBuilderIndexLookupablePair(nextIndex, parameter.FilterForValue));
#if DEBUG && DIAGNOSTICS
                System.Diagnostics.Debug.WriteLine("{0}: AddToEvaluator -> AddToIndex: {1}", Thread.CurrentThread.ManagedThreadId, nextIndex);
#endif
                AddToIndex(remainingParameters, filterCallback, nextIndex, parameter.FilterForValue, treePathInfo, lockFactory);
                return(true);
            }

            // This eventEvaluator does not work with any of the remaining filter parameters
            return(false);
        }
示例#6
0
 public override void Put(
     object filterConstant,
     EventEvaluator evaluator)
 {
     var keys = (ExprNodeAdapterBase) filterConstant;
     evaluatorsMap.Put(keys, evaluator);
 }
示例#7
0
        public override void MatchEvent(
            EventBean theEvent,
            ICollection<FilterHandle> matches,
            ExprEvaluatorContext ctx)
        {
            object attributeValue = Lookupable.Eval.Eval(theEvent, ctx);
            if (InstrumentationHelper.ENABLED) {
                InstrumentationHelper.Get().QFilterReverseIndex(this, attributeValue);
            }

            EventEvaluator evaluator = null;
            using (ConstantsMapRwLock.ReadLock.Acquire()) {
                evaluator = ConstantsMap.Get(attributeValue);
            }

            // No listener found for the value, return
            if (evaluator == null) {
                if (InstrumentationHelper.ENABLED) {
                    InstrumentationHelper.Get().AFilterReverseIndex(false);
                }

                return;
            }

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

            evaluator.MatchEvent(theEvent, matches, ctx);
        }
        public void EventEvaluatorNoRulesShouldReturnEvaluationTrue()
        {
            // Arrange

            const string eventType = "MyEventType";

            var rules = new List <Rule <Event> >(); // No rules

            var myEvent = new Event
            {
                EventId     = 100,
                EventName   = "MyEvent100",
                EventType   = eventType,
                Priority    = 1,
                CreatedDate = DateTime.Now,
                Properties  = new Dictionary <string, string>
                {
                    { "prop1", "value1" },
                    { "prop2", "value2" }
                }
            };

            // Act

            var eventEvaluator = new EventEvaluator(logger);
            var result         = eventEvaluator.EvaluateEvent(myEvent, rules);

            // Assert

            Assert.IsTrue(result);
        }
        public override void Remove(object filterConstant)
        {
            var range = (DoubleRange)filterConstant;

            if (range.Max == null || range.Min == null)
            {
                RangesNullEndpoints = null;
                return;
            }

            Ranges.Delete(range);
        }
        public override void Remove(object filterConstant)
        {
            var range = (StringRange)filterConstant;

            if (range.Max == null || range.Min == null)
            {
                RangesNullEndpoints = null;
            }
            else
            {
                Ranges.Remove(range);
            }
        }
        public override void Put(Object filterConstant, EventEvaluator matcher)
        {
            _constantsMap.Put(filterConstant, matcher);

            // Update bounds
            var constant = filterConstant.AsDouble();

            if ((_lowerBounds == null) || (constant < _lowerBounds))
            {
                _lowerBounds = constant;
            }
            if ((_upperBounds == null) || (constant > _upperBounds))
            {
                _upperBounds = constant;
            }
        }
示例#12
0
        public override void Put(
            object filterConstant,
            EventEvaluator matcher)
        {
            constantsMap.Put(filterConstant, matcher);

            // Update bounds
            double constant = filterConstant.AsDouble();
            if (lowerBounds == null || constant < lowerBounds) {
                lowerBounds = constant;
            }

            if (upperBounds == null || constant > upperBounds) {
                upperBounds = constant;
            }
        }
示例#13
0
        public override void Put(Object expressionValue, EventEvaluator matcher)
        {
            if (!(expressionValue is StringRange))
            {
                throw new ArgumentException("Supplied expressionValue must be of type DoubleRange");
            }

            var range = (StringRange)expressionValue;

            if ((range.Max == null) || (range.Min == null))
            {
                _rangesNullEndpoints.Put(range, matcher);     // endpoints null - we don't enter
                return;
            }

            Ranges.Put(range, matcher);
        }
示例#14
0
        public override void Remove(object filterConstant)
        {
            var keys = (HashableMultiKey) filterConstant;

            // remove the mapping of value set to evaluator
            EventEvaluator eval = evaluatorsMap.Delete(keys);

            var keyValues = keys.Keys;
            for (var i = 0; i < keyValues.Length; i++) {
                var evaluators = constantsMap.Get(keyValues[i]);
                if (evaluators != null) {
                    // could be removed already as same-value constants existed
                    evaluators.Remove(eval);
                    if (evaluators.IsEmpty()) {
                        constantsMap.Remove(keyValues[i]);
                    }
                }
            }
        }
        public override void Put(
            object expressionValue,
            EventEvaluator matcher)
        {
            if (!(expressionValue is StringRange))
            {
                throw new ArgumentException("Supplied expressionValue must be of type DoubleRange");
            }

            var range = (StringRange)expressionValue;

            if (range.Max == null || range.Min == null)
            {
                RangesNullEndpoints = matcher;
                return;
            }

            Ranges.Put(range, matcher);
        }
        public void EventEvaluatorRuleMatchExpressionNullShouldReturnEvaluationTrue()
        {
            // Arrange

            const string eventType = "MyEventType";

            var rules = new List <Rule <Event> >
            {
                new Rule <Event>
                {
                    RuleId          = 1,
                    RuleName        = "Rule001",
                    EventType       = eventType,
                    MatchExpression = null,
                    Rank            = 1,
                    Enabled         = true
                }
            };

            var myEvent = new Event
            {
                EventId     = 100,
                EventName   = "MyEvent100",
                EventType   = eventType,
                Priority    = 1,
                CreatedDate = DateTime.Now,
                Properties  = new Dictionary <string, string>
                {
                    { "prop1", "value1" },
                    { "prop2", "value2" }
                }
            };

            // Act

            var eventEvaluator = new EventEvaluator(logger);
            var result         = eventEvaluator.EvaluateEvent(myEvent, rules);

            // Assert

            Assert.IsTrue(result);
        }
示例#17
0
        public override void Put(
            object filterConstant,
            EventEvaluator evaluator)
        {
            // Store evaluator keyed to set of values
            var keys = (HashableMultiKey) filterConstant;
            filterValueEvaluators.Put(keys, evaluator);
            evaluatorsSet.Add(evaluator);

            // Store each value to match against in Map with it's evaluator as a list
            foreach (var keyValue in keys.Keys) {
                var evaluators = constantsMap.Get(keyValue);
                if (evaluators == null) {
                    evaluators = new HashSet<EventEvaluator>();
                    constantsMap.Put(keyValue, evaluators);
                }

                evaluators.Add(evaluator);
            }
        }
        public void EventEvaluatorRulesNullShouldThrowInvalidInputException()
        {
            // Arrange

            const string eventType = "MyEventType";

            List <Rule <Event> > rules = null; // rules is null

            var myEvent = new Event
            {
                EventId     = 100,
                EventName   = "MyEvent100",
                EventType   = eventType,
                Priority    = 1,
                CreatedDate = DateTime.Now,
                Properties  = new Dictionary <string, string>
                {
                    { "prop1", "value1" },
                    { "prop2", "value2" }
                }
            };

            // Act

            var eventEvaluator = new EventEvaluator(logger);

            try
            {
                var result = eventEvaluator.EvaluateEvent(myEvent, rules);
            }
            catch (ArgumentNullException ex)
            {
                // Assert

                Assert.AreEqual("Value cannot be null.\r\nParameter name: rules", ex.Message);
            }
        }
        public void EventEvaluatorEventNullShouldThrowInvalidInputException()
        {
            // Arrange

            const string eventType = "MyEventType";

            var rules = new List <Rule <Event> >
            {
                new Rule <Event>
                {
                    RuleId          = 1,
                    RuleName        = "Rule001",
                    EventType       = eventType,
                    MatchExpression = "p.Properties[\"prop2\"] == \"value2\"",
                    Rank            = 1,
                    Enabled         = true
                }
            };

            Event myEvent = null; // myEvent is null

            // Act

            var eventEvaluator = new EventEvaluator(logger);

            try
            {
                var result = eventEvaluator.EvaluateEvent(myEvent, rules);
            }
            catch (ArgumentNullException ex)
            {
                // Assert

                Assert.AreEqual("Value cannot be null.\r\nParameter name: myEvent", ex.Message);
            }
        }
        public override void Put(
            object expressionValue,
            EventEvaluator matcher)
        {
            if (!(expressionValue is DoubleRange))
            {
                throw new ArgumentException("Supplied expressionValue must be of type DoubleRange");
            }

            var range = (DoubleRange)expressionValue;

            if (range.Max == null || range.Min == null)
            {
                RangesNullEndpoints = matcher;
                return;
            }

            if (Math.Abs(range.Max.Value - range.Min.Value) > LargestRangeValueDouble)
            {
                LargestRangeValueDouble = Math.Abs(range.Max.Value - range.Min.Value);
            }

            Ranges.Put(range, matcher);
        }
示例#21
0
 public override void Put(Object expressionValue, EventEvaluator evaluator)
 {
 }
 public override void Put(
     object filterConstant,
     EventEvaluator evaluator)
 {
     ConstantsMap.Put(filterConstant, evaluator);
 }
示例#23
0
        // Remove filterCallback from index, returning true if index empty after removal
        private static bool RemoveFromIndex(
            FilterHandle filterCallback,
            FilterParamIndexBase index,
            EventTypeIndexBuilderIndexLookupablePair[] treePathInfo,
            int treePathPosition,
            Object filterForValue)
        {
            using (index.ReadWriteLock.AcquireWriteLock())
            {
                EventEvaluator eventEvaluator = index[filterForValue];

                if (eventEvaluator == null)
                {
                    Log.Warn(".removeFromIndex ({0}) Could not find the filterCallback value in index, index={1}  value={2}  filterCallback={3}",
                             Thread.CurrentThread.ManagedThreadId, index, filterForValue, filterCallback);
                    return(false);
                }

                if (eventEvaluator is FilterHandleSetNode)
                {
                    var node     = (FilterHandleSetNode)eventEvaluator;
                    var isEmptyX = RemoveFromNode(filterCallback, node, treePathInfo, treePathPosition);
                    if (isEmptyX)
                    {
                        // Since we are holding a write lock to this index, there should not be a chance that
                        // another thread had been adding anything to this FilterHandleSetNode
                        index.Remove(filterForValue);
                    }

                    return(index.Count == 0);
                }

                var nextIndex = (FilterParamIndexBase)eventEvaluator;
                var nextPair  = treePathPosition < treePathInfo.Length ? treePathInfo[treePathPosition++] : null;

                if (nextPair == null)
                {
                    Log.Fatal(".removeFromIndex Expected an inner index to this index, this=" + filterCallback);
                    Debug.Assert(false);
                    return(false);
                }

                if (nextPair.Index != nextIndex)
                {
                    Log.Fatal(".removeFromIndex Expected an index for filterCallback that differs from the found index, this=" + filterCallback +
                              "  expected=" + nextPair.Index);
                    Debug.Assert(false);
                    return(false);
                }

                var nextExpressionValue = nextPair.Lookupable;

                var isEmpty = RemoveFromIndex(filterCallback, nextPair.Index, treePathInfo, treePathPosition, nextExpressionValue);
                if (isEmpty)
                {
                    // Since we are holding a write lock to this index, there should not be a chance that
                    // another thread had been adding anything to this FilterHandleSetNode
                    index.Remove(filterForValue);
                }
                var size = index.Count;

                return(size == 0);
            }
        }
        public override void MatchEvent(EventBean theEvent, ICollection <FilterHandle> matches)
        {
            var propertyValue = Lookupable.Getter.Get(theEvent);
            var returnValue   = new Mutable <bool?>(false);

            using (Instrument.With(
                       i => i.QFilterReverseIndex(this, propertyValue),
                       i => i.AFilterReverseIndex(returnValue.Value)))
            {
                if (propertyValue == null)
                {
                    return;
                }

                // A undefine lower bound indicates an empty index
                if (_lowerBounds == null)
                {
                    return;
                }

                var filterOperator      = FilterOperator;
                var propertyValueDouble = propertyValue.AsDouble();

                // Based on current lower and upper bounds check if the property value falls outside - shortcut submap generation
                if ((filterOperator == FilterOperator.GREATER) && (propertyValueDouble <= _lowerBounds))
                {
                    return;
                }
                else if ((filterOperator == FilterOperator.GREATER_OR_EQUAL) && (propertyValueDouble < _lowerBounds))
                {
                    return;
                }
                else if ((filterOperator == FilterOperator.LESS) && (propertyValueDouble >= _upperBounds))
                {
                    return;
                }
                else if ((filterOperator == FilterOperator.LESS_OR_EQUAL) && (propertyValueDouble > _upperBounds))
                {
                    return;
                }

                // Look up in table
                using (_constantsMapRwLock.AcquireReadLock())
                {
                    // Get the head or tail end of the map depending on comparison type
                    IDictionary <Object, EventEvaluator> subMap;

                    if ((filterOperator == FilterOperator.GREATER) ||
                        (filterOperator == FilterOperator.GREATER_OR_EQUAL))
                    {
                        // At the head of the map are those with a lower numeric constants
                        subMap = _constantsMap.Head(propertyValue);
                    }
                    else
                    {
                        subMap = _constantsMap.Tail(propertyValue);
                    }

                    // All entries in the subMap are elgibile, with an exception
                    EventEvaluator exactEquals = null;
                    if (filterOperator == FilterOperator.LESS)
                    {
                        exactEquals = _constantsMap.Get(propertyValue);
                    }

                    foreach (EventEvaluator matcher in subMap.Values)
                    {
                        // For the LESS comparison type we ignore the exactly equal case
                        // The subMap is sorted ascending, thus the exactly equals case is the first
                        if (exactEquals != null)
                        {
                            exactEquals = null;
                            continue;
                        }

                        matcher.MatchEvent(theEvent, matches);
                    }

                    if (filterOperator == FilterOperator.GREATER_OR_EQUAL)
                    {
                        EventEvaluator matcher = _constantsMap.Get(propertyValue);
                        if (matcher != null)
                        {
                            matcher.MatchEvent(theEvent, matches);
                        }
                    }
                }

                returnValue.Value = null;
            }
        }
示例#25
0
 public override void Put(Object filterConstant, EventEvaluator matcher)
 {
     _constantsMap.Put(filterConstant, matcher);
 }
 public override void Put(object filterConstant, EventEvaluator evaluator) {
     var rect = (XYWHRectangle) filterConstant;
     MXCIFQuadTreeFilterIndexSet<EventEvaluator>.Set(rect.X, rect.Y, rect.W, rect.H, evaluator, _quadTree);
 }
示例#27
0
 /// <summary>
 /// Store the event evaluation instance for the given constant. Can override an existing value for
 /// the same constant. The calling class must make sure that access to the underlying resource is
 /// protected for multi-threaded access, the GetReadWriteLock() method must supply a lock for this
 /// purpose.
 /// </summary>
 /// <param name="filterConstant">is the constant supplied in the filter parameter</param>
 /// <param name="evaluator">to be stored for the constant</param>
 public abstract void Put(Object filterConstant, EventEvaluator evaluator);
 public override void Put(object filterConstant, EventEvaluator evaluator)
 {
     var point = (XYPoint) filterConstant;
     PointRegionQuadTreeFilterIndexSet<EventEvaluator>.Set(point.X, point.Y, evaluator, _quadTree);
 }
示例#29
0
 /// <summary>
 ///     Store the event evaluation instance for the given constant. Can override an existing value for
 ///     the same constant. The calling class must make sure that access to the underlying resource is
 ///     protected for multi-threaded access, the GetReadWriteLock() method must supply a lock for this
 ///     purpose.
 /// </summary>
 /// <param name="filterConstant">is the constant supplied in the filter parameter</param>
 /// <param name="evaluator">to be stored for the constant</param>
 public abstract override void Put(
     object filterConstant,
     EventEvaluator evaluator);
        public void EventEvaluatorShouldReturnEvaluationFalse()
        {
            // Arrange

            const string eventType = "MyEventType";

            var rules = new List <Rule <Event> >
            {
                new Rule <Event>
                {
                    RuleId          = 1,
                    RuleName        = "Rule001",
                    EventType       = eventType,
                    MatchExpression = "p.Priority == 1",
                    Rank            = 1,
                    Enabled         = true
                },
                new Rule <Event>
                {
                    RuleId          = 2,
                    RuleName        = "Rule002",
                    EventType       = eventType,
                    MatchExpression = "p.EventName == \"MyEvent100\"",
                    Rank            = 2,
                    Enabled         = true
                },
                new Rule <Event>
                {
                    RuleId          = 3,
                    RuleName        = "Rule003",
                    EventType       = eventType,
                    MatchExpression = "p.Properties[\"prop1\"] == \"value10\"", // false
                    Rank            = 3,
                    Enabled         = true
                },
                new Rule <Event>
                {
                    RuleId          = 4,
                    RuleName        = "Rule004",
                    EventType       = eventType,
                    MatchExpression = "p.Properties[\"prop2\"] == \"value2\"",
                    Rank            = 4,
                    Enabled         = true
                },
            };

            var myEvent = new Event
            {
                EventId     = 100,
                EventName   = "MyEvent100",
                EventType   = eventType,
                Priority    = 1,
                CreatedDate = DateTime.Now,
                Properties  = new Dictionary <string, string>
                {
                    { "prop1", "value1" },
                    { "prop2", "value2" }
                }
            };

            // Act

            var eventEvaluator = new EventEvaluator(logger);
            var result         = eventEvaluator.EvaluateEvent(myEvent, rules);

            // Assert

            Assert.IsFalse(result);
        }