Ejemplo n.º 1
0
            private bool?EvaluateInternal(EvaluateParams evaluateParams)
            {
                var leftResult  = _lhs.Evaluate(evaluateParams);
                var rightResult = _rhs.Evaluate(evaluateParams);

                if (!_parent.IsIs)
                {
                    if (leftResult == null || rightResult == null)      // null comparison
                    {
                        return(null);
                    }
                }
                else
                {
                    if (leftResult == null)
                    {
                        return(rightResult == null);
                    }
                    if (rightResult == null)
                    {
                        return(false);
                    }
                }

                var left  = _numberCoercerLHS.Invoke(leftResult);
                var right = _numberCoercerRHS.Invoke(rightResult);

                return(left.Equals(right) ^ _parent.IsNotEquals);
            }
Ejemplo n.º 2
0
        public override Object Evaluate(EvaluateParams evaluateParams)
        {
            var scriptArgs = new ScriptArgs();
            var bindings   = new Dictionary <string, object>();

            bindings.Put(ExprNodeScript.CONTEXT_BINDING_NAME, evaluateParams.ExprEvaluatorContext.AgentInstanceScriptContext);
            for (int i = 0; i < Names.Length; i++)
            {
                bindings.Put(Names[i], Parameters[i].Evaluate(evaluateParams));
            }

            scriptArgs.Bindings = bindings;

            try
            {
                var result = _scriptAction.Invoke(scriptArgs);

                if (Coercer != null)
                {
                    result = Coercer.Invoke(result);
                }

                return(result);
            }
            catch (Exception e)
            {
                String message = "Unexpected exception executing script '" + ScriptName + "' for statement '" + StatementName + "' : " + e.Message;
                Log.Error(message, e);
                throw new EPException(message, e);
            }
        }
Ejemplo n.º 3
0
        public override object GetFilterValue(MatchedEventMap matchedEvents, AgentInstanceContext agentInstanceContext)
        {
            EventBean[] events = (EventBean[])matchedEvents.GetMatchingEventAsObjectByTag(_resultEventAsName);

            Object value = null;

            if (events == null)
            {
                Log.Warn("Matching events for tag '" + _resultEventAsName + "' returned a null result, using null value in filter criteria, for statement '" + _statementName + "'");
            }
            else if (_resultEventIndex > (events.Length - 1))
            {
                Log.Warn("Matching events for tag '" + _resultEventAsName + "' returned no result for index " + _resultEventIndex + " at array length " + events.Length + ", using null value in filter criteria, for statement '" + _statementName + "'");
            }
            else
            {
                value = events[_resultEventIndex].Get(_resultEventProperty);
            }

            // Coerce if necessary
            if (_isMustCoerce)
            {
                value = _numberCoercer.Invoke(value);
            }
            return(value);
        }
 public object GetFilterValue(MatchedEventMap matchedEvents, ExprEvaluatorContext evaluatorContext)
 {
     if (evaluatorContext.ContextProperties == null) return null;
     var result = _getter.Get(evaluatorContext.ContextProperties);
     if (_numberCoercer == null) return result;
     return _numberCoercer.Invoke(result);
 }
        protected override Object GetKey(EventBean theEvent)
        {
            var keyValue = base.GetKey(theEvent);

            if ((keyValue != null) && (keyValue.GetType() != _coercionType))
            {
                keyValue = keyValue.IsNumber()
                    ? _coercer.Invoke(keyValue)
                    : EventBeanUtility.Coerce(keyValue, _coercionType);
            }
            return(keyValue);
        }
Ejemplo n.º 6
0
        public static Object WidenArray(Object source, Type targetElementType, Coercer coercer)
        {
            var sourceArray = (Array)source;
            var length      = sourceArray.Length;
            var targetArray = Array.CreateInstance(targetElementType, length);

            for (int ii = 0; ii < length; ii++)
            {
                targetArray.SetValue(coercer.Invoke(sourceArray.GetValue(ii)), ii);
            }

            return(targetArray);
        }
Ejemplo n.º 7
0
        public override Object GetFilterValue(MatchedEventMap matchedEvents, ExprEvaluatorContext evaluatorContext)
        {
            if (evaluatorContext.ContextProperties == null)
            {
                return(null);
            }
            Object result = _getter.Get(evaluatorContext.ContextProperties);

            if (_numberCoercer == null)
            {
                return(result);
            }
            return(_numberCoercer.Invoke(result));
        }
