예제 #1
0
        public void CombineWithEmptyListReturnsEmptyOr()
        {
            var criteria = OrCriteria.Combine(new ICriteria[] { });

            Assert.IsType <OrCriteria>(criteria);
            Assert.Empty(((OrCriteria)criteria).Criteria);
        }
예제 #2
0
    public static void CriteriaPatternDemo()
    {
        Person p1 = new Person("Aykut", 24, Gender.MALE);
        Person p2 = new Person("Yilmaz", 55, Gender.MALE);
        Person p3 = new Person("Esra", 50, Gender.FEMALE);
        Person p4 = new Person("Zeynep", 12, Gender.FEMALE);

        List <Person> family = new List <Person>()
        {
            p1, p2, p3, p4
        };

        ICriteria <Person> maleCriteria   = new MaleCriteria();
        ICriteria <Person> femaleCriteria = new FemaleCriteria();
        ICriteria <Person> teenCriteria   = new TeenCriteria();

        var males   = maleCriteria.Filter(family).ToList();
        var females = femaleCriteria.Filter(family).ToList();
        var teens   = teenCriteria.Filter(family).ToList();

        ICriteria <Person> maleAndTeenCriteria = new AndCriteria(maleCriteria, teenCriteria);
        var teenMales = maleAndTeenCriteria.Filter(family);

        ICriteria <Person> femaleAndTeenCriteria = new AndCriteria(femaleCriteria, teenCriteria);
        var teenFemales = femaleAndTeenCriteria.Filter(family);

        ICriteria <Person> maleOrTeenCriteria = new OrCriteria(maleCriteria, teenCriteria);
        var malesOrTeens = maleOrTeenCriteria.Filter(family);
    }
예제 #3
0
        public void CombineWithSingleCriteriaReturnsThatCriteria()
        {
            var rangeCriteria = new RangeCriteria("field", memberInfo, RangeComparison.LessThan, 1);
            var andCriteria   = OrCriteria.Combine(rangeCriteria);

            Assert.Same(rangeCriteria, andCriteria);
        }
예제 #4
0
        public void Setup()
        {
            var mockControlRepository = new MockControlRepository();
            _controlCollection = mockControlRepository.GetControlCollection();

            _coreCompetenceOnlyAudiologyCriteria =
                new CoreCompetenceCriteria(new[] {CoreCompetenceRole.Audiology});
            _coreCompetenceAudiologyOrDevEngCriteria =
                new CoreCompetenceCriteria(new[] {CoreCompetenceRole.Audiology, CoreCompetenceRole.DeviceEngineering,});

            _reviewCompetenceOnlyFirmwareCriteria =
                new ReviewCompetenceCriteria(new[] {ReviewCompetenceRole.FirmwareQa});

            _coreStateUnworkedOrResetCriteria =
                new CoreStateCriteria(new[] {CoreState.Unworked, CoreState.Reset});

            _reviewStateReleaseCandidateOrReleasedCriteria =
                new ReviewStateCriteria(new[] {ReviewState.ReleaseCandidate, ReviewState.Released,});

            _complexOrCriteria =
                new OrCriteria<ControlBase>(_coreCompetenceAudiologyOrDevEngCriteria,
                    _reviewCompetenceOnlyFirmwareCriteria);
            _complexAndCriteria =
                new AndCriteria<ControlBase>(new NotCriteria<ControlBase>(_coreStateUnworkedOrResetCriteria),
                    _reviewStateReleaseCandidateOrReleasedCriteria);
        }
예제 #5
0
        private void btFilterPattern_Click(object sender, EventArgs e)
        {
            string        str     = "";
            List <Person> persons = new List <Person>();

            persons.Add(new Person("Robert", "Male", "Single"));
            persons.Add(new Person("John", "Male", "Married"));
            persons.Add(new Person("Laura", "Female", "Married"));
            persons.Add(new Person("Diana", "Female", "Single"));
            persons.Add(new Person("Mike", "Male", "Single"));
            persons.Add(new Person("Bobby", "Male", "Single"));

            ICriteria male           = new CriteriaMale();
            ICriteria female         = new CriteriaFemale();
            ICriteria single         = new CriteriaSingle();
            ICriteria singleMale     = new AndCriteria(single, male);
            ICriteria singleOrFemale = new OrCriteria(single, female);

            str += "Males:\r\n ";
            str += printPersons(male.meetCriteria(persons)) + "\r\n";

            str += "Females:\r\n ";
            str += printPersons(female.meetCriteria(persons)) + "\r\n";

            str += "Single Males:\r\n ";
            str += printPersons(singleMale.meetCriteria(persons)) + "\r\n";

            str += "Single Or Females:\r\n ";
            str += printPersons(singleOrFemale.meetCriteria(persons)) + "\r\n";
            tbOutWindow.Text = str;
        }
