private static FilterSpecParam HandleRangeNode( ExprBetweenNode betweenNode, IDictionary<string, Pair<EventType, string>> arrayEventTypes, ExprEvaluatorContext exprEvaluatorContext, string statementName) { var left = betweenNode.ChildNodes[0]; if (left is ExprFilterOptimizableNode) { var filterOptimizableNode = (ExprFilterOptimizableNode) left; var lookupable = filterOptimizableNode.FilterLookupable; var op = FilterOperatorExtensions.ParseRangeOperator( betweenNode.IsLowEndpointIncluded, betweenNode.IsHighEndpointIncluded, betweenNode.IsNotBetween); var low = HandleRangeNodeEndpoint( betweenNode.ChildNodes[1], arrayEventTypes, exprEvaluatorContext, statementName); var high = HandleRangeNodeEndpoint( betweenNode.ChildNodes[2], arrayEventTypes, exprEvaluatorContext, statementName); if ((low != null) && (high != null)) { return new FilterSpecParamRange(lookupable, op, low, high); } } return null; }
public static FilterSpecParamForge HandleRangeNode( ExprBetweenNode betweenNode, IDictionary<string, Pair<EventType, string>> taggedEventTypes, IDictionary<string, Pair<EventType, string>> arrayEventTypes, ISet<string> allTagNamesOrdered, string statementName, StatementRawInfo raw, StatementCompileTimeServices services) { var left = betweenNode.ChildNodes[0]; ExprFilterSpecLookupableForge lookupable = null; if (left is ExprFilterOptimizableNode) { var filterOptimizableNode = (ExprFilterOptimizableNode) left; lookupable = filterOptimizableNode.FilterLookupable; } else if (FilterSpecCompilerIndexPlannerHelper.HasLevelOrHint(FilterSpecCompilerIndexPlannerHint.LKUPCOMPOSITE, raw, services) && IsLimitedLookupableExpression(left)) { lookupable = MakeLimitedLookupableForgeMayNull(left, raw, services); } if (lookupable == null) { return null; } FilterOperator op = FilterOperatorExtensions.ParseRangeOperator( betweenNode.IsLowEndpointIncluded, betweenNode.IsHighEndpointIncluded, betweenNode.IsNotBetween); var low = HandleRangeNodeEndpoint(betweenNode.ChildNodes[1], taggedEventTypes, arrayEventTypes, allTagNamesOrdered, statementName, raw, services); var high = HandleRangeNodeEndpoint(betweenNode.ChildNodes[2], taggedEventTypes, arrayEventTypes, allTagNamesOrdered, statementName, raw, services); return low == null || high == null ? null : new FilterSpecParamRangeForge(lookupable, op, low, high); }
private static void AnalyzeBetweenNode( ExprBetweenNode betweenNode, QueryGraphForge queryGraph) { RangeFilterAnalyzer.Apply( betweenNode.ChildNodes[0], betweenNode.ChildNodes[1], betweenNode.ChildNodes[2], betweenNode.IsLowEndpointIncluded, betweenNode.IsHighEndpointIncluded, betweenNode.IsNotBetween, queryGraph); }