Ejemplo n.º 8
0
        public override object GetFilterValue(MatchedEventMap matchedEvents, AgentInstanceContext agentInstanceContext)
        {
            if (agentInstanceContext.ContextProperties == null)
            {
                return(null);
            }

            var result = _getter.Get(agentInstanceContext.ContextProperties);

            if (_numberCoercer == null)
            {
                return(result);
            }
            return(_numberCoercer.Invoke(result));
        }
Ejemplo n.º 9
0
        protected override Object EvaluateInternal(
            Object leftResult,
            EventBean[] events,
            bool isNewData,
            ICollection <EventBean> matchingEvents,
            ExprEvaluatorContext exprEvaluatorContext,
            AggregationService aggregationService)

        {
            var evaluateParams = new EvaluateParams(events, true, exprEvaluatorContext);

            if (_havingEval != null)
            {
                var pass = _havingEval.Evaluate(evaluateParams);
                if ((pass == null) || (false.Equals(pass)))
                {
                    return(null);
                }
            }

            var rightResult = SelectEval.Evaluate(evaluateParams);

            if (rightResult == null)
            {
                return(null);
            }

            if (Coercer == null)
            {
                var eq = leftResult.Equals(rightResult);
                if ((IsNot && eq) || (!IsNot && !eq))
                {
                    return(false);
                }
            }
            else
            {
                var  left  = Coercer.Invoke(leftResult);
                var  right = Coercer.Invoke(rightResult);
                bool eq    = left.Equals(right);
                if ((IsNot && eq) || (!IsNot && !eq))
                {
                    return(false);
                }
            }
            return(true);
        }
Ejemplo n.º 10
0
        public object EvaluateInternal(ScriptArgs scriptArgs)
        {
            try
            {
                var result = _scriptAction.Invoke(scriptArgs);

                if (Coercer != null)
                {
                    result = Coercer.Invoke(result);
                }

                return(result);
            }
            catch (Exception e)
            {
                string message = "Unexpected exception executing script '" + ScriptName + "' for statement '" + StatementName + "' : " + e.Message;
                Log.Error(message, e);
                throw new EPException(message, e);
            }
        }
Ejemplo n.º 11
0
        public override object GetFilterValue(MatchedEventMap matchedEvents, AgentInstanceContext agentInstanceContext)
        {
            EventBean theEvent = matchedEvents.GetMatchingEventByTag(_resultEventAsName);
            Object    value    = null;

            if (theEvent == null)
            {
                Log.Warn("Matching events for tag '" + _resultEventAsName + "' returned a null result, using null value in filter criteria, for statement '" + _statementName + "'");
            }
            else
            {
                value = theEvent.Get(_resultEventProperty);
            }

            // Coerce if necessary
            if (_isMustCoerce)
            {
                value = _numberCoercer.Invoke(value);
            }
            return(value);
        }
Ejemplo n.º 12
0
            private bool?EvaluateInternal(EvaluateParams evaluateParams)
            {
                var leftResult  = _lhs.Evaluate(evaluateParams);
                var rightResult = _rhs.Evaluate(evaluateParams);

                if (!_parent.IsIs)
                {
                    if (leftResult == null || rightResult == null) // null comparison
                    {
                        return(null);
                    }
                }
                else if (leftResult == null)
                {
                    return(rightResult == null);
                }
                if (rightResult == null)
                {
                    return(false);
                }

                var leftArray  = (Array)leftResult;
                var rightArray = (Array)rightResult;

                if (leftArray.Length != rightArray.Length)
                {
                    return(!_parent.IsNotEquals);
                }

                var isEquals = true;

                for (int ii = 0; isEquals && ii < leftArray.Length; ii++)
                {
                    var valueL = _coercerLHS.Invoke(leftArray.GetValue(ii));
                    var valueR = _coercerRHS.Invoke(rightArray.GetValue(ii));
                    isEquals &= Equals(valueL, valueR);
                }

                return(isEquals ^ _parent.IsNotEquals);
            }