예제 #6
0
        public static void Start()
        {
            List <Person> persons = new List <Person>();

            persons.Add(new Person("Robert", "Male", "Single"));
            persons.Add(new Person("John", "Male", "Married"));
            persons.Add(new Person("Laura", "Female", "Married"));
            persons.Add(new Person("Diana", "Female", "Single"));
            persons.Add(new Person("Mike", "Male", "Single"));
            persons.Add(new Person("Bobby", "Male", "Single"));

            Criteria male           = new CriteriaMale();
            Criteria female         = new CriteriaFemale();
            Criteria single         = new CriteriaSingle();
            Criteria singleMale     = new AndCriteria(single, male);
            Criteria singleOrFemale = new OrCriteria(single, female);

            Console.WriteLine("Males: ");
            PrintPersons(male.MeetCriteria(persons));

            Console.WriteLine("\nFemales: ");
            PrintPersons(female.MeetCriteria(persons));

            Console.WriteLine("\nSingle Males: ");
            PrintPersons(singleMale.MeetCriteria(persons));

            Console.WriteLine("\nSingle Or Females: ");
            PrintPersons(singleOrFemale.MeetCriteria(persons));
        }
예제 #7
0
        public void ConstructorSetsCriteria()
        {
            var criteria = new OrCriteria(salutationMr, area408);

            Assert.Contains(salutationMr, criteria.Criteria);
            Assert.Contains(area408, criteria.Criteria);
            Assert.Equal(2, criteria.Criteria.Count);
        }
예제 #8
0
        public static void OrCriteriaSample()
        {
            ICriteria        cr  = new OrCriteria(new[] { ICriteria.Empty, ICriteria.Empty });
            FormatedCriteria fCr = cr.Format(0);

            Console.WriteLine(fCr.Query);
            Console.WriteLine(fCr.Params.Length);
        }
예제 #9
0
        public void OrWithOrWithTrueOptimizesToTrue()
        {
            var exists1  = new ExistsCriteria("1");
            var exists2  = new ExistsCriteria("2");
            var criteria = OrCriteria.Combine(exists1, OrCriteria.Combine(ConstantCriteria.True, exists2));

            var actual = ConstantCriteriaFilterReducer.Reduce(criteria);

            Assert.Same(ConstantCriteria.True, actual);
        }
예제 #10
0
 /// <summary>
 /// 或连接,将传入的查询条件合并到当前对象
 /// </summary>
 /// <param name="predicate">谓词</param>
 public IQuery <TEntity, TKey> Or(Expression <Func <TEntity, bool> > predicate)
 {
     if (Criteria == null)
     {
         Criteria = new Criteria <TEntity>(predicate);
         return(this);
     }
     Criteria = new OrCriteria <TEntity>(Criteria.GetPredicate(), predicate);
     return(this);
 }
예제 #11
0
        public void ToStringContainsSubfields()
        {
            var existsCriteria = new ExistsCriteria("thisIsAMissingField");
            var termCriteria   = TermsCriteria.Build("termField", memberInfo, "some value");

            var orCriteria = OrCriteria.Combine(existsCriteria, termCriteria);
            var result     = orCriteria.ToString();

            Assert.Contains(existsCriteria.ToString(), result);
            Assert.Contains(termCriteria.ToString(), result);
        }
예제 #12
0
        public void NotWithOrBecomesBoolWithMustNot()
        {
            ICriteria[] expected = { new RangeCriteria("fieldOne", memberInfo, RangeComparison.LessThan, 2), new RangeCriteria("fieldTwo", memberInfo, RangeComparison.GreaterThan, 4) };

            var actual = QueryCriteriaRewriter.Compensate(NotCriteria.Create(OrCriteria.Combine(expected)));

            var boolActual = Assert.IsType <BoolCriteria>(actual);

            Assert.Equal(boolActual.MustNot.AsEnumerable(), expected);
            Assert.Empty(boolActual.Should);
            Assert.Empty(boolActual.Must);
        }
