Пример #1
0
        public Func <QueryContainerDescriptor <T>, QueryContainer> ComposeFilter <T>(FilterCriteriaArgs args)
            where T : class
        {
            Func <QueryContainerDescriptor <T>, QueryContainer> filter;

            if (!(args.FilterValue is BooleanFilterValue value))
            {
                return(null);
            }

            if (string.IsNullOrWhiteSpace(args.ParentPropertyName))
            {
                filter = q => q.Term(t => t.Field(args.PropertyName)
                                     .Value(value.Value));
            }
            else
            {
                var fieldName = $"{args.ParentPropertyName}.{args.PropertyName}";

                filter = q => q
                         .Nested(n => n
                                 .Path(args.ParentPropertyName)
                                 .Query(q1 => q1
                                        .Term(t => t
                                              .Field(fieldName)
                                              .Value(value.Value)
                                              )
                                        )
                                 );
            }

            return(filter);
        }
Пример #2
0
        public Func <QueryContainerDescriptor <T>, QueryContainer> ComposeFilter <T>(FilterCriteriaArgs args)
            where T : class
        {
            var fieldName = string.IsNullOrWhiteSpace(args.ParentPropertyName)
                                ? args.PropertyName
                                : $"{args.ParentPropertyName}.{args.PropertyName}";

            if (!(args.FilterValue is DateFilterValue dateFilterValue))
            {
                return(descriptor => descriptor);
            }

            if (args.Operator == OperatorType.Different)
            {
                return(DifferentOperatorFilter <T>(fieldName, args.ParentPropertyName, dateFilterValue.Value));
            }

            IDateRangeQuery DateRange(DateRangeQueryDescriptor <T> descriptor)
            {
                IDateRangeQuery dateRangeQuery = descriptor
                                                 .Name("")
                                                 .Field(fieldName);

                CreateRangeDescriptor(args.Operator, descriptor, dateFilterValue);

                return(dateRangeQuery);
            }

            return(CreateFilter <T>(args.ParentPropertyName, DateRange));
        }
        public Func <QueryContainerDescriptor <T>, QueryContainer> ComposeFilter <T>(FilterCriteriaArgs args)
            where T : class
        {
            Func <QueryContainerDescriptor <T>, QueryContainer> filter;

            if (!(args.FilterValue is TextFilterValue value))
            {
                return(null);
            }

            if (args.Operator == OperatorType.Different)
            {
                return(ComposeDifferentOperatorFilter <T>(args));
            }

            if (string.IsNullOrWhiteSpace(args.ParentPropertyName))
            {
                filter = args.Strict
                             ? q => q.Term(t => t.Field(args.PropertyName)
                                           .Value(value.Value))
                             : WildcardFilter <T>(value.Value, args.PropertyName, args);
            }
            else
            {
                var fieldName = $"{args.ParentPropertyName}.{args.PropertyName}";

                filter = args.Strict
                             ? (Func <QueryContainerDescriptor <T>, QueryContainer>)(q => q
                                                                                     .Nested(n => n
                                                                                             .Path(args.ParentPropertyName)
                                                                                             .Query(q1 => q1
                                                                                                    .Term(t => t
                                                                                                          .Field(fieldName)
                                                                                                          .Value(value.Value)
                                                                                                          )
                                                                                                    )
                                                                                             ))
                             : q => q
                         .Nested(n => n
                                 .Path(args.ParentPropertyName)
                                 .Query(WildcardFilter <T>(value.Value, fieldName, args))
                                 );
            }

            return(filter);
        }
        public Func <QueryContainerDescriptor <T>, QueryContainer> ComposeFilter <T>(FilterCriteriaArgs args)
            where T : class
        {
            var fieldName = string.IsNullOrWhiteSpace(args.ParentPropertyName)
                                ? args.PropertyName
                                : $"{args.ParentPropertyName}.{args.PropertyName}";

            if (!(args.FilterValue is NumericFilterValue numericFilterValue))
            {
                return(descriptor => descriptor);
            }

            if (args.Operator == OperatorType.Different)
            {
                return(DifferentOperatorFilter <T>(fieldName, args.ParentPropertyName, numericFilterValue.Value));
            }

            INumericRangeQuery NumericRange(NumericRangeQueryDescriptor <T> descriptor)
            {
                INumericRangeQuery numericRangeQuery = descriptor
                                                       .Name(fieldName)
                                                       .Field(fieldName)
                                                       .Relation(RangeRelation.Within);

                CreateRangeDescriptor(args.Operator, descriptor, numericFilterValue);

                return(numericRangeQuery);
            }

            Func <QueryContainerDescriptor <T>, QueryContainer> filter;

            if (string.IsNullOrWhiteSpace(args.ParentPropertyName))
            {
                filter = q => q.Range(NumericRange);
            }
            else
            {
                filter = q => q.Nested(n => n
                                       .Path(args.ParentPropertyName)
                                       .Query(query => query.Range(NumericRange))
                                       );
            }

            return(filter);
        }
        public Func <QueryContainerDescriptor <T>, QueryContainer> ComposeFilter <T>(FilterCriteriaArgs args)
            where T : class
        {
            Func <QueryContainerDescriptor <T>, QueryContainer> filter = descriptor => descriptor;

            if (!(args.FilterValue is GuidFilterValue guidFilterValue))
            {
                return(filter);
            }

            if (!guidFilterValue.Value.HasValue)
            {
                return(ComposeDoesNotExistFilter <T>(args.ParentPropertyName, args.PropertyName, guidFilterValue));
            }

            if (string.IsNullOrWhiteSpace(args.ParentPropertyName))
            {
                filter = q => q.Term(m => m.Field(args.PropertyName)
                                     .Value(guidFilterValue.Value)
                                     .Verbatim());
            }
            else
            {
                var fieldName = $"{args.ParentPropertyName}.{args.PropertyName}";

                filter = q => q
                         .Nested(n => n
                                 .Path(args.ParentPropertyName)
                                 .Query(q1 => q1.Term(m => m
                                                      .Field(fieldName)
                                                      .Value(guidFilterValue.Value)
                                                      )
                                        )
                                 );
            }

            return(filter);
        }
        private static Func <QueryContainerDescriptor <T>, QueryContainer> ComposeDifferentOperatorFilter <T>(FilterCriteriaArgs args)
            where T : class
        {
            var fieldName = string.IsNullOrWhiteSpace(args.ParentPropertyName)
                                ? args.PropertyName
                                : $"{args.ParentPropertyName}.{args.PropertyName}";

            if (!(args.FilterValue is TextFilterValue textFilterValue))
            {
                return(descriptor => descriptor);
            }

            Func <QueryContainerDescriptor <T>, QueryContainer> queryContainerDescriptor;

            QueryContainer QueryContainerDescriptor(QueryContainerDescriptor <T> q) => q
            .Bool(b => b
                  .MustNot(q1 => q1
                           .Term(t => t.Field(fieldName)
                                 .Value(textFilterValue.Value))
                           )
                  );

            if (string.IsNullOrWhiteSpace(args.ParentPropertyName))
            {
                queryContainerDescriptor = QueryContainerDescriptor;
            }
            else
            {
                queryContainerDescriptor = q => q.Nested(n => n
                                                         .Path(args.ParentPropertyName)
                                                         .Query(QueryContainerDescriptor)
                                                         );
            }

            return(queryContainerDescriptor);
        }
 private static Func <QueryContainerDescriptor <T>, QueryContainer> WildcardFilter <T>(string searchText,
                                                                                       string fieldName,
                                                                                       FilterCriteriaArgs args)
     where T : class
 {
     return(q => q.MultiMatch(qs => qs.Name($"filter_text_on_{args.PropertyName}")
                              .Query(searchText)
                              .Fields(f => f
                                      .Field(fieldName, boost: 1.1)
                                      .Field("*.ngram")
                                      )
                              .Lenient()
                              .MinimumShouldMatch(MinimumShouldMatch.Percentage(80))
                              .TieBreaker(0.1)
                              .Type(TextQueryType.BestFields)
                              .Operator(Operator.And)
                              .FuzzyRewrite(MultiTermQueryRewrite.TopTermsBoost(5))
                              .Fuzziness(Fuzziness.EditDistance(1))
                              ));
 }
Пример #8
0
        private static Func <QueryContainerDescriptor <TIndexItem>, QueryContainer> ComposeFilter(FilterCriteriaArgs args)
        {
            var filterTypeInstance = ComposeFilterFactory.CreateInstance(args.FilterValue.Type);
            var filter             = filterTypeInstance.ComposeFilter <TIndexItem>(args);

            return(filter);
        }