Ejemplo n.º 13
0
        /// <summary>
        /// CoerceIndex the given number to the given type. Allows coerce to lower resultion number.
        /// Doesn't coerce to primitive types.
        /// <param name="itemToCoerce">numToCoerce is the number to coerce to the given type</param>
        /// <param name="resultBoxedType">the result type to return</param>
        /// <returns>the itemToCoerce as a value in the given result type</returns>
        /// </summary>

        public static Object CoerceBoxed(Object itemToCoerce, Type resultBoxedType)
        {
            Coercer coercer = GetCoercer(itemToCoerce.GetType(), resultBoxedType);

            return(coercer.Invoke(itemToCoerce));
        }
Ejemplo n.º 14
0
        public override ExprNode Validate(ExprValidationContext validationContext)
        {
            _length     = ChildNodes.Count;
            _evaluators = ExprNodeUtility.GetEvaluators(ChildNodes);

            // Can be an empty array with no content
            if (ChildNodes.Count == 0)
            {
                _arrayReturnType = typeof(Object);
                _constantResult  = new Object[0];
                return(null);
            }

            var comparedTypes = new List <Type>();

            for (int i = 0; i < _length; i++)
            {
                comparedTypes.Add(_evaluators[i].ReturnType);
            }

            // Determine common denominator type
            try {
                _arrayReturnType = TypeHelper.GetCommonCoercionType(comparedTypes.ToArray());

                // Determine if we need to coerce numbers when one type doesn't match any other type
                if (_arrayReturnType.IsNumeric())
                {
                    _mustCoerce = false;
                    foreach (var comparedType in comparedTypes)
                    {
                        if (comparedType != _arrayReturnType)
                        {
                            _mustCoerce = true;
                        }
                    }
                    if (_mustCoerce)
                    {
                        _coercer = CoercerFactory.GetCoercer(null, _arrayReturnType);
                    }
                }
            }
            catch (CoercionException)
            {
                // expected, such as mixing String and int values, or classes (not boxed) and primitives
                // use Object[] in such cases
            }
            if (_arrayReturnType == null)
            {
                _arrayReturnType = typeof(Object);
            }

            // Determine if we are dealing with constants only
            var results = new Object[_length];
            int index   = 0;

            foreach (ExprNode child in ChildNodes)
            {
                if (!child.IsConstantResult)
                {
                    results = null;  // not using a constant result
                    break;
                }
                results[index] = _evaluators[index].Evaluate(new EvaluateParams(null, false, validationContext.ExprEvaluatorContext));
                index++;
            }

            // Copy constants into array and coerce, if required
            if (results != null)
            {
                var asArray = Array.CreateInstance(_arrayReturnType, _length);
                _constantResult = asArray;

                for (int i = 0; i < _length; i++)
                {
                    if (_mustCoerce)
                    {
                        var boxed = results[i];
                        if (boxed != null)
                        {
                            Object coercedResult = _coercer.Invoke(boxed);
                            asArray.SetValue(coercedResult, i);
                        }
                    }
                    else
                    {
                        asArray.SetValue(results[i], i);
                    }
                }
            }

            return(null);
        }