예제 #13
0
        public void CombineWithDifferTermCriteriaFieldsDoesNotCombine()
        {
            var criteria = OrCriteria.Combine(salutationMr, salutationMrs, area408);

            Assert.IsType <OrCriteria>(criteria);
            var orCriteria = (OrCriteria)criteria;

            Assert.Contains(salutationMr, orCriteria.Criteria);
            Assert.Contains(salutationMrs, orCriteria.Criteria);
            Assert.Contains(area408, orCriteria.Criteria);
            Assert.Equal(3, orCriteria.Criteria.Count);
        }
예제 #14
0
        public void CombineWithAllTermFieldsSame_OrIncompatibleExecutionMode_ReturnsOrCriteria(TermsExecutionMode executionMode)
        {
            var salutationMs = TermsCriteria.Build(executionMode, "salutation", memberInfo, "Miss", "Ms");
            var criteria     = OrCriteria.Combine(salutationMr, salutationMrs, salutationMs);

            var orCriteria = Assert.IsType <OrCriteria>(criteria);

            Assert.Contains(salutationMr, orCriteria.Criteria);
            Assert.Contains(salutationMrs, orCriteria.Criteria);
            Assert.Contains(salutationMs, orCriteria.Criteria);
            Assert.Equal(3, orCriteria.Criteria.Count);
        }
        public void AndWithOrsBecomesBoolWithShould()
        {
            var expected1 = new[] { new RangeCriteria("field1", memberInfo, RangeComparison.LessThan, 2), new RangeCriteria("field2", memberInfo, RangeComparison.GreaterThan, 4) };
            var expected2 = new[] { new RangeCriteria("field3", memberInfo, RangeComparison.LessThan, 2), new RangeCriteria("field4", memberInfo, RangeComparison.GreaterThan, 4) };

            var actual = QueryCriteriaRewriter.Compensate(AndCriteria.Combine(OrCriteria.Combine(expected1), OrCriteria.Combine(expected2)));

            var boolActual = Assert.IsType <BoolCriteria>(actual);

            Assert.Equal(boolActual.Should.AsEnumerable(), expected1.Concat(expected2));
            Assert.Empty(boolActual.Must);
            Assert.Empty(boolActual.MustNot);
        }
예제 #16
0
        public void AndWithMixedContentBecomesBoolWithShouldMustAndMustNot()
        {
            ICriteria[] expectedShould  = { new RangeCriteria("field1", memberInfo, RangeComparison.LessThan, 2), new RangeCriteria("field2", memberInfo, RangeComparison.GreaterThan, 4) };
            var         expectedMust    = new RangeCriteria("field3", memberInfo, RangeComparison.LessThan, 2);
            var         expectedMustNot = new PrefixCriteria("field5", "prefix");

            var actual = QueryCriteriaRewriter.Compensate(AndCriteria.Combine(OrCriteria.Combine(expectedShould), expectedMust, NotCriteria.Create(expectedMustNot)));

            var boolActual = Assert.IsType <BoolCriteria>(actual);

            Assert.Equal(boolActual.Should.AsEnumerable(), expectedShould);
            Assert.Single(boolActual.Must, expectedMust);
            Assert.Single(boolActual.MustNot, expectedMustNot);
        }
예제 #17
0
        public void OrWithFalseRemovesFalse()
        {
            var exists1  = new ExistsCriteria("1");
            var exists2  = new ExistsCriteria("2");
            var criteria = OrCriteria.Combine(exists1, ConstantCriteria.False, exists2);

            var actual = ConstantCriteriaFilterReducer.Reduce(criteria);

            var orActual = Assert.IsType <OrCriteria>(actual);

            Assert.DoesNotContain(orActual.Criteria, c => c == ConstantCriteria.False);
            Assert.Single(orActual.Criteria, exists1);
            Assert.Single(orActual.Criteria, exists2);
        }
