public async Task <IEnumerable <TransactionCategoryRow> > Query(Guid userId, TransactionSearchFilter filter) { var allExpressions = filter.ExcludeExpressions.Union(filter.IncludeExpressions).ToList(); var evaluator = await evaluatorFactory.Create(allExpressions); var transactions = await queryBuilder.Query(userId, filter); if (filter.ExcludeExpressions.Any() && filter.IncludeExpressions.Any()) { return(transactions .Where(t => filter.IncludeExpressions.Any(e => evaluator.Evaluate(e, t))) .Where(t => !filter.ExcludeExpressions.Any(e => evaluator.Evaluate(e, t)))); } else if (!filter.ExcludeExpressions.Any() && filter.IncludeExpressions.Any()) { return(transactions .Where(t => filter.IncludeExpressions.Any(e => evaluator.Evaluate(e, t)))); } else if (filter.ExcludeExpressions.Any() && !filter.IncludeExpressions.Any()) { return(transactions .Where(t => !filter.ExcludeExpressions.Any(e => evaluator.Evaluate(e, t)))); } else { return(transactions); } }
public async Task <List <Rule> > GetSuitableRules(Guid transactionId, Guid userId) { var categoryRow = await transactionCategoryService.Get(transactionId, userId); var cachedEvaluator = await cachedEvaluatorFactory.Create(userId); return((await ruleRepository .GetRules(userId)) .Where(r => cachedEvaluator.Evaluate(r.ExpressionId, categoryRow)) .ToList()); }