public static TResult Match <TResult>(
     this CombinationOperator @operator,
     Func <TResult> allPredicate,
     Func <TResult> anyPredicate)
 => @operator == CombinationOperator.All
         ? allPredicate()
         : anyPredicate();
Esempio n. 2
0
 public Selector(string field, CombinationOperator combinationOperator, object value)
 {
     this.Field         = field;
     this.CombinationOp = combinationOperator;
     this.Value         = value;
     ValidateCombinationOperator();
 }
 public static TResult Match <TResult>(
     this CombinationOperator @operator,
     TResult allResult,
     TResult anyResult)
 => @operator == CombinationOperator.All
         ? allResult
         : anyResult;
        private static Func <TItemToTest, bool> Combine <TItemToTest>(
            Func <TItemToTest, bool>[] innerResults,
            CombinationOperator @operator)
        {
            Func <TItemToTest, bool> AllReducer()
            => relatedItemCollection =>
            {
                for (var i = 0; i < innerResults.Length; i++)
                {
                    if (!innerResults[i](relatedItemCollection))
                    {
                        return(false);
                    }
                }

                return(true);
            };

            Func <TItemToTest, bool> AnyReducer()
            => relatedItemCollection =>
            {
                for (var i = 0; i < innerResults.Length; i++)
                {
                    if (innerResults[i](relatedItemCollection))
                    {
                        return(true);
                    }
                }

                return(false);
            };

            return(@operator.Match(AllReducer, AnyReducer));
        }
 internal CombinationFilterNode(IFilterNode <TFilter>[] nodes, CombinationOperator @operator, bool isCollapsed, IComparer <IFilterNode <TFilter> > comparer)
 {
     IsCollapsed = isCollapsed;
     Nodes       = nodes;
     Operator    = @operator;
     _nodesSet   = new SimpleLazy <HashSet <IFilterNode> >(() => new HashSet <IFilterNode>(nodes));
     _comparer   = comparer;
 }
 public static TResult Match <TSource, TResult>(
     this IEnumerable <TSource> source,
     Func <IEnumerable <TSource>, TResult> allReducer,
     Func <IEnumerable <TSource>, TResult> anyReducer,
     CombinationOperator @operator = default)
 => @operator.Match(
     () => allReducer(source),
     () => anyReducer(source));
Esempio n. 7
0
        internal static Func <TItemToTest, bool> Combine <TItemToTest>(
            IEnumerable <Func <TItemToTest, bool> > innerResults,
            CombinationOperator @operator)
        {
            Func <TItemToTest, bool> AllReducer()
            => relatedItemCollection => innerResults.All(comparator => comparator(relatedItemCollection));

            Func <TItemToTest, bool> AnyReducer()
            => relatedItemCollection => innerResults.Any(comparator => comparator(relatedItemCollection));

            return(@operator.Match(AllReducer, AnyReducer));
        }
        /// <summary>
        /// Combines the supplied <see cref="IFilterNode" />s into a <see cref="ICombinationFilterNode"/>,
        /// or returns the node if there is only a single one.
        /// </summary>
        /// <typeparam name="TFilter"></typeparam>
        public static IFilterNode <TFilter> Combine <TFilter>(
            this IEnumerable <IFilterNode <TFilter> > filterNodes,
            CombinationOperator @operator = default)
            where TFilter : IFilter
        {
            var filterNodesArray = filterNodes.ToArray();

            // Use the internal constructor for CombinationFilterNode to save calling ToArray again on filterNodes,
            // which is done in the public constructors.
            return(filterNodesArray.Length == 1
                ? filterNodesArray[0]
                : new CombinationFilterNode <TFilter>(filterNodesArray, @operator, isCollapsed: false, comparer: null));
        }
