//TODO merge similarities with batch execution private async Task <int> ExecuteChangesAsync(IReadOnlyList <StateEntry> stateEntries, CancellationToken cancellationToken = default(CancellationToken)) { var tableGroups = stateEntries.GroupBy(s => s.EntityType); var allTasks = new List <Task <TableResult> >(); foreach (var tableGroup in tableGroups) { var table = new AtsTable(tableGroup.Key.TableName()); var tasks = tableGroup.Select(entry => CreateRequest(table, entry)) .TakeWhile(operation => !cancellationToken.IsCancellationRequested) .Select(request => Connection.ExecuteRequestAsync(request, Logger, cancellationToken)); allTasks.AddRange(tasks); if (cancellationToken.IsCancellationRequested) { break; } } try { await Task.WhenAll(allTasks); } catch (StorageException exception) { var handled = HandleStorageException(exception, stateEntries); if (handled != null) { throw handled; } throw; } return(allTasks.Count(t => t.Result.HttpStatusCode < (int)HttpStatusCode.BadRequest)); }
//TODO merge similarities with batch execution private int ExecuteChanges(IReadOnlyList <StateEntry> stateEntries) { var tableGroups = stateEntries.GroupBy(s => s.EntityType); var allResults = new List <TableResult>(); try { foreach (var tableGroup in tableGroups) { var table = new AtsTable(tableGroup.Key.AzureTableStorage().Table); var results = tableGroup.Select(entry => CreateRequest(table, entry)) .Select(request => Connection.ExecuteRequest(request, Logger)); allResults.AddRange(results); } } catch (StorageException exception) { var handled = HandleStorageException(exception, stateEntries); if (handled != null) { throw handled; } throw; } return(allResults.Count(r => r.HttpStatusCode < (int)HttpStatusCode.BadRequest)); }
private async Task <int> ExecuteBatchedChangesAsync(IReadOnlyList <StateEntry> stateEntries, CancellationToken cancellationToken = default(CancellationToken)) { var tableGroups = stateEntries.GroupBy(s => s.EntityType.AzureTableStorage().Table); var allBatchTasks = new List <Task <IList <TableResult> > >(); IList <TableResult>[] results; try { foreach (var tableGroup in tableGroups) { var table = new AtsTable(tableGroup.Key); var partitionGroups = tableGroup.GroupBy(s => { var property = s.EntityType.GetPropertyByColumnName("PartitionKey"); return(s[property]); } ); foreach (var partitionGroup in partitionGroups) { var request = new TableBatchRequest(table); foreach (var operation in partitionGroup .Select(entry => CreateRequest(table, entry)) .Where(operation => operation != null) ) { request.Add(operation); if (request.Count >= MaxBatchOperations) { allBatchTasks.Add(Connection.ExecuteRequestAsync(request, Logger, cancellationToken)); request = new TableBatchRequest(table); } } if (request.Count != 0) { allBatchTasks.Add(Connection.ExecuteRequestAsync(request, Logger, cancellationToken)); } } } results = await Task.WhenAll(allBatchTasks).WithCurrentCulture(); } catch (StorageException exception) { var handled = HandleStorageException(exception, stateEntries); if (handled != null) { throw handled; } throw; } return(results.Sum(r => r == null ? 0 : r.Count(t => t.HttpStatusCode < (int)HttpStatusCode.BadRequest))); }
private int ExecuteBatchedChanges(IReadOnlyList <StateEntry> stateEntries) { var tableGroups = stateEntries.GroupBy(s => s.EntityType.AzureTableStorage().Table); var results = new List <IList <TableResult> >(); try { foreach (var tableGroup in tableGroups) { var table = new AtsTable(tableGroup.Key); var partitionGroups = tableGroup.GroupBy(s => { var property = s.EntityType.GetPropertyByColumnName("PartitionKey"); return(s[property]); } ); foreach (var partitionGroup in partitionGroups) { var request = new TableBatchRequest(table); foreach (var operation in partitionGroup .Select(entry => CreateRequest(table, entry)) .Where(operation => operation != null) ) { request.Add(operation); if (request.Count >= MaxBatchOperations) { results.Add(Connection.ExecuteRequest(request, Logger)); request = new TableBatchRequest(table); } } if (request.Count != 0) { results.Add(Connection.ExecuteRequest(request, Logger)); } } } } catch (StorageException exception) { var handled = HandleStorageException(exception, stateEntries); if (handled != null) { throw handled; } throw; } return(results.Sum(r => r == null ? 0 : r.Count(t => t.HttpStatusCode < (int)HttpStatusCode.BadRequest))); }
protected TableOperationRequest CreateRequest(AtsTable table, StateEntry entry) { var entity = EntityFactory.CreateFromStateEntry(entry); switch (entry.EntityState) { case EntityState.Added: return(new CreateRowRequest(table, entity)); case EntityState.Deleted: return(new DeleteRowRequest(table, entity)); case EntityState.Modified: return(new MergeRowRequest(table, entity)); case EntityState.Unchanged: case EntityState.Unknown: return(null); default: throw new ArgumentOutOfRangeException("entry", "Unknown entity state"); } }
protected bool Equals(AtsTable other) { return(string.Equals(Name, other.Name)); }
protected bool Equals(AtsTable other) { return string.Equals(Name, other.Name); }