private static FilterSpecPlanPathTripletForge HandleOrAlternateExpression( ExprOrNode orNode, bool performConditionPlanning, IDictionary <string, Pair <EventType, string> > taggedEventTypes, IDictionary <string, Pair <EventType, string> > arrayEventTypes, ISet <string> allTagNamesOrdered, string statementName, StreamTypeService streamTypeService, StatementRawInfo raw, StatementCompileTimeServices services) { IList <ExprNode> valueExpressions = new List <ExprNode>(orNode.ChildNodes.Length); foreach (ExprNode child in orNode.ChildNodes) { FilterSpecExprNodeVisitorValueLimitedExpr visitor = new FilterSpecExprNodeVisitorValueLimitedExpr(); child.Accept(visitor); if (visitor.IsLimited) { valueExpressions.Add(child); } } // The or-node must have a single constituent and one or more value expressions if (orNode.ChildNodes.Length != valueExpressions.Count + 1) { return(null); } IList <ExprNode> constituents = new List <ExprNode>(orNode.ChildNodes); constituents.RemoveAll(valueExpressions); if (constituents.Count != 1) { throw new IllegalStateException("Found multiple constituents"); } ExprNode constituent = constituents[0]; FilterSpecPlanPathTripletForge triplet = MakeFilterParam( constituent, performConditionPlanning, taggedEventTypes, arrayEventTypes, allTagNamesOrdered, statementName, streamTypeService, raw, services); if (triplet == null) { return(null); } ExprNode controlConfirm = ExprNodeUtilityMake.ConnectExpressionsByLogicalOrWhenNeeded(valueExpressions); return(new FilterSpecPlanPathTripletForge(triplet.Param, controlConfirm)); }
internal static ExprNode DecomposePopulateConsolidate( FilterSpecParaForgeMap filterParamExprMap, bool performConditionPlanning, IList<ExprNode> validatedNodes, FilterSpecCompilerArgs args) { var constituents = DecomposeCheckAggregation(validatedNodes); // Remove constituents that are value-expressions ExprNode topLevelControl = null; if (performConditionPlanning) { IList<ExprNode> valueOnlyConstituents = null; foreach (var node in constituents) { var visitor = new FilterSpecExprNodeVisitorValueLimitedExpr(); node.Accept(visitor); if (visitor.IsLimited) { if (valueOnlyConstituents == null) { valueOnlyConstituents = new List<ExprNode>(); } valueOnlyConstituents.Add(node); } } if (valueOnlyConstituents != null) { constituents.RemoveAll(valueOnlyConstituents); topLevelControl = ExprNodeUtilityMake.ConnectExpressionsByLogicalAndWhenNeeded(valueOnlyConstituents); } } // Make filter parameter for each expression node, if it can be optimized foreach (var constituent in constituents) { var triplet = FilterSpecCompilerIndexPlannerConstituent.MakeFilterParam( constituent, performConditionPlanning, args.taggedEventTypes, args.arrayEventTypes, args.allTagNamesOrdered, args.statementRawInfo.StatementName, args.streamTypeService, args.statementRawInfo, args.compileTimeServices); filterParamExprMap.Put(constituent, triplet); // accepts null values as the expression may not be optimized } // Consolidate entries as possible, i.e. (a != 5 and a != 6) is (a not in (5,6)) // Removes duplicates for same property and same filter operator for filter service index optimizations FilterSpecCompilerConsolidateUtil.Consolidate(filterParamExprMap, args.statementRawInfo.StatementName); return topLevelControl; }
private static IList <ExprNode> GetNonValueChildNodes(ExprOrNode orNode) { IList <ExprNode> childNodes = new List <ExprNode>(orNode.ChildNodes.Length); foreach (var node in orNode.ChildNodes) { var visitor = new FilterSpecExprNodeVisitorValueLimitedExpr(); node.Accept(visitor); if (!visitor.IsLimited) { childNodes.Add(node); } } return(childNodes); }
private static void FindValueExpr( ExprNode child, ExprNode parent, AtomicReference<IList<ExprNodeWithParentPair>> pairsRef) { var valueVisitor = new FilterSpecExprNodeVisitorValueLimitedExpr(); child.Accept(valueVisitor); // not by itself a value expression, but itself it may decompose into some value expressions if (!valueVisitor.IsLimited) { FindValueExpressionsDeepRecursive(child, pairsRef); return; } // add value expression, don't traverse child IList<ExprNodeWithParentPair> pairs = pairsRef.Get(); if (pairs == null) { pairs = new List<ExprNodeWithParentPair>(2); pairsRef.Set(pairs); } pairs.Add(new ExprNodeWithParentPair(child, parent)); }
internal static bool IsLimitedValueExpression(ExprNode node) { var visitor = new FilterSpecExprNodeVisitorValueLimitedExpr(); node.Accept(visitor); return visitor.IsLimited; }