private static IEnumerable <JToken> GetItemsByMark(QueryFilterModel model, ImmutableList <JToken> orderedTokens, int ii) { var res = model.ComparisonMark switch { ">=" => orderedTokens.GetRange(ii, orderedTokens.Count - ii), "<=" => orderedTokens.GetRange(ii, orderedTokens.Count - ii), ">" => orderedTokens.GetRange(ii + 1, orderedTokens.Count - ii - 1), "<" => orderedTokens.GetRange(ii + 1, orderedTokens.Count - ii - 1), _ => Enumerable.Empty <JToken>() }; return(new JObject(res).ToObject <JToken>()); } }
private JToken GetToken(JToken source, QueryFilterModel model) { if (model.ComparisonMark.Equals("==")) { return(source.Children() .FirstOrDefault(x => x.Path.EndsWith(model.Value, true, null))); } var orderedTokens = model.ComparisonMark.Contains("<") ? source.OrderByDescending(x => x.Path).ToImmutableList() : source.OrderBy(x => x.Path).ToImmutableList(); var tokenIndex = GetTokenIndex(model, orderedTokens); var result = GetItemsByMark(model, orderedTokens, tokenIndex); return(JToken.FromObject(result)); }
private static string BuildEqualsFilter(QueryFilterModel model) => $@"[?(@.{model.PropertyName.ToLower()} {model.ComparisonMark} {model.Value})]";
private static int GetTokenIndex(QueryFilterModel model, ImmutableList <JToken> orderedTokens) { var item = orderedTokens.FirstOrDefault(x => x.Path.EndsWith(model.Value, true, null)); return(orderedTokens.IndexOf(item)); }