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);
            }
        }
Beispiel #2
0
        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());
        }