Beispiel #1
0
        public BoolFilterDescriptor <T> Must(params Func <FilterDescriptor <T>, FilterContainer>[] filters)
        {
            var descriptors = new List <FilterContainer>();

            foreach (var selector in filters)
            {
                var filter = new FilterDescriptor <T>();
                var f      = selector(filter);
                if (f.IsConditionless)
                {
                    continue;
                }
                descriptors.Add(f);
            }
            ((IBoolFilter)this).Must = descriptors;
            return(this);
        }
        /// <summary>
        /// A filter that filters out matched documents using a query.
        /// This filter is more performant then bool filter.
        /// </summary>
        public FilterContainer Not(Func <FilterDescriptor <T>, FilterContainer> selector)
        {
            var notFilter = new NotFilterDescriptor();

            var filter = new FilterDescriptor <T>()
            {
                IsConditionless = true
            };
            FilterContainer bf = filter;

            if (selector != null)
            {
                bf = selector(filter);
            }

            ((INotFilter)notFilter).Filter = bf;
            return(this.New(notFilter, f => f.Not = notFilter));
        }
        private FilterDescriptor <T> CreateConditionlessFilterDescriptor(IFilter filter, string type = null)
        {
            var self = Self;

            if (self.IsStrict && !self.IsVerbatim)
            {
                throw new DslException("Filter resulted in a conditionless '{1}' filter (json by approx):\n{0}"
                                       .F(
                                           JsonConvert.SerializeObject(this, Formatting.Indented, new JsonSerializerSettings {
                    NullValueHandling = NullValueHandling.Ignore
                })
                                           , type ?? filter.GetType().Name.Replace("Descriptor", "").Replace("`1", "")
                                           )
                                       );
            }
            var f = new FilterDescriptor <T>();

            f.Self.IsStrict   = self.IsStrict;
            f.Self.IsVerbatim = self.IsVerbatim;
            f.IsConditionless = true;
            return(f);
        }
        private FilterDescriptor <T> New(IFilter filter, Action <IFilterContainer> fillProperty)
        {
            var self = Self;

            if (filter.IsConditionless && !self.IsVerbatim)
            {
                this.ResetCache();
                return(CreateConditionlessFilterDescriptor(filter));
            }

            this.SetCacheAndName(filter);
            var f = new FilterDescriptor <T>();

            f.Self.IsStrict   = self.IsStrict;
            f.Self.IsVerbatim = self.IsVerbatim;

            if (fillProperty != null)
            {
                fillProperty(f);
            }

            this.ResetCache();
            return(f);
        }