Skip to content

Commit f79ca78

Browse files
committed
Refactor to avoid computing configuration in each call.
1 parent 38fff07 commit f79ca78

3 files changed

Lines changed: 29 additions & 30 deletions

File tree

Microsoft.Azure.Cosmos/src/Query/Core/Pipeline/CrossPartition/HierarchicalPartitionUtils.cs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ namespace Microsoft.Azure.Cosmos.Query.Core.Pipeline.CrossPartition
77
using System;
88
using System.Collections.Generic;
99
using Microsoft.Azure.Cosmos.Query.Core.QueryClient;
10+
using Microsoft.Azure.Documents.Routing;
1011

1112
internal static class HierarchicalPartitionUtils
1213
{
14+
private static readonly bool IsLengthAwareComparisonEnabled = ConfigurationManager.IsLengthAwareRangeComparatorEnabled();
1315
/// <summary>
1416
/// Updates the FeedRange to limit the scope of incoming feedRange to logical partition within a single physical partition.
1517
/// Generally speaking, a subpartitioned container can experience split partition at any level of hierarchical partition key.
@@ -51,9 +53,7 @@ public static FeedRangeInternal LimitFeedRangeToSinglePartition(PartitionKey? pa
5153
String overlappingMax;
5254
bool maxInclusive;
5355

54-
bool isLengthAwareComparisonEnabled = ConfigurationManager.IsLengthAwareRangeComparatorEnabled();
55-
56-
IComparer<Documents.Routing.Range<string>> minComparer = GetComparer(isMinComparer: true, useLengthAwareComparison: isLengthAwareComparisonEnabled);
56+
(IComparer<Range<string>> minComparer, IComparer<Range<string>> maxComparer) = GetComparers(IsLengthAwareComparisonEnabled);
5757

5858
if (minComparer.Compare(
5959
epkForPartitionKey,
@@ -68,8 +68,6 @@ public static FeedRangeInternal LimitFeedRangeToSinglePartition(PartitionKey? pa
6868
minInclusive = epkForPartitionKey.IsMinInclusive;
6969
}
7070

71-
IComparer<Documents.Routing.Range<string>> maxComparer = GetComparer(isMinComparer: false, useLengthAwareComparison: isLengthAwareComparisonEnabled);
72-
7371
if (maxComparer.Compare(
7472
epkForPartitionKey,
7573
feedRangeEpk.Range) > 0)
@@ -104,11 +102,11 @@ public static FeedRangeInternal LimitFeedRangeToSinglePartition(PartitionKey? pa
104102
return feedRange;
105103
}
106104

107-
private static IComparer<Documents.Routing.Range<string>> GetComparer(bool isMinComparer, bool useLengthAwareComparison)
105+
private static (IComparer<Documents.Routing.Range<string>> MinComparer, IComparer<Documents.Routing.Range<string>> MaxComparer) GetComparers(bool useLengthAwareComparison)
108106
{
109-
return isMinComparer
110-
? (useLengthAwareComparison ? Documents.Routing.Range<string>.LengthAwareMinComparer.Instance : Documents.Routing.Range<string>.MinComparer.Instance)
111-
: (useLengthAwareComparison ? Documents.Routing.Range<string>.LengthAwareMaxComparer.Instance : Documents.Routing.Range<string>.MaxComparer.Instance);
107+
return useLengthAwareComparison
108+
? (Documents.Routing.Range<string>.LengthAwareMinComparer.Instance, Documents.Routing.Range<string>.LengthAwareMaxComparer.Instance)
109+
: (Documents.Routing.Range<string>.MinComparer.Instance, Documents.Routing.Range<string>.MaxComparer.Instance);
112110
}
113111
}
114112
}

Microsoft.Azure.Cosmos/src/Routing/CollectionRoutingMap.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ internal sealed class CollectionRoutingMap
3333

3434
internal int HighestNonOfflinePkRangeId { get; private set; }
3535

36+
private bool isLengthAwareComparisonEnabled = false;
37+
3638
private CollectionRoutingMap(
3739
Dictionary<string, Tuple<PartitionKeyRange, ServiceIdentity>> rangeById,
3840
List<PartitionKeyRange> orderedPartitionKeyRanges,
@@ -72,6 +74,8 @@ private CollectionRoutingMap(
7274
return range.Status == PartitionKeyRangeStatus.Offline ? CollectionRoutingMap.InvalidPkRangeId : pkId;
7375
});
7476
this.partitionKeyDefinition = partitionKeyDefinition;
77+
78+
this.isLengthAwareComparisonEnabled = ConfigurationManager.IsLengthAwareRangeComparatorEnabled();
7579
}
7680

7781
public static CollectionRoutingMap TryCreateCompleteRoutingMap(
@@ -129,11 +133,9 @@ public IReadOnlyList<PartitionKeyRange> GetOverlappingRanges(IReadOnlyList<Range
129133

130134
SortedList<string, PartitionKeyRange> partitionRanges = new SortedList<string, PartitionKeyRange>();
131135

132-
bool isLengthAwareComparisonEnabled = ConfigurationManager.IsLengthAwareRangeComparatorEnabled();
133-
134136
bool useLengthAwareComparison = false;
135137
// Enable length-aware comparison for provided partition EPK ranges only when the container uses a hierarchical partition key (MultiHash).
136-
if (isLengthAwareComparisonEnabled && this.partitionKeyDefinition != null && this.partitionKeyDefinition.Kind == PartitionKind.MultiHash && this.partitionKeyDefinition.Paths.Count > 1)
138+
if (this.isLengthAwareComparisonEnabled && this.partitionKeyDefinition != null && this.partitionKeyDefinition.Kind == PartitionKind.MultiHash && this.partitionKeyDefinition.Paths.Count > 1)
137139
{
138140
useLengthAwareComparison = true;
139141
}
@@ -142,15 +144,13 @@ public IReadOnlyList<PartitionKeyRange> GetOverlappingRanges(IReadOnlyList<Range
142144
// Then within that two positions, check for overlapping partition key ranges
143145
foreach (Range<string> providedRange in providedPartitionKeyRanges)
144146
{
145-
IComparer<Range<string>> minComparer = this.GetComparer(isMinComparer: true, useLengthAwareComparison: useLengthAwareComparison);
147+
(IComparer<Range<string>> minComparer, IComparer<Range<string>> maxComparer) = this.GetComparers(useLengthAwareComparison);
146148
int minIndex = this.orderedRanges.BinarySearch(providedRange, minComparer);
147149
if (minIndex < 0)
148150
{
149151
minIndex = Math.Max(0, (~minIndex) - 1);
150152
}
151153

152-
IComparer<Range<string>> maxComparer = this.GetComparer(isMinComparer: false, useLengthAwareComparison: useLengthAwareComparison);
153-
154154
int maxIndex = this.orderedRanges.BinarySearch(providedRange, maxComparer);
155155
if (maxIndex < 0)
156156
{
@@ -169,11 +169,11 @@ public IReadOnlyList<PartitionKeyRange> GetOverlappingRanges(IReadOnlyList<Range
169169
return new ReadOnlyCollection<PartitionKeyRange>(partitionRanges.Values);
170170
}
171171

172-
private IComparer<Range<string>> GetComparer(bool isMinComparer, bool useLengthAwareComparison)
172+
private (IComparer<Range<string>> MinComparer, IComparer<Range<string>> MaxComparer) GetComparers(bool useLengthAwareComparison)
173173
{
174-
return isMinComparer
175-
? (useLengthAwareComparison ? Range<string>.LengthAwareMinComparer.Instance : Range<string>.MinComparer.Instance)
176-
: (useLengthAwareComparison ? Range<string>.LengthAwareMaxComparer.Instance : Range<string>.MaxComparer.Instance);
174+
return useLengthAwareComparison
175+
? (Range<string>.LengthAwareMinComparer.Instance, Range<string>.LengthAwareMaxComparer.Instance)
176+
: (Range<string>.MinComparer.Instance, Range<string>.MaxComparer.Instance);
177177
}
178178

179179
public PartitionKeyRange GetRangeByEffectivePartitionKey(string effectivePartitionKeyValue)

Microsoft.Azure.Cosmos/src/Routing/PartitionRoutingHelper.cs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ namespace Microsoft.Azure.Cosmos.Routing
2424

2525
internal class PartitionRoutingHelper
2626
{
27+
private static readonly bool IsLengthAwareComparisonEnabled = ConfigurationManager.IsLengthAwareRangeComparatorEnabled();
2728
public static IReadOnlyList<Range<string>> GetProvidedPartitionKeyRanges(
2829
string querySpecJsonString,
2930
bool enableCrossPartitionQuery,
@@ -233,15 +234,14 @@ await routingMapProvider.TryGetRangeByEffectivePartitionKeyAsync(
233234
return new ResolvedRangeInfo(lastPartitionKeyRange, suppliedTokens);
234235
}
235236

236-
bool isLengthAwareComparisonEnabled = ConfigurationManager.IsLengthAwareRangeComparatorEnabled();
237237
bool useLengthAwareComparison = false;
238238
// Enable length-aware comparison for provided partition EPK ranges only when the container uses a hierarchical partition key (MultiHash).
239-
if (isLengthAwareComparisonEnabled && partitionKeyDefinition != null && partitionKeyDefinition.Kind == PartitionKind.MultiHash && partitionKeyDefinition.Paths.Count > 1)
239+
if (IsLengthAwareComparisonEnabled && partitionKeyDefinition != null && partitionKeyDefinition.Kind == PartitionKind.MultiHash && partitionKeyDefinition.Paths.Count > 1)
240240
{
241241
useLengthAwareComparison = true;
242242
}
243243

244-
IComparer<Range<string>> minComparer = this.GetComparer(isMinComparer: true, useLengthAwareComparison);
244+
(IComparer<Range<string>> minComparer, _) = this.GetComparers(useLengthAwareComparison);
245245

246246
Range<string> minimumRange = PartitionRoutingHelper.Min(
247247
providedPartitionKeyRanges,
@@ -362,13 +362,13 @@ public virtual async Task<bool> TryAddPartitionKeyRangeToContinuationTokenAsync(
362362
// We only need to get the next range if we have to
363363
if (string.IsNullOrEmpty(backendResponseHeaders[HttpConstants.HttpHeaders.Continuation]))
364364
{
365-
bool isLengthAwareComparisonEnabled = ConfigurationManager.IsLengthAwareRangeComparatorEnabled();
366365
bool useLengthAwareComparison = false;
367366
// Enable length-aware comparison for provided partition EPK ranges only when the container uses a hierarchical partition key (MultiHash).
368-
if (isLengthAwareComparisonEnabled && partitionKeyDefinition != null && partitionKeyDefinition.Kind == PartitionKind.MultiHash && partitionKeyDefinition.Paths.Count > 1)
367+
if (IsLengthAwareComparisonEnabled && partitionKeyDefinition != null && partitionKeyDefinition.Kind == PartitionKind.MultiHash && partitionKeyDefinition.Paths.Count > 1)
369368
{
370369
useLengthAwareComparison = true;
371370
}
371+
(IComparer<Range<string>> minComparer, IComparer<Range<string>> maxComparer) = this.GetComparers(useLengthAwareComparison);
372372

373373
if (direction == RntdbEnumerationDirection.Reverse)
374374
{
@@ -379,14 +379,14 @@ public virtual async Task<bool> TryAddPartitionKeyRangeToContinuationTokenAsync(
379379
trace, partitionKeyDefinition,
380380
false)).ToList(),
381381
currentRange,
382-
this.GetComparer(isMinComparer: true, useLengthAwareComparison: useLengthAwareComparison));
382+
minComparer);
383383
}
384384
else
385385
{
386386
Range<string> nextProvidedRange = PartitionRoutingHelper.MinAfter(
387387
providedPartitionKeyRanges,
388388
currentRange.ToRange(),
389-
this.GetComparer(isMinComparer: false, useLengthAwareComparison: useLengthAwareComparison));
389+
maxComparer);
390390

391391
if (nextProvidedRange == null)
392392
{
@@ -592,11 +592,12 @@ private static PartitionKeyRange MinBefore(IReadOnlyList<PartitionKeyRange> valu
592592
return min;
593593
}
594594

595-
private IComparer<Range<string>> GetComparer(bool isMinComparer, bool useLengthAwareComparison)
595+
private (IComparer<Range<string>> minComparer, IComparer<Range<string>> maxComparer) GetComparers(bool useLengthAwareComparison)
596596
{
597-
return isMinComparer
598-
? (useLengthAwareComparison ? Range<string>.LengthAwareMinComparer.Instance : Range<string>.MinComparer.Instance)
599-
: (useLengthAwareComparison ? Range<string>.LengthAwareMaxComparer.Instance : Range<string>.MaxComparer.Instance);
597+
return (
598+
useLengthAwareComparison ? Range<string>.LengthAwareMinComparer.Instance : Range<string>.MinComparer.Instance,
599+
useLengthAwareComparison ? Range<string>.LengthAwareMaxComparer.Instance : Range<string>.MaxComparer.Instance
600+
);
600601
}
601602

602603
public readonly struct ResolvedRangeInfo

0 commit comments

Comments
 (0)