< Summary

Information
Class: MyNet.Observable.Collections.PipelineEngine
Assembly: MyNet.Observable
File(s): https://raw.githubusercontent.com/sandre58/MyNet/85372080fe102cd9ee155ceab49ae000e7f66103/src/MyNet.Observable/Collections/PipelineEngine.cs
Tag: 323_28699572109
Line coverage
100%
Covered lines: 17
Uncovered lines: 0
Coverable lines: 17
Total lines: 71
Line coverage: 100%
Branch coverage
100%
Covered branches: 6
Total branches: 6
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Build(...)100%11100%
ApplyPaging(...)100%66100%

File(s)

https://raw.githubusercontent.com/sandre58/MyNet/85372080fe102cd9ee155ceab49ae000e7f66103/src/MyNet.Observable/Collections/PipelineEngine.cs

#LineLine coverage
 1// -----------------------------------------------------------------------
 2// <copyright file="PipelineEngine.cs" company="Stéphane ANDRE">
 3// Copyright (c) Stéphane ANDRE. All rights reserved.
 4// </copyright>
 5// -----------------------------------------------------------------------
 6
 7using System;
 8using System.Reactive.Linq;
 9using DynamicData;
 10using MyNet.Observable.Collections.Filters;
 11using MyNet.Observable.Collections.Paging;
 12using MyNet.Observable.Collections.Sorting;
 13
 14namespace MyNet.Observable.Collections;
 15
 16/// <summary>
 17/// Provides a pipeline engine that builds sorted and filtered observables from a source observable of change sets. The 
 18/// </summary>
 19internal static class PipelineEngine
 20{
 21    /// <summary>
 22    /// Builds sorted and filtered observables from a source observable of change sets, applying sorting and filtering o
 23    /// </summary>
 24    /// <param name="source">The source observable of change sets.</param>
 25    /// <param name="filterEngine">The filter engine to apply filtering operations.</param>
 26    /// <param name="sortEngine">The sort engine to apply sorting operations.</param>
 27    /// <typeparam name="T">The type of items in the collection.</typeparam>
 28    /// <returns>A tuple containing the sorted and filtered observables.</returns>
 29    public static (IObservable<IChangeSet<T>> Sorted, IObservable<IChangeSet<T>> Filtered) Build<T>(
 30        IObservable<IChangeSet<T>> source,
 31        FilterEngine<T> filterEngine,
 32        SortEngine<T> sortEngine)
 33        where T : notnull
 34    {
 18635        var sorted = source
 18636            .Sort(sortEngine.Comparer, resort: sortEngine.Resort);
 37
 18638        var filtered = source
 18639            .Filter(filterEngine.Predicate)
 18640            .Sort(sortEngine.Comparer, resort: sortEngine.Resort);
 41
 18642        return (sorted, filtered);
 43    }
 44
 45    /// <summary>
 46    /// Applies a paging window on top of a filtered and sorted change set stream.
 47    /// </summary>
 48    /// <param name="filtered">The filtered and sorted change set stream.</param>
 49    /// <param name="pagingEngine">The paging engine providing the active page window.</param>
 50    /// <typeparam name="T">The type of items in the collection.</typeparam>
 51    /// <returns>The paged change set stream.</returns>
 52    public static IObservable<IChangeSet<T>> ApplyPaging<T>(
 53        IObservable<IChangeSet<T>> filtered,
 54        PagingEngine pagingEngine)
 55        where T : notnull
 56    {
 18657        var pageRequests = pagingEngine.State
 18658            .Select(state => state switch
 18659            {
 18660                null => null,
 18661                var (page, pageSize) => (IPageRequest?)new PageRequest(Math.Max(page, 1), pageSize)
 18662            })
 18663            .Where(request => request is not null)
 18664            .Select(request => request!);
 65
 18666        return pagingEngine.State
 18667            .Select(state => state is null ? filtered : filtered.Page(pageRequests))
 18668            .Switch();
 69    }
 70}
 71