예제 #1
0
        public static FilterSpecPlanPathForge SortRemoveDups(FilterSpecPlanPathForge parameters)
        {
            if (parameters.Triplets.Length <= 1) {
                return parameters;
            }

            var map = new OrderedListDictionary<FilterOperator, IList<FilterSpecPlanPathTripletForge>>(COMPARATOR_PARAMETERS);

            foreach (FilterSpecPlanPathTripletForge parameter in parameters.Triplets) {
                if (!map.TryGetValue(parameter.Param.FilterOperator, out var list)) {
                    list = new List<FilterSpecPlanPathTripletForge>();
                    map[parameter.Param.FilterOperator] = list;
                }

                var hasDuplicate = list.Any(existing => Equals(existing.Param.Lookupable, parameter.Param.Lookupable));
                if (hasDuplicate) {
                    continue;
                }

                list.Add(parameter);
            }

            var result = new List<FilterSpecPlanPathTripletForge>();
            foreach (var entry in map) {
                result.AddAll(entry.Value);
            }

            return new FilterSpecPlanPathForge(
                result.ToArray(),
                parameters.PathNegate);
        }
예제 #2
0
 private static FilterSpecPlanForge BuildNoPlan(
     IList<ExprNode> validatedNodes,
     FilterSpecCompilerArgs args)
 {
     var triplet = MakeRemainingNode(validatedNodes, args);
     FilterSpecPlanPathTripletForge[] triplets = {triplet};
     var path = new FilterSpecPlanPathForge(triplets, null);
     FilterSpecPlanPathForge[] paths = {path};
     return new FilterSpecPlanForge(paths, null, null, null);
 }
        internal static FilterSpecPlanForge PlanRemainingNodesBasic(
            FilterSpecParaForgeMap overallExpressions,
            FilterSpecCompilerArgs args,
            int filterServiceMaxFilterWidth)
        {
            var unassigned = overallExpressions.UnassignedExpressions;
            IList<ExprOrNode> orNodes = new List<ExprOrNode>(unassigned.Count);

            foreach (var node in unassigned) {
                if (node is ExprOrNode) {
                    orNodes.Add((ExprOrNode) node);
                }
            }

            var expressionsWithoutOr = new FilterSpecParaForgeMap();
            expressionsWithoutOr.Add(overallExpressions);

            // first dimension: or-node index
            // second dimension: or child node index
            var orNodesMaps = new FilterSpecParaForgeMap[orNodes.Count][];
            var countOr = 0;
            var sizeFactorized = 1;
            var sizePerOr = new int[orNodes.Count];
            foreach (var orNode in orNodes) {
                expressionsWithoutOr.RemoveNode(orNode);
                orNodesMaps[countOr] = new FilterSpecParaForgeMap[orNode.ChildNodes.Length];
                var len = orNode.ChildNodes.Length;

                for (var i = 0; i < len; i++) {
                    var map = new FilterSpecParaForgeMap();
                    orNodesMaps[countOr][i] = map;
                    var nodes = Collections.SingletonList(orNode.ChildNodes[i]);
                    DecomposePopulateConsolidate(map, false, nodes, args);
                }

                sizePerOr[countOr] = len;
                sizeFactorized = sizeFactorized * len;
                countOr++;
            }

            // we become too large
            if (sizeFactorized > filterServiceMaxFilterWidth) {
                return null;
            }

            // combine
            var result = new FilterSpecPlanPathForge[sizeFactorized];
            var count = 0;
            foreach (var permutation in CombinationEnumeration.FromZeroBasedRanges(sizePerOr)) {
                result[count] = ComputePermutation(expressionsWithoutOr, permutation, orNodesMaps, args);
                count++;
            }

            return new FilterSpecPlanForge(result, null, null, null);
        }
예제 #4
0
        public bool EqualsFilter(FilterSpecPlanPathForge other)
        {
            if (Triplets.Length != other.Triplets.Length) {
                return false;
            }

            for (var i = 0; i < Triplets.Length; i++) {
                var mytriplet = Triplets[i];
                var othertriplet = other.Triplets[i];
                if (!mytriplet.EqualsFilter(othertriplet)) {
                    return false;
                }
            }

            if (!ExprNodeUtilityCompare.DeepEqualsNullChecked(PathNegate, other.PathNegate, true)) {
                return false;
            }

            return true;
        }