private static FilterSpecParamFilterForEvalDouble ResolveFilterIndexDoubleEval(
            string indexName,
            ExprNode indexExpression,
            IDictionary <string, Pair <EventType, string> > arrayEventTypes,
            string statementName,
            ExprEvaluatorContext exprEvaluatorContext)
        {
            FilterSpecParamFilterForEvalDouble resolved = null;

            if (indexExpression is ExprIdentNode)
            {
                resolved = GetIdentNodeDoubleEval((ExprIdentNode)indexExpression, arrayEventTypes, statementName);
            }
            else if (indexExpression is ExprContextPropertyNode)
            {
                var node = (ExprContextPropertyNode)indexExpression;
                resolved = new FilterForEvalContextPropDouble(node.Getter, node.PropertyName);
            }
            else if (ExprNodeUtility.IsConstantValueExpr(indexExpression))
            {
                var constantNode = (ExprConstantNode)indexExpression;
                var d            = constantNode.GetConstantValue(exprEvaluatorContext).AsDouble();
                resolved = new FilterForEvalConstantDouble(d);
            }
            if (resolved != null)
            {
                return(resolved);
            }
            throw new ExprValidationException("Invalid filter-indexable expression '" + indexExpression.ToExpressionStringMinPrecedenceSafe() + "' in respect to index '" + indexName + "': expected either a constant, context-builtin or property from a previous pattern match");
        }
 protected bool Equals(FilterForEvalContextPropDouble other)
 {
     return string.Equals(_propertyName, other._propertyName);
 }