public void RunGroupTest <T>(List <T> seedValues, GroupOperators op, Operators opFirst, string valueFirst, Operators opSecond, string valueSecond, List <T> expectedResults) { List <TestContainer <T> > list = new List <TestContainer <T> >(); foreach (var val in seedValues) { list.Add(new TestContainer <T> { Value = val }); } var filterProvider = new Filter <TestContainer <T> >(); var group = new PropertyFilterGroup(); group.Operator = op; group.Children.Add(new PropertyFilter { Operator = opFirst, PropertyName = "Value", Value = valueFirst }); group.Children.Add(new PropertyFilter { Operator = opSecond, PropertyName = "Value", Value = valueSecond }); filterProvider.AddFilter(group); var result = filterProvider.Apply(list.AsQueryable()); var values = result.Select(x => x.Value).ToList(); Assert.True(Enumerable.SequenceEqual(values.OrderBy(x => x), expectedResults.OrderBy(x => x))); }
public IFilterExpression ConvertSegment(Segment segment) { if (!segment.HasSegments) { return(new PropertyFilter(segment.Value)); } if (segment.Segments.Any(x => x.WithNext == GroupOperators.OR)) { var group = new PropertyFilterGroup(); group.Operator = GroupOperators.OR; var andGroup = new PropertyFilterGroup(); GroupOperators lastOp = GroupOperators.None; var segments = segment.Segments.ToList(); for (int i = segments.Count - 1; i > -1; i--) { if (i > 0 && segments[i - 1].WithNext == GroupOperators.AND) { andGroup.Children.Insert(0, ConvertSegment(segments[i])); segments.RemoveAt(i); lastOp = GroupOperators.AND; } else if (i > 0 && segments[i - 1].WithNext == GroupOperators.OR) { if (lastOp == GroupOperators.AND) { andGroup.Children.Insert(0, ConvertSegment(segments[i])); group.Children.Insert(0, andGroup); andGroup = new PropertyFilterGroup(); } else { group.Children.Insert(0, ConvertSegment(segments[i])); } segments.RemoveAt(i); lastOp = GroupOperators.OR; } else { if (lastOp == GroupOperators.OR) { group.Children.Insert(0, ConvertSegment(segments[i])); } else { andGroup.Children.Insert(0, ConvertSegment(segments[i])); group.Children.Insert(0, andGroup); } } } return(group); } else { var group = new PropertyFilterGroup(); group.Operator = GroupOperators.AND; group.Children.AddRange(segment.Segments.Select(x => ConvertSegment(x))); return(group); } }