internal async Task <List <TValue> > ListAsync <TValue>(Query query, DbParameterCollection parameters, string columnName, ShardsValues shardParameterValues, string shardParameterName, CancellationToken cancellationToken) { var result = new List <TValue>(); if (query is null || string.IsNullOrEmpty(query.Sql) || string.IsNullOrEmpty(query.Name)) { throw new ArgumentNullException(nameof(query)); } if (parameters == null) { throw new ArgumentNullException(nameof(parameters)); } if (!(this.MockResults is null) && this.MockResults.Count > 0 && this.MockResults.ContainsKey(query.Name)) { return((List <TValue>) this.MockResults[query.Name]); } cancellationToken.ThrowIfCancellationRequested(); var shardParameterOrdinal = parameters.GetParameterOrdinal(shardParameterName); var tsks = new List <Task <List <(TValue, object, object)> > >(); var cancelTokenSource = new CancellationTokenSource(); using (var queryCancelationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, cancelTokenSource.Token)) { if (shardParameterValues is null) { foreach (var shardId in dtn.Keys) { parameters.SetShardId(shardParameterOrdinal, shardId); tsks.Add(this.dtn[shardId].Read._manager.ListAsync <TValue, object, object>(query, columnName, null, null, parameters, parameters.GetParameterOrdinal(shardParameterName), null, cancellationToken)); } } else { if (shardParameterValues.Shards.Count == 0) { return(result); } foreach (var shardTuple in shardParameterValues.Shards) { parameters.SetShardId(shardParameterOrdinal, shardTuple.Key); tsks.Add(this.dtn[shardTuple.Key].Read._manager.ListAsync <TValue, object, object>(query, columnName, null, null, parameters, parameters.GetParameterOrdinal(shardParameterName), shardTuple.Value, cancellationToken)); } } await Task.WhenAll(tsks).ConfigureAwait(false); foreach (var tsk in tsks) { var interim = tsk.Result; if (!(interim is null)) { foreach (var itm in interim) { result.Add(itm.Item1); } } } } return(result); }
internal async Task <List <TModel> > ReadQueryAllAsync <TArg, TModel>(Query query, DbParameterCollection parameters, ShardsValues shardParameterValues, string shardParameterName, QueryResultModelHandler <TArg, TModel> resultHandler, TArg dataObject, CancellationToken cancellationToken) { var result = new List <TModel>(); if (query is null || string.IsNullOrEmpty(query.Sql) || string.IsNullOrEmpty(query.Name)) { throw new ArgumentNullException(nameof(query)); } if (parameters == null) { throw new ArgumentNullException(nameof(parameters)); } if (!(this.MockResults is null) && this.MockResults.Count > 0 && this.MockResults.ContainsKey(query.Name)) { return((List <TModel>) this.MockResults[query.Name]); } var shardParameterOrdinal = parameters.GetParameterOrdinal(shardParameterName); cancellationToken.ThrowIfCancellationRequested(); var tsks = new List <Task <TModel> >(); var cancelTokenSource = new CancellationTokenSource(); using (var queryCancelationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, cancelTokenSource.Token)) { if (shardParameterValues is null) { foreach (var shardId in dtn.Keys) { parameters.SetShardId(shardParameterOrdinal, shardId); tsks.Add(this.dtn[shardId].Read._manager.QueryAsync <TArg, TModel>(query, parameters, parameters.GetParameterOrdinal(shardParameterName), null, resultHandler, false, dataObject, null, cancellationToken)); } } else { if (shardParameterValues.Shards.Count == 0) { return(result); } foreach (var shardTuple in shardParameterValues.Shards) { parameters.SetShardId(shardParameterOrdinal, shardTuple.Key); tsks.Add(this.dtn[shardTuple.Key].Read._manager.QueryAsync <TArg, TModel>(query, parameters, parameters.GetParameterOrdinal(shardParameterName), shardTuple.Value, resultHandler, false, dataObject, null, cancellationToken)); } } await Task.WhenAll(tsks).ConfigureAwait(false); foreach (var tsk in tsks) { var tskResult = tsk.Result; if (tskResult != null) { result.Add(tskResult); } } } return(result); }
internal async Task RunAllAsync(Query query, DbParameterCollection parameters, ShardsValues shardParameterValues, string shardParameterName, CancellationToken cancellationToken) { if (query is null || string.IsNullOrEmpty(query.Sql) || string.IsNullOrEmpty(query.Name)) { throw new ArgumentNullException(nameof(query)); } if (parameters == null) { throw new ArgumentNullException(nameof(parameters)); } if (!(this.MockResults is null) && this.MockResults.Count > 0 && this.MockResults.ContainsKey(query.Name)) { return; } cancellationToken.ThrowIfCancellationRequested(); var shardParameterOrdinal = parameters.GetParameterOrdinal(shardParameterName); var tsks = new List <Task>(); var cancelTokenSource = new CancellationTokenSource(); using (var queryCancelationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, cancelTokenSource.Token)) { if (shardParameterValues is null) { foreach (var shardId in dtn.Keys) { parameters.SetShardId(shardParameterOrdinal, shardId); tsks.Add(this.dtn[shardId].Write._manager.RunAsync(query, parameters, parameters.GetParameterOrdinal(shardParameterName), null, null, cancellationToken)); } } else { if (shardParameterValues.Shards.Count == 0) { return; } foreach (var shardTuple in shardParameterValues.Shards) { parameters.SetShardId(shardParameterOrdinal, shardTuple.Key); tsks.Add(this.dtn[shardTuple.Key].Write._manager.RunAsync(query, parameters, parameters.GetParameterOrdinal(shardParameterName), shardTuple.Value, null, cancellationToken)); } } await Task.WhenAll(tsks).ConfigureAwait(false); } }