Ejemplo n.º 15
0
 public Object Widen(Object input)
 {
     return(_coercer.Invoke(input));
 }
        public Object Evaluate(EventBean[] eventsPerStream, bool isNewData, ICollection <EventBean> matchingEvents, ExprEvaluatorContext exprEvaluatorContext)
        {
            if (matchingEvents == null)
            {
                return(_isNotIn);
            }
            if (matchingEvents.Count == 0)
            {
                return(_isNotIn);
            }

            // Evaluate the child expression
            Object leftResult = _valueExpr.Evaluate(new EvaluateParams(eventsPerStream, isNewData, exprEvaluatorContext));

            // Evaluation event-per-stream
            var events = new EventBean[eventsPerStream.Length + 1];

            Array.Copy(eventsPerStream, 0, events, 1, eventsPerStream.Length);

            if (_filterExpr == null)
            {
                if (leftResult == null)
                {
                    return(null);
                }

                // Evaluate each select until we have a match
                bool hasNonNullRow = false;
                bool hasNullRow    = false;
                foreach (EventBean eventBean in matchingEvents)
                {
                    events[0] = eventBean;

                    Object rightResult =
                        _selectClauseExpr != null
                            ? _selectClauseExpr.Evaluate(new EvaluateParams(events, true, exprEvaluatorContext))
                            : events[0].Underlying;

                    if (rightResult != null)
                    {
                        hasNonNullRow = true;
                        if (!_mustCoerce)
                        {
                            if (leftResult.Equals(rightResult))
                            {
                                return(!_isNotIn);
                            }
                        }
                        else
                        {
                            var left  = _coercer.Invoke(leftResult);
                            var right = _coercer.Invoke(rightResult);
                            if (Equals(left, right))
                            {
                                return(!_isNotIn);
                            }
                        }
                    }
                    else
                    {
                        hasNullRow = true;
                    }
                }

                if ((!hasNonNullRow) || (hasNullRow))
                {
                    return(null);
                }
                return(_isNotIn);
            }

            // Filter and check each row.
            bool hasNullRowOuter = false;

            foreach (EventBean subselectEvent in matchingEvents)
            {
                // Prepare filter expression event list
                events[0] = subselectEvent;

                // Eval filter expression
                var pass = (bool?)_filterExpr.Evaluate(new EvaluateParams(events, true, exprEvaluatorContext));
                if ((pass == null) || (!pass.Value))
                {
                    continue;
                }
                if (leftResult == null)
                {
                    return(null);
                }

                object rightResult =
                    _selectClauseExpr != null
                        ? _selectClauseExpr.Evaluate(new EvaluateParams(events, true, exprEvaluatorContext))
                        : events[0].Underlying;

                if (rightResult == null)
                {
                    hasNullRowOuter = true;
                }
                else
                {
                    if (!_mustCoerce)
                    {
                        if (leftResult.Equals(rightResult))
                        {
                            return(!_isNotIn);
                        }
                    }
                    else
                    {
                        var left  = _coercer.Invoke(leftResult);
                        var right = _coercer.Invoke(rightResult);
                        if (Equals(left, right))
                        {
                            return(!_isNotIn);
                        }
                    }
                }
            }

            if (hasNullRowOuter)
            {
                return(null);
            }

            return(_isNotIn);
        }
Ejemplo n.º 17
0
        public object EvaluateInternal(EvaluateParams evaluateParams)
        {
            Object leftResult = _evaluators[0].Evaluate(evaluateParams);

            if (_transformList[0] != null)
            {
                leftResult = _transformList[0](leftResult);
            }

            if (_hasCollectionOrArray)
            {
                if (IsAll)
                {
                    return(CompareAllColl(leftResult, evaluateParams.EventsPerStream, evaluateParams.IsNewData, evaluateParams.ExprEvaluatorContext));
                }

                return(CompareAnyColl(leftResult, evaluateParams.EventsPerStream, evaluateParams.IsNewData, evaluateParams.ExprEvaluatorContext));
            }

            // coerce early if testing without collections
            if ((_mustCoerce) && (leftResult != null))
            {
                leftResult = _coercer.Invoke(leftResult);
            }

            if (IsAll)
            {
                return(CompareAll(leftResult, evaluateParams.EventsPerStream, evaluateParams.IsNewData, evaluateParams.ExprEvaluatorContext));
            }

            return(CompareAny(leftResult, evaluateParams.EventsPerStream, evaluateParams.IsNewData, evaluateParams.ExprEvaluatorContext));
        }