Esempio n. 9
0
        public IPredication Instantiate(IEnumerable <IPredication> predications, CombinationOperator combinationOperator)
        {
            switch (combinationOperator)
            {
            case CombinationOperator.Or:
                return(new OrCombinationPredication(predications));

            case CombinationOperator.XOr:
                return(new XOrCombinationPredication(predications));

            case CombinationOperator.And:
                return(new AndCombinationPredication(predications));

            default:
                throw new ArgumentOutOfRangeException(nameof(combinationOperator));
            }
        }
        public void Collapse_ShouldAbsorbRedundantNestedCombinations(CombinationOperator outerCombinationOperator, CombinationOperator alternateInnerCombinationOperator)
        {
            var filterA = new CharFilter('A');
            var filterB = new CharFilter('B');
            var filterC = new CharFilter('C');
            var filterD = new CharFilter('D');
            var filterE = new CharFilter('E');
            var filterF = new CharFilter('F');
            var filterG = new CharFilter('G');
            var filterH = new CharFilter('H');

            var innerCombinationFilterToFlatten = new CombinationFilterNode <CharFilter>(new[] { filterA, filterB }, outerCombinationOperator);
            var innerCombinationFilterToRetain  = new CombinationFilterNode <CharFilter>(new[] { filterC, filterD }, alternateInnerCombinationOperator);
            var innerCombinationFilterToAbsorb  = new CombinationFilterNode <CharFilter>(new[] { filterA, filterE }, alternateInnerCombinationOperator);

            var outerCombinationFilter = new CombinationFilterNode <CharFilter>(new IFilterNode <CharFilter>[]
            {
                innerCombinationFilterToFlatten,
                innerCombinationFilterToRetain,
                innerCombinationFilterToAbsorb,
                filterG.ToLeafFilterNode(),
                filterH.ToLeafFilterNode()
            }, outerCombinationOperator);

            var collapsedFilter = outerCombinationFilter.Collapse();

            var expectedCollapsedFilter = new CombinationFilterNode <CharFilter>(new IFilterNode <CharFilter>[]
            {
                filterA.ToLeafFilterNode(),
                filterB.ToLeafFilterNode(),
                innerCombinationFilterToRetain,
                filterG.ToLeafFilterNode(),
                filterH.ToLeafFilterNode(),
            }, outerCombinationOperator);

            Assert.Equal(expectedCollapsedFilter, collapsedFilter);

            // Also check IsEquivalentTo works, which internally uses Collapse.
            Assert.True(collapsedFilter.IsEquivalentTo(outerCombinationFilter));
            Assert.True(outerCombinationFilter.IsEquivalentTo(collapsedFilter));
        }
        public void Collapse_ShouldFlattenNestedCombinations_WhenInnerOperatorMatchesOuter(CombinationOperator outerCombinationOperator, CombinationOperator alternateInnerCombinationOperator)
        {
            var filterA = new CharFilter('A');
            var filterB = new CharFilter('B');
            var filterC = new CharFilter('C');
            var filterD = new CharFilter('D');
            var filterE = new CharFilter('E');
            var filterF = new CharFilter('F');
            var filterG = new CharFilter('G');
            var filterH = new CharFilter('H');

            var innerCombinationFilterToFlatten = new CombinationFilterNode <CharFilter>(new [] { filterA, filterB }, outerCombinationOperator);
            var innerCombinationFilterToRetain1 = new CombinationFilterNode <CharFilter>(new [] { filterC, filterD }, alternateInnerCombinationOperator);
            var innerCombinationFilterToRetain2 = new CombinationFilterNode <CharFilter>(new[] { filterE, filterF }, alternateInnerCombinationOperator);

            // When outer operator == All and other == Any, this is equivalent to
            // (A AND B) AND (C OR D) AND (E OR F) AND G AND H
            // Which can be collapsed to: A AND B AND G AND H AND (C OR D) AND (E OR F)
            // When outer operator == Any and other == All, this is equivalent to
            // (A OR B) OR (C AND D) OR (E AND F) OR G OR H
            // Which can be collapsed to: A OR B OR G OR H OR (C AND D) OR (E AND F)
            var outerCombinationFilter = new CombinationFilterNode <CharFilter>(new IFilterNode <CharFilter>[]
            {
                innerCombinationFilterToFlatten,
                innerCombinationFilterToRetain1,
                innerCombinationFilterToRetain2,
                filterG.ToLeafFilterNode(),
                filterH.ToLeafFilterNode()
            }, outerCombinationOperator);

            var collapsedFilter = outerCombinationFilter.Collapse();

            var expectedCollapsedFilter = new CombinationFilterNode <CharFilter>(new IFilterNode <CharFilter>[]
            {
                filterA.ToLeafFilterNode(),
                filterB.ToLeafFilterNode(),
                innerCombinationFilterToRetain1,
                innerCombinationFilterToRetain2,
                filterG.ToLeafFilterNode(),
                filterH.ToLeafFilterNode(),
            }, outerCombinationOperator);

            Assert.Equal(expectedCollapsedFilter, collapsedFilter);

            // Also check IsEquivalentTo works, which internally uses Collapse.
            Assert.True(collapsedFilter.IsEquivalentTo(outerCombinationFilter));
            Assert.True(outerCombinationFilter.IsEquivalentTo(collapsedFilter));
        }
