Ejemplo n.º 1
0
        /// <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);
            }));
        }