< Summary

Information
Class: Pozitron.QuerySpecification.Pagination
Assembly: Pozitron.QuerySpecification
File(s): /home/runner/work/QuerySpecification/QuerySpecification/src/QuerySpecification/Paging/Pagination.cs
Tag: 52_11740816328
Line coverage
100%
Covered lines: 49
Uncovered lines: 0
Coverable lines: 49
Total lines: 185
Line coverage: 100%
Branch coverage
100%
Covered branches: 20
Total branches: 20
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_TotalItems()100%11100%
get_TotalPages()100%11100%
get_PageSize()100%11100%
get_Page()100%11100%
get_StartItem()100%11100%
get_EndItem()100%11100%
get_HasPrevious()100%11100%
get_HasNext()100%11100%
get_Take()100%11100%
get_Skip()100%11100%
.ctor(...)100%11100%
get_Empty()100%11100%
.ctor(...)100%11100%
.ctor(...)100%11100%
.ctor(...)100%11100%
.ctor(...)100%44100%
GetHandledTotalItems(...)100%22100%
GetHandledPageSize(...)100%66100%
GetHandledTotalPages(...)100%22100%
GetHandledPage(...)100%66100%

File(s)

/home/runner/work/QuerySpecification/QuerySpecification/src/QuerySpecification/Paging/Pagination.cs

