/// <summary> /// Gets the filters for every partition. /// </summary> /// <param name="suppliedContinuationTokens">The supplied continuation token.</param> /// <param name="partitionKeyRanges">The partition key ranges.</param> /// <param name="sortOrders">The sort orders.</param> /// <param name="orderByExpressions">The order by expressions.</param> /// <param name="targetRangeToContinuationTokenMap">The dictionary of target ranges to continuation token map.</param> /// <returns>The filters for every partition.</returns> private RangeFilterInitializationInfo[] GetPartitionKeyRangesInitializationInfo( OrderByContinuationToken[] suppliedContinuationTokens, List <PartitionKeyRange> partitionKeyRanges, SortOrder[] sortOrders, string[] orderByExpressions, out Dictionary <string, OrderByContinuationToken> targetRangeToContinuationTokenMap) { int minIndex = this.FindTargetRangeAndExtractContinuationTokens( partitionKeyRanges, suppliedContinuationTokens .Select(token => Tuple.Create(token, token.CompositeContinuationToken.Range)), out targetRangeToContinuationTokenMap); FormattedFilterInfo formattedFilterInfo = this.GetFormattedFilters( orderByExpressions, suppliedContinuationTokens, sortOrders); return(new RangeFilterInitializationInfo[] { new RangeFilterInitializationInfo(formattedFilterInfo.FilterForRangesLeftOfTargetRanges, 0, minIndex - 1), new RangeFilterInitializationInfo(formattedFilterInfo.FiltersForTargetRange, minIndex, minIndex), new RangeFilterInitializationInfo(formattedFilterInfo.FilterForRangesRightOfTargetRanges, minIndex + 1, partitionKeyRanges.Count - 1), }); }
/// <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); })); }