Ejemplo n.º 18
0
        public Object Evaluate(EventBean[] eventsPerStream, bool isNewData, ICollection <EventBean> matchingEvents, ExprEvaluatorContext exprEvaluatorContext)
        {
            // Evaluate the child expression
            Object leftResult = _valueExpr.Evaluate(new EvaluateParams(eventsPerStream, isNewData, exprEvaluatorContext));

            if ((matchingEvents == null) || (matchingEvents.Count == 0))
            {
                return(true);
            }

            // Evaluation event-per-stream
            var events = new EventBean[eventsPerStream.Length + 1];

            Array.Copy(eventsPerStream, 0, events, 1, eventsPerStream.Length);

            if (_isNot)
            {
                // Evaluate each select until we have a match
                bool hasNonNullRow = false;
                bool hasNullRow    = false;
                foreach (EventBean theEvent in matchingEvents)
                {
                    events[0] = theEvent;

                    // Eval filter expression
                    if (_filterExpr != null)
                    {
                        var pass = (bool?)_filterExpr.Evaluate(new EvaluateParams(events, true, exprEvaluatorContext));
                        if ((pass == null) || (!pass.Value))
                        {
                            continue;
                        }
                    }
                    if (leftResult == null)
                    {
                        return(null);
                    }

                    Object rightResult;
                    if (_selectClauseExpr != null)
                    {
                        rightResult = _selectClauseExpr.Evaluate(new EvaluateParams(events, true, exprEvaluatorContext));
                    }
                    else
                    {
                        rightResult = events[0].Underlying;
                    }

                    if (rightResult != null)
                    {
                        hasNonNullRow = true;
                        if (!_mustCoerce)
                        {
                            if (leftResult.Equals(rightResult))
                            {
                                return(false);
                            }
                        }
                        else
                        {
                            object left  = _coercer.Invoke(leftResult);
                            object right = _coercer.Invoke(rightResult);
                            if (Equals(left, right))
                            {
                                return(false);
                            }
                        }
                    }
                    else
                    {
                        hasNullRow = true;
                    }
                }

                if ((!hasNonNullRow) || (hasNullRow))
                {
                    return(null);
                }
                return(true);
            }
            else
            {
                // Evaluate each select until we have a match
                bool hasNonNullRow = false;
                bool hasNullRow    = false;
                foreach (EventBean theEvent in matchingEvents)
                {
                    events[0] = theEvent;

                    // Eval filter expression
                    if (_filterExpr != null)
                    {
                        var pass = (bool?)_filterExpr.Evaluate(new EvaluateParams(events, true, exprEvaluatorContext));
                        if ((pass == null) || (!pass.Value))
                        {
                            continue;
                        }
                    }
                    if (leftResult == null)
                    {
                        return(null);
                    }

                    Object rightResult;
                    if (_selectClauseExpr != null)
                    {
                        rightResult = _selectClauseExpr.Evaluate(new EvaluateParams(events, true, exprEvaluatorContext));
                    }
                    else
                    {
                        rightResult = events[0].Underlying;
                    }

                    if (rightResult != null)
                    {
                        hasNonNullRow = true;
                        if (!_mustCoerce)
                        {
                            if (!leftResult.Equals(rightResult))
                            {
                                return(false);
                            }
                        }
                        else
                        {
                            object left  = _coercer.Invoke(leftResult);
                            object right = _coercer.Invoke(rightResult);
                            if (!Equals(left, right))
                            {
                                return(false);
                            }
                        }
                    }
                    else
                    {
                        hasNullRow = true;
                    }
                }

                if ((!hasNonNullRow) || (hasNullRow))
                {
                    return(null);
                }
                return(true);
            }
        }
        protected override Object EvaluateInternal(
            Object leftResult,
            EventBean[] events,
            bool isNewData,
            ICollection <EventBean> matchingEvents,
            ExprEvaluatorContext exprEvaluatorContext,
            AggregationService aggregationService)
        {
            var hasNullRow     = false;
            var evaluateParams = new EvaluateParams(events, true, exprEvaluatorContext);

            foreach (EventBean theEvent in matchingEvents)
            {
                events[0] = theEvent;

                // Eval filter expression
                if (_filterEval != null)
                {
                    var pass = _filterEval.Evaluate(evaluateParams);
                    if ((pass == null) || (false.Equals(pass)))
                    {
                        continue;
                    }
                }
                if (leftResult == null)
                {
                    return(null);
                }

                Object rightResult;
                if (SelectEval != null)
                {
                    rightResult = SelectEval.Evaluate(evaluateParams);
                }
                else
                {
                    rightResult = events[0].Underlying;
                }

                if (rightResult != null)
                {
                    if (Coercer == null)
                    {
                        bool eq = leftResult.Equals(rightResult);
                        if ((IsNot && eq) || (!IsNot && !eq))
                        {
                            return(false);
                        }
                    }
                    else
                    {
                        var left  = Coercer.Invoke(leftResult);
                        var right = Coercer.Invoke(rightResult);
                        var eq    = left.Equals(right);
                        if ((IsNot && eq) || (!IsNot && !eq))
                        {
                            return(false);
                        }
                    }
                }
                else
                {
                    hasNullRow = true;
                }
            }

            if (hasNullRow)
            {
                return(null);
            }
            return(true);
        }
