Exemplo n.º 1
0
        public void Test1()
        {
            var parser         = new FiltersParser();
            var fastCollection = new FastCollection <TestClassA>();
            var parsed         = parser.ParsePredicate((TestClassA x) => x.F1 > 3, OperationTargetBuilder.BuildForRoot(fastCollection));

            Assert.IsAssignableFrom <ComparisonFilter>(parsed);
            Assert.AreEqual(ComparisonFilterType.Greater, ((ComparisonFilter)parsed).ComparisonFilterType);
            Assert.AreEqual(3, ((ComparisonFilter)parsed).Value);
            Assert.AreSame(fastCollection, ((ComparisonFilter)parsed).OperationTarget.RootFastCollection);
        }
Exemplo n.º 2
0
        public void Test2()
        {
            // Embedded in predicate fast collection. Not in current version
            var parser         = new FiltersParser();
            var fastCollection = new FastCollection <TestClassA>();
            //var parsed = parser.ParsePredicate((TestClassA x) => fastCollection.Where(y => y.F1 > 4).Select(y => y.F1).Contains(x.F1), OperationTargetBuilder.BuildForRoot(fastCollection));
//            Assert.IsAssignableFrom<ComparisonFilter>(parsed);
//            Assert.AreEqual(ComparisonFilterType.Greater, ((ComparisonFilter)parsed).ComparisonFilterType);
//            Assert.AreEqual(3, ((ComparisonFilter)parsed).Value);
//            Assert.AreSame(fastCollection, ((ComparisonFilter)parsed).OperationTarget.RootFastCollection);
        }
Exemplo n.º 3
0
        public void AndCompoundTest()
        {
            var parser         = new FiltersParser();
            var fastCollection = new FastCollection <TestClassA>();
            var parsed         = parser.ParsePredicate((TestClassA x) => (x.F1 > 3) && (x.F1 <= 10), OperationTargetBuilder.BuildForRoot(fastCollection));

            Assert.IsAssignableFrom <CompoundFilter>(parsed);
            Assert.AreEqual(CompoundFilter.CompoundFilterType.And, ((CompoundFilter)parsed).OperationType);

            var filter1 = (ComparisonFilter)((CompoundFilter)parsed).Operands.ElementAt(0);

            Assert.AreEqual(ComparisonFilterType.Greater, filter1.ComparisonFilterType);
            Assert.AreEqual(3, filter1.Value);

            var filter2 = (ComparisonFilter)((CompoundFilter)parsed).Operands.ElementAt(1);

            Assert.AreEqual(ComparisonFilterType.LessOrEqual, filter2.ComparisonFilterType);
            Assert.AreEqual(10, filter2.Value);
        }
Exemplo n.º 4
0
        public static IFastCollectionEnumerable <TSource> Where <TSource>(
            [NotNull] this IFastCollectionEnumerable <TSource> source,
            [NotNull] Expression <Func <TSource, bool> > predicate)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }
            if (predicate == null)
            {
                throw new ArgumentNullException(nameof(predicate));
            }

            var sourceIterator = source.ExtractIterator();

            var filter                  = new FiltersParser().ParsePredicate(predicate, sourceIterator.OperationTarget);
            var filtersExecutor         = new FiltersExecutor();
            var preparedFilterExecution = filtersExecutor.PrepareExecution(filter, sourceIterator.SourceCollection.IndicesCoverage);

            if (preparedFilterExecution.CanBeExecuted)
            {
                // We can use indices for execution
                return(new FastCollectionLazyIterator <TSource>(
                           sourceIterator.SourceCollection,
                           sourceIterator.OperationTarget,
                           () =>
                {
                    // This lambda will be called on items demand
                    var cuttedIds = new HashSet <int>(preparedFilterExecution.ExecuteAction());
                    return sourceIterator.ItemsEnumerable.Where(x => cuttedIds.Contains(x.Id));
                }));
            }
            else
            {
                // In this case we can't use indices for execution and we have to check each item
                var compiledPredicate  = predicate.Compile();
                var newItemsEnumerable = sourceIterator.ItemsEnumerable.Where(x => compiledPredicate(x.Data));

                var fastCollectionWhereEnumerable = new FastCollectionIterator <TSource>(sourceIterator.SourceCollection, sourceIterator.OperationTarget, newItemsEnumerable);
                return(fastCollectionWhereEnumerable);
            }
        }