private IEnumerable <TableQuery <DynamicTableEntity> > GetTableQueries() { List <TableQuery <DynamicTableEntity> > tableQueryList = new List <TableQuery <DynamicTableEntity> >(); for (int index = 0; index < this.regulatoryBodyList.Length; index++) { TableQuery <DynamicTableEntity> tableQuery = new TableQuery <DynamicTableEntity>(); tableQuery.SelectColumns = new List <string> { UserAccessRequestTracker.UserIdKey, UserAccessRequestTracker.RegulatoryBodyKey, UserAccessRequestTracker.RequestStatusKey, UserAccessRequestTracker.CurrentAccessLevel, UserAccessRequestTracker.RequestedAccessLevel, UserAccessRequestTracker.JustificationText }; string regulatory = this.regulatoryBodyList[index]; //tableQuery = TableAzureQueryHelper.AddCondition(tableQuery, TableOperators.And, TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, string.Format("{0}-{1}", regulatory, (int)RequestStatus.Pending))); //[Temporary Fix:] The following query is full table scan. We have to re-design the schemal of "AccessEvelationRequest" table, so that it can queried efficiently on number of diff. fields. tableQuery = TableAzureQueryHelper.AddCondition(tableQuery, TableOperators.And, TableQuery.GenerateFilterConditionForInt("RequestStatus", QueryComparisons.Equal, (int)RequestStatus.Pending)); tableQuery = TableAzureQueryHelper.AddCondition(tableQuery, TableOperators.And, TableQuery.GenerateFilterCondition("Regulatory", QueryComparisons.Equal, regulatory.ToLower())); tableQueryList.Add(tableQuery); } return(tableQueryList); }
private IEnumerable <TableQuery <DynamicTableEntity> > GetTableQueries(DateTime signalTime) { List <TableQuery <DynamicTableEntity> > tableQueryList = new List <TableQuery <DynamicTableEntity> >(); for (int regionIndex = 0; regionIndex < this.regionIdList.Length; regionIndex++) { TableQuery <DynamicTableEntity> tableQuery = new TableQuery <DynamicTableEntity>(); tableQuery.SelectColumns = new List <string> { AuditTracker.AuditIdKey, AuditTracker.MessageKey, AuditTracker.TransactionIdKey }; string regionPartitionKey = this.PartitionKeyFromDateTime(this.regionIdList[regionIndex], this.TrackingTimeStart); tableQuery = TableAzureQueryHelper.AddCondition(tableQuery, TableOperators.And, TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, regionPartitionKey)); if (this.TrackingTimeStart.DayOfYear != signalTime.DayOfYear) { // TODO: Case to handle start time belong a one date and end time belongs to next day data. string regionPartitionKeyForEndTime = this.PartitionKeyFromDateTime(this.regionIdList[regionIndex], signalTime); tableQuery = TableAzureQueryHelper.AddCondition(tableQuery, TableOperators.Or, TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, regionPartitionKeyForEndTime)); } tableQuery = TableAzureQueryHelper.AddCondition(tableQuery, TableOperators.And, TableQuery.GenerateFilterConditionForInt("Status", QueryComparisons.Equal, AuditTracker.ErrorStatusCode)); tableQuery = TableAzureQueryHelper.AddCondition(tableQuery, TableOperators.And, TableQuery.GenerateFilterConditionForDate("Timestamp", QueryComparisons.GreaterThanOrEqual, this.TrackingTimeStart)); tableQuery = TableAzureQueryHelper.AddCondition(tableQuery, TableOperators.And, TableQuery.GenerateFilterConditionForDate("Timestamp", QueryComparisons.LessThanOrEqual, signalTime)); tableQueryList.Add(tableQuery); } return(tableQueryList); }
public List <UserAccessRequest> GetUserAccessRequests(IEnumerable <TableQuery <DynamicTableEntity> > tableQueryList) { List <UserAccessRequest> accessRequests = new List <UserAccessRequest>(); string userName = "******"; string location = "City"; try { Parallel.ForEach( tableQueryList, (tableQuery) => { IEnumerable <DynamicTableEntity> partialResult = this.azureTableOperation.GetTableEntityProjection(this.TableName, tableQuery); if (partialResult != null) { foreach (var userRequest in partialResult) { string userId = userRequest[UserAccessRequestTracker.UserIdKey].StringValue; TableQuery <DynamicTableEntity> query = new TableQuery <DynamicTableEntity>(); query.SelectColumns = new List <string> { userName, location }; query = TableAzureQueryHelper.AddCondition(query, QueryComparisons.Equal, TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "1")); query = TableAzureQueryHelper.AddCondition(query, QueryComparisons.Equal, TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, userId)); DynamicTableEntity user = this.azureTableOperation.GetTableEntityProjection(this.UserProfileTable, query).FirstOrDefault(); if (user != null) { lock (lockObj) { string currentAccessLevel = Enum.GetName(typeof(AccessLevels), userRequest[UserAccessRequestTracker.CurrentAccessLevel].Int32Value); string requestedAccessLevel = Enum.GetName(typeof(AccessLevels), userRequest[UserAccessRequestTracker.RequestedAccessLevel].Int32Value); accessRequests.Add( new UserAccessRequest( user[userName].StringValue, user[location].StringValue, currentAccessLevel, requestedAccessLevel, userRequest[UserAccessRequestTracker.RegulatoryBodyKey].StringValue, userRequest[UserAccessRequestTracker.JustificationText].StringValue)); } } } } }); } catch (System.AggregateException ex) { if (!(ex.InnerException is StorageException)) { throw; } System.Diagnostics.Trace.TraceError(ex.ToString()); } return(accessRequests); }