/// <summary> /// Gets the formatted filters for every partition. /// </summary> /// <param name="expressions">The filter expressions.</param> /// <param name="continuationTokens">The continuation token.</param> /// <param name="sortOrders">The sort orders.</param> /// <returns>The formatted filters for every partition.</returns> private static FormattedFilterInfo GetFormattedFilters( string[] expressions, OrderByContinuationToken[] continuationTokens, SortOrder[] sortOrders) { // Validate the inputs for (int index = 0; index < continuationTokens.Length; index++) { Debug.Assert(continuationTokens[index].OrderByItems.Count == sortOrders.Length, "Expect values and orders are the same size."); Debug.Assert(expressions.Length == sortOrders.Length, "Expect expressions and orders are the same size."); } Tuple <string, string, string> filters = CosmosOrderByItemQueryExecutionContext.GetFormattedFilters( expressions, continuationTokens[0].OrderByItems.Select(orderByItem => orderByItem.Item).ToArray(), sortOrders); return(new FormattedFilterInfo(filters.Item1, filters.Item2, filters.Item3)); }
/// <summary> /// Gets the filters for every partition. /// </summary> private static TryCatch <OrderByInitInfo> TryGetOrderByPartitionKeyRangesInitializationInfo( OrderByContinuationToken[] suppliedContinuationTokens, List <PartitionKeyRange> partitionKeyRanges, SortOrder[] sortOrders, string[] orderByExpressions) { TryCatch <InitInfo <OrderByContinuationToken> > tryFindRangeAndContinuationTokensMonad = CosmosCrossPartitionQueryExecutionContext.TryFindTargetRangeAndExtractContinuationTokens( partitionKeyRanges, suppliedContinuationTokens .Select(token => Tuple.Create(token, token.CompositeContinuationToken.Range))); return(tryFindRangeAndContinuationTokensMonad.Try <OrderByInitInfo>((indexAndContinuationTokens) => { int minIndex = indexAndContinuationTokens.TargetIndex; IReadOnlyDictionary <string, OrderByContinuationToken> partitionKeyRangeToContinuationToken = indexAndContinuationTokens.ContinuationTokens; FormattedFilterInfo formattedFilterInfo = CosmosOrderByItemQueryExecutionContext.GetFormattedFilters( orderByExpressions, suppliedContinuationTokens, sortOrders); RangeFilterInitializationInfo[] filters = new RangeFilterInitializationInfo[] { new RangeFilterInitializationInfo( filter: formattedFilterInfo.FilterForRangesLeftOfTargetRanges, startIndex: 0, endIndex: minIndex - 1), new RangeFilterInitializationInfo( filter: formattedFilterInfo.FiltersForTargetRange, startIndex: minIndex, endIndex: minIndex), new RangeFilterInitializationInfo( filter: formattedFilterInfo.FilterForRangesRightOfTargetRanges, startIndex: minIndex + 1, endIndex: partitionKeyRanges.Count - 1), }; return new OrderByInitInfo( filters, partitionKeyRangeToContinuationToken); })); }