1+ using System ;
2+ using System . Collections . Generic ;
3+ using System . Linq ;
4+ using System . Threading . Tasks ;
5+
6+ namespace Serilog . Ui . Core . Services
7+ {
8+ /// <summary>
9+ /// Aggregates multiple <see cref="IDataProvider"/> into one instance.
10+ /// </summary>
11+ public class AggregateDataProvider : IDataProvider
12+ {
13+ /// <summary>
14+ /// <inheritdoc cref="IDataProvider.Name"/>
15+ /// NOTE We assume only one Aggregate provider, so the name is static.
16+ /// </summary>
17+ public string Name => nameof ( AggregateDataProvider ) ;
18+
19+ private IDataProvider _dataProvider ;
20+
21+ /// <summary>
22+ /// If there is only one data provider, this is it.
23+ /// If there are multiple, this is the current data provider.
24+ /// </summary>
25+ public IDataProvider DataProvider => _dataProvider ;
26+
27+ private readonly Dictionary < string , IDataProvider > _dataProviders = new Dictionary < string , IDataProvider > ( ) ;
28+
29+ public AggregateDataProvider ( IEnumerable < IDataProvider > dataProviders )
30+ {
31+ if ( dataProviders == null ) throw new ArgumentNullException ( nameof ( dataProviders ) ) ;
32+
33+ foreach ( var grouped in dataProviders
34+ . GroupBy ( c => c . Name , e => e , ( k , e ) => e . ToList ( ) ) )
35+ {
36+ var name = grouped [ 0 ] . Name ;
37+
38+ if ( grouped . Count == 1 )
39+ {
40+ _dataProviders . Add ( name , grouped [ 0 ] ) ;
41+ }
42+ else
43+ {
44+ // When providers with the same name are registered, we ensure uniqueness by generating a key
45+ // I.e. ["MSSQL.dbo.logs", "MSSQL.dbo.logs"] => ["MSSQL.dbo.logs[0]", "MSSQL.dbo.logs[1]"]
46+ for ( var i = 0 ; i < grouped . Count ; i ++ )
47+ {
48+ var dataProvider = grouped [ i ] ;
49+ _dataProviders . Add ( $ "{ name } [{ i } ]", dataProvider ) ;
50+ }
51+ }
52+ }
53+
54+ _dataProvider = _dataProviders . First ( c => true ) . Value ;
55+ }
56+
57+ public void SwitchToProvider ( string key )
58+ => _dataProvider = _dataProviders [ key ] ;
59+
60+ public IEnumerable < string > Keys => _dataProviders . Keys ;
61+
62+ #region Delegating members of IDataProvider
63+
64+ public async Task < ( IEnumerable < LogModel > , int ) > FetchDataAsync ( int page , int count , string level = null , string searchCriteria = null , DateTime ? startDate = null , DateTime ? endDate = null )
65+ {
66+ return await DataProvider . FetchDataAsync ( page , count , level , searchCriteria , startDate , endDate ) ;
67+ }
68+
69+ #endregion
70+
71+ }
72+ }
0 commit comments