/
aprogrammer
/
yessql
Обзор
Документация
Войти
/
aprogrammer
/
yessql
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/YesSql.Filters.Query/QueryFilterResult.cs
69 строк
2 KB
dependabot[bot]
Bump the all-dependencies group with 10 updates (#571)
03 июн 2024, 20:05
Не верифицирован
03 июн 2024, 20:05
e2b1e32
Код
Авторство
О чём код?
using System; using System.Collections.Generic; using System.Threading.Tasks; using YesSql.Filters.Abstractions.Nodes; using YesSql.Filters.Abstractions.Services; using YesSql.Filters.Query.Services; namespace YesSql.Filters.Query { public class QueryFilterResult<T> : FilterResult<T, QueryTermOption<T>> where T : class { public QueryFilterResult(IReadOnlyDictionary<string, QueryTermOption<T>> termOptions) : base(termOptions) { } public QueryFilterResult(IReadOnlyList<TermNode> terms, IReadOnlyDictionary<string, QueryTermOption<T>> termOptions) : base(terms, termOptions) { } public void MapFrom<TModel>(TModel model) { foreach (var option in TermOptions) { if (option.Value.MapFrom is Action<QueryFilterResult<T>, string, TermOption, TModel> mappingMethod) { mappingMethod(this, option.Key, option.Value, model); } } } /// <summary> /// Applies term filters to an <see cref="IQuery{T}"/> /// </summary> public async ValueTask<IQuery<T>> ExecuteAsync(QueryExecutionContext<T> context) { var visitor = new QueryFilterVisitor<T>(); foreach (var term in _terms.Values) { // TODO optimize value task. await VisitTerm(TermOptions, context, visitor, term); } // Execute always run terms. These are not added to the terms list. foreach (var termOption in TermOptions) { if (!termOption.Value.AlwaysRun) { continue; } if (!_terms.ContainsKey(termOption.Key)) { var alwaysRunNode = new NamedTermNode(termOption.Key, new UnaryNode(string.Empty, OperateNodeQuotes.None)); await VisitTerm(TermOptions, context, visitor, alwaysRunNode); } } return context.Item; } private async static Task VisitTerm(IReadOnlyDictionary<string, QueryTermOption<T>> termOptions, QueryExecutionContext<T> context, QueryFilterVisitor<T> visitor, TermNode term) { context.CurrentTermOption = termOptions[term.TermName]; var termQuery = visitor.Visit(term, context); context.Item = await termQuery.Invoke(context.Item); context.CurrentTermOption = null; } } }