private static List <FilterSubExpression> ParseTopGroup(List <FilterSubExpression> exprs, out bool parsed) { List <FilterSubExpression> groups = exprs.Where(x => x.IsPrimitive <OpenGroupToken>()).ToList(); if (groups.Count == 0) { parsed = false; return(exprs); } List <FilterSubExpression> ret = exprs.ToList(); parsed = true; int topGroupLevel = groups.Max(x => x.AsPrimitive <OpenGroupToken>().DeptLevel); FilterSubExpression open = groups.First(x => x.AsPrimitive <OpenGroupToken>().DeptLevel == topGroupLevel); int topGroupId = open.AsPrimitive <OpenGroupToken>().GroupId; FilterSubExpression closed = exprs.First(x => x.AsPrimitive <CloseGroupToken>()?.GroupId == topGroupId); List <FilterSubExpression> groupExpr = new List <FilterSubExpression>(); int openIndex = ret.IndexOf(open); int closedIndex = ret.IndexOf(closed); for (int i = openIndex + 1; i < closedIndex; i++) { groupExpr.Add(ret[i]); ret[i] = null; } ret[closedIndex] = null; ret[openIndex] = new GroupFilterSubExpression(groupExpr); return(ret.Where(x => x != null).ToList()); }
public GroupFilterSubExpression(List <FilterSubExpression> expressions) { Expression = FilterParser.Parse(expressions); }
public TruthyFilterSubExpression(FilterSubExpression expression) { Expression = expression ?? throw new ArgumentNullException(nameof(expression)); }
public NegationFilterSubExpression(FilterSubExpression expr) { Expression = expr ?? throw new ArgumentNullException(nameof(expr)); }