#LineLine coverage
 1using System.Runtime.CompilerServices;
 2using System.Text.Json.Serialization;
 3
 4namespace Pozitron.QuerySpecification;
 5
 6/// <summary>
 7/// Represents pagination information.
 8/// </summary>
 9public record Pagination
 10{
 11    private readonly PaginationSettings _paginationSettings;
 12
 13    /// <summary>
 14    /// Gets the total number of items.
 15    /// </summary>
 18116    public int TotalItems { get; }
 17
 18    /// <summary>
 19    /// Gets the total number of pages.
 20    /// </summary>
 12421    public int TotalPages { get; }
 22
 23    /// <summary>
 24    /// Gets the page size.
 25    /// </summary>
 29826    public int PageSize { get; }
 27
 28    /// <summary>
 29    /// Gets the current page number.
 30    /// </summary>
 29831    public int Page { get; }
 32
 33    /// <summary>
 34    /// Gets the start item number.
 35    /// </summary>
 2136    public int StartItem { get; }
 37
 38    /// <summary>
 39    /// Gets the end item number.
 40    /// </summary>
 2141    public int EndItem { get; }
 42
 43    /// <summary>
 44    /// Gets a value indicating whether there is a previous page.
 45    /// </summary>
 2146    public bool HasPrevious { get; }
 47
 48    /// <summary>
 49    /// Gets a value indicating whether there is a next page.
 50    /// </summary>
 2151    public bool HasNext { get; }
 52
 53    /// <summary>
 54    /// Gets the number of items to take.
 55    /// </summary>
 56    [JsonIgnore]
 2957    public int Take { get; }
 58
 59    /// <summary>
 60    /// Gets the number of items to skip.
 61    /// </summary>
 62    [JsonIgnore]
 2963    public int Skip { get; }
 64
 65    /// <summary>
 66    /// Initializes a new instance of the <see cref="Pagination"/> class.
 67    /// </summary>
 68    /// <param name="totalItems">The total number of items.</param>
 69    /// <param name="totalPages">The total number of pages.</param>
 70    /// <param name="pageSize">The page size.</param>
 71    /// <param name="page">The current page number.</param>
 72    /// <param name="startItem">The start item number.</param>
 73    /// <param name="endItem">The end item number.</param>
 74    /// <param name="hasPrevious">A value indicating whether there is a previous page.</param>
 75    /// <param name="hasNext">A value indicating whether there is a next page.</param>
 76    [JsonConstructor]
 477    public Pagination(int totalItems, int totalPages, int pageSize, int page, int startItem, int endItem, bool hasPrevio
 78    {
 479        _paginationSettings = default!;
 480        TotalItems = totalItems;
 481        TotalPages = totalPages;
 482        PageSize = pageSize;
 483        Page = page;
 484        StartItem = startItem;
 485        EndItem = endItem;
 486        HasPrevious = hasPrevious;
 487        HasNext = hasNext;
 488    }
 89
 90    /// <summary>
 91    /// Gets an pagination instance with zero items.
 92    /// </summary>
 293    public static Pagination Empty { get; } = new Pagination(PaginationSettings.Default, 0, null, null);
 94
 95    /// <summary>
 96    /// Initializes a new instance of the <see cref="Pagination"/> class with the specified items count and filter.
 97    /// </summary>
 98    /// <param name="itemsCount">The total number of items.</param>
 99    /// <param name="filter">The paging filter.</param>
 100    public Pagination(int itemsCount, PagingFilter filter)
 4101        : this(PaginationSettings.Default, itemsCount, filter.PageSize, filter.Page)
 102    {
 4103    }
 104
 105    /// <summary>
 106    /// Initializes a new instance of the <see cref="Pagination"/> class with the specified items count, page size, and 
 107    /// </summary>
 108    /// <param name="itemsCount">The total number of items.</param>
 109    /// <param name="pageSize">The page size.</param>
 110    /// <param name="page">The current page number.</param>
 111    public Pagination(int itemsCount, int? pageSize, int? page)
 6112        : this(PaginationSettings.Default, itemsCount, pageSize, page)
 113    {
 6114    }
 115
 116    /// <summary>
 117    /// Initializes a new instance of the <see cref="Pagination"/> class with the specified pagination settings, items c
 118    /// </summary>
 119    /// <param name="paginationSettings">The pagination settings.</param>
 120    /// <param name="itemsCount">The total number of items.</param>
 121    /// <param name="filter">The paging filter.</param>
 122    public Pagination(PaginationSettings paginationSettings, int itemsCount, PagingFilter filter)
 9123        : this(paginationSettings, itemsCount, filter.PageSize, filter.Page)
 124    {
 9125    }
 126
 127    /// <summary>
 128    /// Initializes a new instance of the <see cref="Pagination"/> class with the specified pagination settings, items c
 129    /// </summary>
 130    /// <param name="paginationSettings">The pagination settings.</param>
 131    /// <param name="itemsCount">The total number of items.</param>
 132    /// <param name="pageSize">The page size.</param>
 133    /// <param name="page">The current page number.</param>
 48134    public Pagination(PaginationSettings paginationSettings, int itemsCount, int? pageSize, int? page)
 135    {
 48136        _paginationSettings = paginationSettings;
 137
 138        // The order of actions is important
 48139        TotalItems = GetHandledTotalItems(itemsCount);
 48140        PageSize = GetHandledPageSize(_paginationSettings, pageSize);
 48141        TotalPages = GetHandledTotalPages(TotalItems, PageSize);
 48142        Page = GetHandledPage(_paginationSettings, TotalPages, page);
 143
 48144        HasNext = Page != TotalPages;
 48145        HasPrevious = Page != 1;
 146
 48147        StartItem = TotalItems == 0 ? 0 : (PageSize * (Page - 1)) + 1;
 48148        EndItem = (PageSize * Page) > TotalItems ? TotalItems : PageSize * Page;
 149
 48150        Take = PageSize;
 48151        Skip = PageSize * (Page - 1);
 48152    }
 153
 154    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 155    private static int GetHandledTotalItems(int itemsCount)
 156    {
 48157        return itemsCount < 0 ? 0 : itemsCount;
 158    }
 159
 160    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 161    private static int GetHandledPageSize(PaginationSettings settings, int? pageSize)
 162    {
 57163        if (!pageSize.HasValue || pageSize <= 0) return settings.DefaultPageSize;
 164
 46165        if (pageSize > settings.DefaultPageSizeLimit) return settings.DefaultPageSizeLimit;
 166
 32167        return pageSize.Value;
 168    }
 169
 170    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 171    private static int GetHandledTotalPages(int handledTotalItems, int handledPageSize)
 172    {
 48173        return handledTotalItems == 0 ? 1 : (int)Math.Ceiling((decimal)handledTotalItems / handledPageSize);
 174    }
 175
 176    [MethodImpl(MethodImplOptions.AggressiveInlining)]
 177    private static int GetHandledPage(PaginationSettings settings, int handledTotalPages, int? page)
 178    {
 56179        if (!page.HasValue || page <= 0) return settings.DefaultPage;
 180
 47181        if (page.Value > handledTotalPages) return handledTotalPages;
 182
 33183        return page.Value;
 184    }
 185}