예제 #18
0
        public void BodyContainsFilterSingleCollapsedOr()
        {
            const string expectedFieldName = "fieldShouldExist";
            var          existsCriteria    = new ExistsCriteria(expectedFieldName);
            var          orCriteria        = OrCriteria.Combine(existsCriteria);

            var formatter = new PostBodyRequestFormatter(defaultConnection, mapping, new ElasticSearchRequest {
                Type = "type1", Filter = orCriteria
            });
            var body = JObject.Parse(formatter.Body);

            var field = TraverseWithAssert(body, "filter", "exists", "field");

            Assert.Equal(expectedFieldName, field);
        }
        public void BodyContainsExistsFieldSingleCollapsedOr()
        {
            const string expectedFieldName = "fieldShouldExist";
            var          existsCriteria    = new ExistsCriteria(expectedFieldName);
            var          orCriteria        = OrCriteria.Combine(existsCriteria);

            var formatter = new SearchRequestFormatter(defaultConnection, mapping, new SearchRequest {
                IndexType = "type1", Query = orCriteria
            });
            var body = JObject.Parse(formatter.Body);

            var field = body.TraverseWithAssert("query", "exists", "field");

            Assert.Equal(expectedFieldName, field);
        }
예제 #20
0
        public void CombineWithAllTermFieldsSame_OrCompatibleExecutionMode_CombinesIntoSingleTerm(TermsExecutionMode?executionMode)
        {
            var salutationMs = TermsCriteria.Build(executionMode, "salutation", memberInfo, "Miss", "Ms");
            var criteria     = OrCriteria.Combine(salutationMr, salutationMrs, salutationMs);

            var termsCriteria = Assert.IsType <TermsCriteria>(criteria);

            Assert.Equal(salutationMr.Field, termsCriteria.Field);
            Assert.Same(memberInfo, termsCriteria.Member);

            var allValues = salutationMr.Values.Concat(salutationMrs.Values).Concat(salutationMs.Values).Distinct().ToArray();

            foreach (var value in allValues)
            {
                Assert.Contains(value, termsCriteria.Values);
            }

            Assert.Equal(allValues.Length, termsCriteria.Values.Count);
        }
예제 #21
0
        public void BodyContainsFilterOr()
        {
            var minCriteria = new RangeCriteria("minField", memberInfo, RangeComparison.GreaterThanOrEqual, 100);
            var maxCriteria = new RangeCriteria("maxField", memberInfo, RangeComparison.LessThan, 32768);
            var orCriteria  = OrCriteria.Combine(minCriteria, maxCriteria);

            var formatter = new PostBodyRequestFormatter(defaultConnection, mapping, new ElasticSearchRequest {
                Type = "type1", Filter = orCriteria
            });
            var body = JObject.Parse(formatter.Body);

            var result = TraverseWithAssert(body, "filter", "or");

            Assert.Equal(2, result.Children().Count());
            foreach (var child in result)
            {
                Assert.True(((JProperty)(child.First)).Name == "range");
            }
        }
        public void BodyContainsBoolShould()
        {
            var minCriteria = new RangeCriteria("minField", memberInfo, RangeComparison.GreaterThanOrEqual, 100);
            var maxCriteria = new RangeCriteria("maxField", memberInfo, RangeComparison.LessThan, 32768);
            var orCriteria  = OrCriteria.Combine(minCriteria, maxCriteria);

            var formatter = new SearchRequestFormatter(defaultConnection, mapping, new SearchRequest {
                IndexType = "type1", Query = orCriteria
            });
            var body = JObject.Parse(formatter.Body);

            var result = body.TraverseWithAssert("query", "bool", "should");

            Assert.Equal(2, result.Children().Count());
            foreach (var child in result)
            {
                Assert.True(((JProperty)(child.First)).Name == "range");
            }
        }
예제 #23
0
        Expression VisitEnumerableContainsMethodCall(Expression source, Expression match)
        {
            var matched = Visit(match);

            // Where(x => constantsList.Contains(x.Property))
            if (source is ConstantExpression && matched is MemberExpression)
            {
                var memberExpression = (MemberExpression)matched;
                if (Mapping.TryGetFieldName(SourceType, memberExpression, out string field))
                {
                    var containsSource = ((IEnumerable)((ConstantExpression)source).Value);

                    // If criteria contains a null create an Or criteria with Terms on one
                    // side and Missing on the other.
                    var values        = containsSource.Cast <object>().Distinct().ToList();
                    var nonNullValues = values.Where(v => v != null).ToList();

                    ICriteria criteria = TermsCriteria.Build(field, memberExpression.Member, nonNullValues);
                    if (values.Count != nonNullValues.Count)
                    {
                        criteria = OrCriteria.Combine(criteria, new MissingCriteria(field));
                    }

                    return(new CriteriaExpression(criteria));
                }
            }

            // Where(x => x.SomeList.Contains(constantValue))
            if (source is MemberExpression && matched is ConstantExpression)
            {
                var memberExpression = (MemberExpression)source;
                if (Mapping.TryGetFieldName(SourceType, memberExpression, out string field))
                {
                    var value = ((ConstantExpression)matched).Value;
                    return(new CriteriaExpression(TermsCriteria.Build(field, memberExpression.Member, value)));
                }
            }

            throw new NotSupportedException(source is MemberExpression
                ? $"Match '{match}' in Contains operation must be a constant"
                : $"Unknown source '{source}' for Contains operation");
        }