Ejemplo n.º 20
0
        private bool?EvaluateInternal(EventBean[] eventsPerStream, bool isNewData, ExprEvaluatorContext exprEvaluatorContext)
        {
            var inPropResult = _evaluators[0].Evaluate(new EvaluateParams(eventsPerStream, isNewData, exprEvaluatorContext));

            if (!_hasCollectionOrArray)
            {
                if ((_mustCoerce) && (inPropResult != null))
                {
                    inPropResult = _coercer.Invoke(inPropResult);
                }

                int len = this.ChildNodes.Length - 1;
                if ((len > 0) && (inPropResult == null))
                {
                    return(null);
                }
                bool hasNullRow = false;
                for (int i = 1; i <= len; i++)
                {
                    var rightResult = _evaluators[i].Evaluate(new EvaluateParams(eventsPerStream, isNewData, exprEvaluatorContext));
                    if (_transformList[i] != null)
                    {
                        rightResult = _transformList[i](rightResult);
                    }

                    if (rightResult == null)
                    {
                        hasNullRow = true;
                        continue;
                    }

                    if (!_mustCoerce)
                    {
                        if (rightResult.Equals(inPropResult))
                        {
                            return(!_isNotIn);
                        }
                    }
                    else
                    {
                        var right = _coercer.Invoke(rightResult);
                        if (right.Equals(inPropResult))
                        {
                            return(!_isNotIn);
                        }
                    }
                }

                if (hasNullRow)
                {
                    return(null);
                }
                return(_isNotIn);
            }
            else
            {
                var len        = ChildNodes.Length - 1;
                var hasNullRow = false;
                for (int i = 1; i <= len; i++)
                {
                    var rightResult = _evaluators[i].Evaluate(new EvaluateParams(eventsPerStream, isNewData, exprEvaluatorContext));
                    if (_transformList[i] != null)
                    {
                        rightResult = _transformList[i](rightResult);
                    }

                    if (rightResult == null)
                    {
                        continue;
                    }

                    if (rightResult is AnyMap)
                    {
                        if (inPropResult == null)
                        {
                            return(null);
                        }
                        var coll = (AnyMap)rightResult;
                        if (coll.ContainsKey(inPropResult))
                        {
                            return(!_isNotIn);
                        }
                    }
                    else if (rightResult.GetType().IsArray)
                    {
                        var array       = (Array)rightResult;
                        int arrayLength = array.Length;
                        if ((arrayLength > 0) && (inPropResult == null))
                        {
                            return(null);
                        }
                        for (int index = 0; index < arrayLength; index++)
                        {
                            var item = array.GetValue(index);
                            if (item == null)
                            {
                                hasNullRow = true;
                                continue;
                            }
                            if (!_mustCoerce)
                            {
                                if (inPropResult.Equals(item))
                                {
                                    return(!_isNotIn);
                                }
                            }
                            else
                            {
                                if (!item.IsNumber())
                                {
                                    continue;
                                }
                                var left  = _coercer.Invoke(inPropResult);
                                var right = _coercer.Invoke(item);
                                if (left.Equals(right))
                                {
                                    return(!_isNotIn);
                                }
                            }
                        }
                    }
                    else if (rightResult is DataCollection)
                    {
                        if (inPropResult == null)
                        {
                            return(null);
                        }
                        var coll = (DataCollection)rightResult;
                        if (coll.Contains(inPropResult))
                        {
                            return(!_isNotIn);
                        }
                    }
                    else
                    {
                        if (inPropResult == null)
                        {
                            return(null);
                        }
                        if (!_mustCoerce)
                        {
                            if (inPropResult.Equals(rightResult))
                            {
                                return(!_isNotIn);
                            }
                        }
                        else
                        {
                            var left  = _coercer.Invoke(inPropResult);
                            var right = _coercer.Invoke(rightResult);
                            if (left.Equals(right))
                            {
                                return(!_isNotIn);
                            }
                        }
                    }
                }

                if (hasNullRow)
                {
                    return(null);
                }
                return(_isNotIn);
            }
        }