Esempio n. 12
0
 public CombinationFilter(IImmutableSet <IFilterNode <TLeafNode> > filters, CombinationOperator @operator = default)
     : base(filters, @operator)
 {
     _filters = filters;
 }
 public CombinationFilterNode(IEnumerable <TFilter> filters, CombinationOperator @operator = default)
     : this(filters.Select(f => f.ToLeafFilterNode()), @operator, isCollapsed : false, comparer : null)
 {
 }
Esempio n. 14
0
        public BasePredicateFilter Instantiate(IEnumerable <IColumnAlias> aliases, IEnumerable <IColumnExpression> expressions, CombinationOperator combinationOperator, IEnumerable <IPredicateInfo> predicateInfos)
        {
            var predications = new List <Predication>();

            var factory = new PredicateFactory();

            foreach (var predicateInfo in predicateInfos)
            {
                if (string.IsNullOrEmpty(predicateInfo.Operand))
                {
                    throw new ArgumentException("You must specify an operand for a predicate. The operand is the column or alias or expression on which the predicate will be evaluated.");
                }

                var predicate = factory.Instantiate(predicateInfo);
                predications.Add(new Predication(predicate, predicateInfo.Operand));
            }

            switch (combinationOperator)
            {
            case CombinationOperator.Or:
                return(new OrCombinationPredicateFilter(aliases, expressions, predications));

            case CombinationOperator.XOr:
                return(new XOrCombinationPredicateFilter(aliases, expressions, predications));

            case CombinationOperator.And:
                return(new AndCombinationPredicateFilter(aliases, expressions, predications));

            default:
                throw new ArgumentOutOfRangeException(nameof(combinationOperator));
            }
        }
Esempio n. 15
0
 public OrderedCombinationFilter(IReadOnlyList <IFilterNode <TLeafNode> > filters, CombinationOperator @operator = default)
     : base(filters, @operator)
 {
 }
Esempio n. 16
0
 public OrderedCombinationFilter(IEnumerable <IFilterNode <TLeafNode> > filters, CombinationOperator @operator = default)
     : this(filters.ToList(), @operator)
 {
 }
Esempio n. 17
0
 public FindBuilder AddSelector(string field, CombinationOperator combinationOperator, object value)
 {
     this.selectors.Add(new Selector(field, combinationOperator, value));
     return(this);
 }
 /// <summary>
 /// Combines the supplied <see cref="IFilterNode" />s into a <see cref="ICombinationFilterNode"/>,
 /// or returns the node if there is only a single one.
 /// </summary>
 /// <typeparam name="TFilter"></typeparam>
 public static IFilterNode <TFilter> Combine <TFilter>(
     this IEnumerable <TFilter> filters,
     CombinationOperator @operator = default)
     where TFilter : IFilter
 => filters.Select(filter => filter.ToLeafFilterNode()).Combine(@operator);
Esempio n. 19
0
 protected CombinationFilterBase(IReadOnlyCollection <IFilterNode <TLeafNode> > filters, CombinationOperator @operator = default)
     : base(filters, @operator)
 {
     Filters = filters;
 }
 internal CombinationFilterNode(IEnumerable <IFilterNode <TFilter> > nodes, CombinationOperator @operator, bool isCollapsed, IComparer <IFilterNode <TFilter> > comparer)
     : this(nodes.ToArray(), @operator, isCollapsed, comparer)
 {
 }
 public CombinationFilterNode(IEnumerable <IFilterNode <TFilter> > nodes, CombinationOperator @operator = default)
     : this(nodes, @operator, isCollapsed : false, comparer : null)
 {
 }
Esempio n. 22
0
 public CombinationFilter(IEnumerable <IFilterNode <TLeafNode> > filters, CombinationOperator @operator = default)
     : this(filters.ToImmutableHashSet(), @operator)
 {
 }