예제 #24
0
    public void Main()
    {
        List <Person> persons = new List <Person>();

        persons.Add(new Person("Robert", "Male", "Single"));
        persons.Add(new Person("John", "Male", "Married"));
        persons.Add(new Person("Laura", "Female", "Married"));
        persons.Add(new Person("Diana", "Female", "Single"));
        persons.Add(new Person("Mike", "Male", "Single"));
        persons.Add(new Person("Bobby", "Male", "Single"));

        ICriteria male           = new CriteriaMale();
        ICriteria female         = new CriteriaFemale();
        ICriteria single         = new CriteriaSingle();
        ICriteria singleMale     = new AndCriteria(single, male);
        ICriteria singleOrFemale = new OrCriteria(single, female);


        PrintPersons(male.MeetCriteria(persons));
        PrintPersons(female.MeetCriteria(persons));
        PrintPersons(single.MeetCriteria(persons));
        PrintPersons(singleMale.MeetCriteria(persons));
        PrintPersons(singleOrFemale.MeetCriteria(persons));
    }
예제 #25
0
        public void AndWithNestedOrsBecomesBoolWithMustAndNestedShould()
        {
            ICriteria[] expected1 = { new RangeCriteria("field1", memberInfo, RangeComparison.LessThan, 2), new RangeCriteria("field2", memberInfo, RangeComparison.GreaterThan, 4) };
            ICriteria[] expected2 = { new RangeCriteria("field3", memberInfo, RangeComparison.LessThan, 2), new RangeCriteria("field4", memberInfo, RangeComparison.GreaterThan, 4) };

            var actual = QueryCriteriaRewriter.Compensate(AndCriteria.Combine(OrCriteria.Combine(expected1), OrCriteria.Combine(expected2)));

            var boolActual = Assert.IsType <BoolCriteria>(actual);

            Assert.Empty(boolActual.Should);
            Assert.Empty(boolActual.MustNot);
            Assert.Equal(2, boolActual.Must.Count);
            Assert.All(boolActual.Must, c =>
            {
                var boolSub = Assert.IsType <BoolCriteria>(c);
                Assert.Empty(boolSub.Must);
                Assert.Empty(boolSub.MustNot);
                Assert.Equal(2, boolSub.Should.Count);
                Assert.All(boolSub.Should, s =>
                {
                    Assert.IsType <RangeCriteria>(s);
                });
            });
        }
예제 #26
0
        private Expression VisitOrElse(BinaryExpression b)
        {
            var criteria = AssertExpressionsOfType <CriteriaExpression>(b.Left, b.Right).Select(f => f.Criteria).ToArray();

            return(new CriteriaExpression(OrCriteria.Combine(criteria)));
        }
예제 #27
0
        public void CombineWithEmptyListReturnsNull()
        {
            var criteria = OrCriteria.Combine(new ICriteria[] { });

            Assert.Null(criteria);
        }
예제 #28
0
 public void CombineThrowArgumentNullExceptionWhenCriteriaIsNull()
 {
     Assert.Throws <ArgumentNullException>(() => OrCriteria.Combine(null));
 }
예제 #29
0
        public void NamePropertyIsOr()
        {
            var criteria = new OrCriteria();

            Assert.Equal("or", criteria.Name);
        }
예제 #30
0
        public void TestGetPredicate()
        {
            var criteria = new OrCriteria <AggregateRootSample>(t => t.Name == "a", t => t.Name != "b");

            Assert.Equal("t => ((t.Name == \"a\") OrElse (t.Name != \"b\"))", criteria.GetPredicate().ToString());
        }
예제 #31
0
 Expression VisitOrElse(BinaryExpression b)
 {
     return(new CriteriaExpression(
                OrCriteria.Combine(CombineExpressions <CriteriaExpression>(b.Left, b.Right).Select(f => f.Criteria).ToArray())));
 }