Ejemplo n.º 21
0
        protected override Object EvaluateInternal(
            Object leftResult,
            EventBean[] events,
            bool isNewData,
            ICollection <EventBean> matchingEvents,
            ExprEvaluatorContext exprEvaluatorContext,
            AggregationService aggregationServiceAnyPartition)
        {
            var aggregationService =
                aggregationServiceAnyPartition.GetContextPartitionAggregationService(
                    exprEvaluatorContext.AgentInstanceId);
            var groupKeys  = aggregationService.GetGroupKeys(exprEvaluatorContext);
            var hasNullRow = false;

            var evaluateParams = new EvaluateParams(events, true, exprEvaluatorContext);

            foreach (var groupKey in groupKeys)
            {
                if (leftResult == null)
                {
                    return(null);
                }
                aggregationService.SetCurrentAccess(groupKey, exprEvaluatorContext.AgentInstanceId, null);

                if (_havingEval != null)
                {
                    var pass = _havingEval.Evaluate(evaluateParams);
                    if ((pass == null) || (false.Equals(pass)))
                    {
                        continue;
                    }
                }

                Object rightResult;
                if (SelectEval != null)
                {
                    rightResult = SelectEval.Evaluate(evaluateParams);
                }
                else
                {
                    rightResult = events[0].Underlying;
                }

                if (rightResult != null)
                {
                    if (Coercer == null)
                    {
                        var eq = leftResult.Equals(rightResult);
                        if ((IsNot && !eq) || (!IsNot && eq))
                        {
                            return(true);
                        }
                    }
                    else
                    {
                        var left  = Coercer.Invoke(leftResult);
                        var right = Coercer.Invoke(rightResult);
                        var eq    = left.Equals(right);
                        if ((IsNot && !eq) || (!IsNot && eq))
                        {
                            return(true);
                        }
                    }
                }
                else
                {
                    hasNullRow = true;
                }
            }

            if (hasNullRow)
            {
                return(null);
            }
            return(false);
        }
        protected override Object EvaluateInternal(
            Object leftResult,
            EventBean[] events,
            bool isNewData,
            ICollection <EventBean> matchingEvents,
            ExprEvaluatorContext exprEvaluatorContext,
            AggregationService aggregationService)
        {
            if (leftResult == null)
            {
                return(null);
            }

            var evaluateParams = new EvaluateParams(events, true, exprEvaluatorContext);

            // Evaluate each select until we have a match
            bool hasNullRow = false;

            foreach (EventBean theEvent in matchingEvents)
            {
                events[0] = theEvent;

                Object rightResult;
                if (SelectEval != null)
                {
                    rightResult = SelectEval.Evaluate(evaluateParams);
                }
                else
                {
                    rightResult = events[0].Underlying;
                }

                if (rightResult != null)
                {
                    if (Coercer == null)
                    {
                        if (leftResult.Equals(rightResult))
                        {
                            return(!IsNotIn);
                        }
                    }
                    else
                    {
                        var left  = Coercer.Invoke(leftResult);
                        var right = Coercer.Invoke(rightResult);
                        if (left.Equals(right))
                        {
                            return(!IsNotIn);
                        }
                    }
                }
                else
                {
                    hasNullRow = true;
                }
            }

            if (hasNullRow)
            {
                return(null);
            }
            return(IsNotIn);
        }
        protected override Object EvaluateInternal(
            Object leftResult,
            EventBean[] eventsZeroOffset,
            bool isNewData,
            ICollection <EventBean> matchingEvents,
            ExprEvaluatorContext exprEvaluatorContext,
            AggregationService aggregationService)
        {
            bool hasNullRow     = false;
            var  evaluateParams = new EvaluateParams(eventsZeroOffset, true, exprEvaluatorContext);

            foreach (EventBean subselectEvent in matchingEvents)
            {
                // Prepare filter expression event list
                eventsZeroOffset[0] = subselectEvent;

                // Eval filter expression
                var pass = _filterEval.Evaluate(evaluateParams);
                if ((pass == null) || (false.Equals(pass)))
                {
                    continue;
                }
                if (leftResult == null)
                {
                    return(null);
                }

                Object rightResult;
                if (SelectEval != null)
                {
                    rightResult = SelectEval.Evaluate(evaluateParams);
                }
                else
                {
                    rightResult = eventsZeroOffset[0].Underlying;
                }

                if (rightResult == null)
                {
                    hasNullRow = true;
                }
                else
                {
                    if (Coercer == null)
                    {
                        if (leftResult.Equals(rightResult))
                        {
                            return(!IsNotIn);
                        }
                    }
                    else
                    {
                        var left  = Coercer.Invoke(leftResult);
                        var right = Coercer.Invoke(rightResult);
                        if (left.Equals(right))
                        {
                            return(!IsNotIn);
                        }
                    }
                }
            }

            if (hasNullRow)
            {
                return(null);
            }

            return(IsNotIn);
        }