/// <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));
        }
Ejemplo n.º 2
0
        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()];
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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);
        }