public static FilterContainer CreateReturnFilter(Action <FilterContainer, BoolBaseFilterDescriptor> modify = null) { var returnFilter = new FilterContainer(); var returnBoolFilter = new BoolBaseFilterDescriptor() { }; ((IFilterContainer)returnFilter).Bool = returnBoolFilter; if (modify != null) { modify(returnFilter, returnBoolFilter); } return(returnFilter); }
public static FilterContainer operator !(FilterContainer lbq) { if (lbq == null || lbq.IsConditionless) { return new FilterContainer { IsConditionless = true } } ; var f = new FilterContainer(); var fq = new BoolBaseFilterDescriptor(); ((IBoolFilter)fq).MustNot = new[] { lbq }; ((IFilterContainer)f).Bool = fq; return(f); }
public static FilterContainer operator |(FilterContainer leftFilterDescriptor, FilterContainer rightFilterDescriptor) { var defaultFilter = new FilterContainer() { IsConditionless = true }; leftFilterDescriptor = leftFilterDescriptor ?? defaultFilter; rightFilterDescriptor = rightFilterDescriptor ?? defaultFilter; var combined = new[] { leftFilterDescriptor, rightFilterDescriptor }; if (combined.Any(bf => bf.IsConditionless)) { return(combined.FirstOrDefault(bf => !bf.IsConditionless) ?? defaultFilter); } var leftDescriptor = ((IFilterContainer)leftFilterDescriptor); var leftBoolFilter = leftDescriptor.Bool; var rightDescriptor = ((IFilterContainer)rightFilterDescriptor); var rightBoolFilter = rightDescriptor.Bool; var f = new FilterContainer(); var fq = new BoolBaseFilterDescriptor(); var bfq = (IBoolFilter)fq; bfq.Should = new[] { leftFilterDescriptor, rightFilterDescriptor }; ((IFilterContainer)f).Bool = fq; //if neither the left nor the right side represent a bool filter join them if (leftDescriptor.Bool == null && rightDescriptor.Bool == null) { bfq.Should = leftFilterDescriptor.MergeShouldFilters(rightFilterDescriptor); return(f); } //if the left or right sight already is a bool filter determine join the non bool query side of the //of the operation onto the other. if (leftDescriptor.Bool != null && rightDescriptor.Bool == null && !leftDescriptor.IsStrict) { JoinShouldOnSide(leftFilterDescriptor, rightFilterDescriptor, fq); } else if (rightDescriptor.Bool != null && leftDescriptor.Bool == null && !rightDescriptor.IsStrict) { JoinShouldOnSide(rightFilterDescriptor, leftFilterDescriptor, fq); } //both sides already represent a bool filter else { //both sides report that we may merge the shoulds if (!leftDescriptor.IsStrict && !rightDescriptor.IsStrict && leftBoolFilter.CanJoinShould() && rightBoolFilter.CanJoinShould()) { bfq.Should = leftFilterDescriptor.MergeShouldFilters(rightFilterDescriptor); } else { //create a new nested bool with two separate should bool sections bfq.Should = new[] { leftFilterDescriptor, rightFilterDescriptor } }; } return(f); }