public Object EvaluateInternal(long ts, EventBean[] eventsPerStream, bool newData, ExprEvaluatorContext exprEvaluatorContext)
        {
            Object firstObj = _startEval.Evaluate(new EvaluateParams(eventsPerStream, newData, exprEvaluatorContext));

            if (firstObj == null)
            {
                return(null);
            }
            Object secondObj = _endEval.Evaluate(new EvaluateParams(eventsPerStream, newData, exprEvaluatorContext));

            if (secondObj == null)
            {
                return(null);
            }
            long first  = _startCoercer.Coerce(firstObj);
            long second = _secondCoercer.Coerce(secondObj);

            if (_includeBoth.GetValueOrDefault())
            {
                if (first <= second)
                {
                    return(first <= ts && ts <= second);
                }
                else
                {
                    return(second <= ts && ts <= first);
                }
            }
            else
            {
                bool includeLowEndpoint;
                if (_includeLow != null)
                {
                    includeLowEndpoint = _includeLow.GetValueOrDefault();
                }
                else
                {
                    Object value = _evalIncludeLow.Evaluate(new EvaluateParams(eventsPerStream, newData, exprEvaluatorContext));
                    if (value == null)
                    {
                        return(null);
                    }
                    includeLowEndpoint = value.AsBoolean();
                }

                bool includeHighEndpoint;
                if (_includeHigh != null)
                {
                    includeHighEndpoint = _includeHigh.GetValueOrDefault();
                }
                else
                {
                    Object value = _evalIncludeHigh.Evaluate(new EvaluateParams(eventsPerStream, newData, exprEvaluatorContext));
                    if (value == null)
                    {
                        return(null);
                    }
                    includeHighEndpoint = value.AsBoolean();
                }

                if (includeLowEndpoint)
                {
                    if (ts < first)
                    {
                        return(false);
                    }
                }
                else
                {
                    if (ts <= first)
                    {
                        return(false);
                    }
                }

                if (includeHighEndpoint)
                {
                    if (ts > second)
                    {
                        return(false);
                    }
                }
                else
                {
                    if (ts >= second)
                    {
                        return(false);
                    }
                }

                return(true);
            }
        }
        public Object EvaluateInternal(
            long ts,
            EventBean[] eventsPerStream,
            bool newData,
            ExprEvaluatorContext exprEvaluatorContext)
        {
            var evaluateParams = new EvaluateParams(eventsPerStream, newData, exprEvaluatorContext);
            var firstObj       = _startEval.Evaluate(evaluateParams);

            if (firstObj == null)
            {
                return(null);
            }
            var secondObj = _endEval.Evaluate(evaluateParams);

            if (secondObj == null)
            {
                return(null);
            }
            var first  = _startCoercer.Coerce(firstObj);
            var second = _secondCoercer.Coerce(secondObj);

            if (_includeBoth)
            {
                if (first <= second)
                {
                    return(first <= ts && ts <= second);
                }
                else
                {
                    return(second <= ts && ts <= first);
                }
            }
            else
            {
                bool includeLowEndpoint;
                if (_includeLow != null)
                {
                    includeLowEndpoint = _includeLow.Value;
                }
                else
                {
                    var value = _evalIncludeLow.Evaluate(evaluateParams);
                    if (value == null)
                    {
                        return(null);
                    }
                    includeLowEndpoint = (bool)value;
                }

                bool includeHighEndpoint;
                if (_includeHigh != null)
                {
                    includeHighEndpoint = _includeHigh.Value;
                }
                else
                {
                    var value = _evalIncludeHigh.Evaluate(evaluateParams);
                    if (value == null)
                    {
                        return(null);
                    }
                    includeHighEndpoint = (bool)value;
                }

                if (includeLowEndpoint)
                {
                    if (ts < first)
                    {
                        return(false);
                    }
                }
                else
                {
                    if (ts <= first)
                    {
                        return(false);
                    }
                }

                if (includeHighEndpoint)
                {
                    if (ts > second)
                    {
                        return(false);
                    }
                }
                else
                {
                    if (ts >= second)
                    {
                        return(false);
                    }
                }

                return(true);
            }
        }