/// <summary> /// Gets the primary_filter, collection_of(secondary_filters) for the query /// </summary> public Tuple <OrchestrationStateQueryFilter, IEnumerable <OrchestrationStateQueryFilter> > GetFilters() { ICollection <OrchestrationStateQueryFilter> filters = FilterMap.Values; if (filters.Count == 0) { return(null); } var secondaryFilters = new List <OrchestrationStateQueryFilter>(); OrchestrationStateQueryFilter primaryFilter = filters.First(); int primaryFilterPrecedence = SafeGetFilterPrecedence(primaryFilter); if (filters.Count > 1) { foreach (OrchestrationStateQueryFilter filter in filters) { int newPrecedence = SafeGetFilterPrecedence(filter); if (newPrecedence > primaryFilterPrecedence) { secondaryFilters.Add(primaryFilter); primaryFilter = filter; primaryFilterPrecedence = newPrecedence; } else { secondaryFilters.Add(filter); } } } return(new Tuple <OrchestrationStateQueryFilter, IEnumerable <OrchestrationStateQueryFilter> >( primaryFilter, secondaryFilters)); }
string GetPrimaryFilterExpression(OrchestrationStateQueryFilter filter, bool isJumpStartTable) { string basicPrimaryFilter; if (!isJumpStartTable) { basicPrimaryFilter = string.Format(CultureInfo.InvariantCulture, AzureTableConstants.PrimaryFilterTemplate); } else { basicPrimaryFilter = string.Format( CultureInfo.InvariantCulture, AzureTableConstants.PrimaryTimeRangeTemplate, AzureTableOrchestrationJumpStartEntity.GetPartitionKey(DateTime.UtcNow.AddDays(-1)), AzureTableOrchestrationJumpStartEntity.GetPartitionKey(DateTime.UtcNow)); } string filterExpression = string.Empty; if (filter != null) { if (filter is OrchestrationStateInstanceFilter) { var typedFilter = filter as OrchestrationStateInstanceFilter; if (typedFilter.StartsWith) { filterExpression = string.Format(CultureInfo.InvariantCulture, AzureTableConstants.PrimaryInstanceQueryRangeTemplate, typedFilter.InstanceId, ComputeNextKeyInRange(typedFilter.InstanceId)); } else { if (string.IsNullOrEmpty(typedFilter.ExecutionId)) { filterExpression = string.Format(CultureInfo.InvariantCulture, AzureTableConstants.PrimaryInstanceQueryRangeTemplate, typedFilter.InstanceId, ComputeNextKeyInRange(typedFilter.InstanceId)); } else { filterExpression = string.Format(CultureInfo.InvariantCulture, AzureTableConstants.PrimaryInstanceQueryExactTemplate, typedFilter.InstanceId, typedFilter.ExecutionId); } } } else { // TODO : for now we don't have indexes for anything other than the // instance id so all filters are 'secondary' filters filterExpression = GetSecondaryFilterExpression(filter); } } return(basicPrimaryFilter + (string.IsNullOrEmpty(filterExpression) ? string.Empty : " and " + filterExpression)); }
int SafeGetFilterPrecedence(OrchestrationStateQueryFilter filter) { if (!FilterPrecedenceMap.ContainsKey(filter.GetType())) { throw new InvalidOperationException("Unknown filter type: " + filter.GetType()); } return(FilterPrecedenceMap[filter.GetType()]); }
int SafeGetFilterPrecedence(OrchestrationStateQueryFilter filter) { if (!FilterPrecedenceMap.ContainsKey(filter.GetType())) { throw new InvalidOperationException("Unknown filter type: " + filter.GetType()); } return FilterPrecedenceMap[filter.GetType()]; }
string GetPrimaryFilterExpression(OrchestrationStateQueryFilter filter) { string basicPrimaryFilter = string.Format(CultureInfo.InvariantCulture, TableConstants.PrimaryFilterTemplate); if (filter != null) { // TODO : for now we don't have indexes so all filters are 'secondary' filters basicPrimaryFilter += " and " + GetSecondaryFilterExpression(filter); } return(basicPrimaryFilter); }
internal TableQuery <AzureTableOrchestrationStateEntity> CreateQueryInternal(OrchestrationStateQuery stateQuery, int count, bool useTimeRangePrimaryFilter) { OrchestrationStateQueryFilter primaryFilter = null; IEnumerable <OrchestrationStateQueryFilter> secondaryFilters = null; Tuple <OrchestrationStateQueryFilter, IEnumerable <OrchestrationStateQueryFilter> > filters = stateQuery.GetFilters(); if (filters != null) { primaryFilter = filters.Item1; secondaryFilters = filters.Item2; } string filterExpression = GetPrimaryFilterExpression(primaryFilter, useTimeRangePrimaryFilter); if (string.IsNullOrWhiteSpace(filterExpression)) { throw new InvalidOperationException("Invalid primary filter"); } if (secondaryFilters != null) { filterExpression = secondaryFilters.Aggregate(filterExpression, (current, filter) => { string newFilter = current; string secondaryFilter = GetSecondaryFilterExpression(filter); if (!string.IsNullOrWhiteSpace(secondaryFilter)) { newFilter += " and " + secondaryFilter; } return(newFilter); }); } TableQuery <AzureTableOrchestrationStateEntity> query = new TableQuery <AzureTableOrchestrationStateEntity>().Where(filterExpression); if (count != -1) { query.TakeCount = count; } return(query); }
string GetSecondaryFilterExpression(OrchestrationStateQueryFilter filter) { string filterExpression; if (filter is OrchestrationStateInstanceFilter) { var typedFilter = filter as OrchestrationStateInstanceFilter; if (typedFilter.StartsWith) { filterExpression = string.Format(CultureInfo.InvariantCulture, AzureTableConstants.InstanceQuerySecondaryFilterRangeTemplate, typedFilter.InstanceId, ComputeNextKeyInRange(typedFilter.InstanceId)); } else { if (string.IsNullOrEmpty(typedFilter.ExecutionId)) { filterExpression = string.Format(CultureInfo.InvariantCulture, AzureTableConstants.InstanceQuerySecondaryFilterTemplate, typedFilter.InstanceId); } else { filterExpression = string.Format(CultureInfo.InvariantCulture, AzureTableConstants.InstanceQuerySecondaryFilterExactTemplate, typedFilter.InstanceId, typedFilter.ExecutionId); } } } else if (filter is OrchestrationStateNameVersionFilter) { var typedFilter = filter as OrchestrationStateNameVersionFilter; if (typedFilter.Version == null) { filterExpression = string.Format(CultureInfo.InvariantCulture, AzureTableConstants.NameVersionQuerySecondaryFilterTemplate, typedFilter.Name); } else { filterExpression = string.Format(CultureInfo.InvariantCulture, AzureTableConstants.NameVersionQuerySecondaryFilterExactTemplate, typedFilter.Name, typedFilter.Version); } } else if (filter is OrchestrationStateStatusFilter) { var typedFilter = filter as OrchestrationStateStatusFilter; var template = AzureTableConstants.StatusQuerySecondaryFilterTemplate; filterExpression = string.Format(CultureInfo.InvariantCulture, template, comparisonOperatorMap[typedFilter.ComparisonType], typedFilter.Status); } else if (filter is OrchestrationStateTimeRangeFilter) { var typedFilter = filter as OrchestrationStateTimeRangeFilter; typedFilter.StartTime = ClipStartTime(typedFilter.StartTime); typedFilter.EndTime = ClipEndTime(typedFilter.EndTime); string startTime = XmlConvert.ToString(typedFilter.StartTime, XmlDateTimeSerializationMode.RoundtripKind); string endTime = XmlConvert.ToString(typedFilter.EndTime, XmlDateTimeSerializationMode.RoundtripKind); switch (typedFilter.FilterType) { case OrchestrationStateTimeRangeFilterType.OrchestrationCreatedTimeFilter: filterExpression = string.Format(CultureInfo.InvariantCulture, AzureTableConstants.CreatedTimeRangeQuerySecondaryFilterTemplate, startTime, endTime); break; case OrchestrationStateTimeRangeFilterType.OrchestrationCompletedTimeFilter: filterExpression = string.Format(CultureInfo.InvariantCulture, AzureTableConstants.CompletedTimeRangeQuerySecondaryFilterTemplate, startTime, endTime); break; case OrchestrationStateTimeRangeFilterType.OrchestrationLastUpdatedTimeFilter: filterExpression = string.Format(CultureInfo.InvariantCulture, AzureTableConstants.LastUpdatedTimeRangeQuerySecondaryFilterTemplate, startTime, endTime); break; default: throw new InvalidOperationException("Unsupported filter type: " + typedFilter.FilterType.GetType()); } } else { throw new InvalidOperationException("Unsupported filter type: " + filter.GetType()); } return(filterExpression); }