• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

loresoft / MediatR.CommandQuery / 8911801772

01 May 2024 04:09PM CUT coverage: 57.379% (-1.8%) from 59.163%
8911801772

push

github

pwelter34
tweak build

342 of 700 branches covered (48.86%)

Branch coverage included in aggregate %.

1011 of 1658 relevant lines covered (60.98%)

18.48 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

86.21
/src/MediatR.CommandQuery.MongoDB/Handlers/EntityPagedQueryHandler.cs
1
using System.Linq.Dynamic.Core;
2

3
using AutoMapper;
4

5
using MediatR.CommandQuery.Extensions;
6
using MediatR.CommandQuery.Queries;
7

8
using Microsoft.Extensions.Logging;
9

10
using MongoDB.Abstracts;
11
using MongoDB.Driver;
12
using MongoDB.Driver.Linq;
13

14
namespace MediatR.CommandQuery.MongoDB.Handlers;
15

16
public class EntityPagedQueryHandler<TRepository, TEntity, TKey, TReadModel>
17
    : RepositoryHandlerBase<TRepository, TEntity, TKey, EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>
18
    where TRepository : IMongoRepository<TEntity, TKey>
19
    where TEntity : class
20
{
21
    public EntityPagedQueryHandler(ILoggerFactory loggerFactory, TRepository repository, IMapper mapper)
22
        : base(loggerFactory, repository, mapper)
12✔
23
    {
24
    }
12✔
25

26
    protected override async Task<EntityPagedResult<TReadModel>> Process(EntityPagedQuery<TReadModel> request, CancellationToken cancellationToken)
27
    {
28
        if (request is null)
12!
29
            throw new ArgumentNullException(nameof(request));
×
30

31
        var query = Repository.All();
12✔
32

33
        // build query from filter
34
        query = BuildQuery(request, query);
12✔
35

36
        // get total for query
37
        int total = await QueryTotal(request, query, cancellationToken).ConfigureAwait(false);
12✔
38

39
        // short circuit if total is zero
40
        if (total == 0)
12✔
41
            return new EntityPagedResult<TReadModel> { Data = new List<TReadModel>() };
4✔
42

43
        // page the query and convert to read model
44
        var result = await QueryPaged(request, query, cancellationToken);
8✔
45

46
        return new EntityPagedResult<TReadModel>
8✔
47
        {
8✔
48
            Total = total,
8✔
49
            Data = result
8✔
50
        };
8✔
51
    }
12✔
52

53

54
    protected virtual IQueryable<TEntity> BuildQuery(EntityPagedQuery<TReadModel> request, IQueryable<TEntity> query)
55
    {
56
        var entityQuery = request.Query;
12✔
57

58
        // build query from filter
59
        if (entityQuery?.Filter != null)
12!
60
            query = query.Filter(entityQuery.Filter);
12✔
61

62
        // add raw query
63
        if (!string.IsNullOrEmpty(entityQuery?.Query))
12!
64
            query = query.Where(entityQuery.Query);
×
65

66
        return query;
12✔
67
    }
68

69
    protected virtual async Task<int> QueryTotal(EntityPagedQuery<TReadModel> request, IQueryable<TEntity> query, CancellationToken cancellationToken)
70
    {
71
        var mongoQuery = query as IMongoQueryable<TEntity>;
12✔
72

73
        return mongoQuery != null
12!
74
            ? await mongoQuery.CountAsync(cancellationToken).ConfigureAwait(false)
12✔
75
            : query.Count();
12✔
76
    }
12✔
77

78
    protected virtual async Task<IReadOnlyCollection<TReadModel>> QueryPaged(EntityPagedQuery<TReadModel> request, IQueryable<TEntity> query, CancellationToken cancellationToken)
79
    {
80
        var entityQuery = request.Query;
8✔
81

82
        var queryable = query
8✔
83
            .Sort(entityQuery.Sort);
8✔
84

85
        if (entityQuery.Page > 0 && entityQuery.PageSize > 0)
8✔
86
            queryable = queryable.Page(entityQuery.Page, entityQuery.PageSize);
8✔
87

88
        var mongoQuery = queryable as IMongoQueryable<TEntity>;
8✔
89

90
        var results = mongoQuery != null
8!
91
            ? await mongoQuery.ToListAsync(cancellationToken).ConfigureAwait(false)
8✔
92
            : queryable.ToList();
8✔
93

94
        return Mapper.Map<IList<TEntity>, IReadOnlyCollection<TReadModel>>(results);
8✔
95
    }
8✔
96
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc