com.microsoft.azure.documentdb.internal.routing.RoutingMapProviderHelper Maven / Gradle / Ivy
package com.microsoft.azure.documentdb.internal.routing;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.microsoft.azure.documentdb.PartitionKeyRange;
/**
* Provide utility functionality to route request in direct connectivity mode in the Azure Cosmos DB database service.
*/
public final class RoutingMapProviderHelper {
private static final Range.MaxComparator MAX_COMPARATOR = new Range.MaxComparator();
private static String max(String left, String right) {
return left.compareTo(right) < 0 ? right : left;
}
private static > boolean IsSortedAndNonOverlapping(List> list) {
for (int i = 1; i < list.size(); i++) {
Range previousRange = list.get(i - 1);
Range currentRange = list.get(i);
int compareResult = previousRange.getMax().compareTo(currentRange.getMin());
if (compareResult > 0) {
return false;
} else if (compareResult == 0 && previousRange.isMaxInclusive() && currentRange.isMinInclusive()) {
return false;
}
}
return true;
}
public static Collection getOverlappingRanges(RoutingMapProvider routingMapProvider,
String collectionSelfLink, List> sortedRanges) {
if (!IsSortedAndNonOverlapping(sortedRanges)) {
throw new IllegalArgumentException("sortedRanges");
}
List targetRanges = new ArrayList();
int currentProvidedRange = 0;
while (currentProvidedRange < sortedRanges.size()) {
if (sortedRanges.get(currentProvidedRange).isEmpty()) {
currentProvidedRange++;
continue;
}
Range queryRange;
if (!targetRanges.isEmpty()) {
String left = max(targetRanges.get(targetRanges.size() - 1).getMaxExclusive(),
sortedRanges.get(currentProvidedRange).getMin());
boolean leftInclusive = left.compareTo(sortedRanges.get(currentProvidedRange).getMin()) == 0
? sortedRanges.get(currentProvidedRange).isMinInclusive() : false;
queryRange = new Range(left, sortedRanges.get(currentProvidedRange).getMax(), leftInclusive,
sortedRanges.get(currentProvidedRange).isMaxInclusive());
} else {
queryRange = sortedRanges.get(currentProvidedRange);
}
targetRanges.addAll(routingMapProvider.getOverlappingRanges(collectionSelfLink, queryRange, false));
Range lastKnownTargetRange = targetRanges.get(targetRanges.size() - 1).toRange();
while (currentProvidedRange < sortedRanges.size()
&& MAX_COMPARATOR.compare(sortedRanges.get(currentProvidedRange), lastKnownTargetRange) <= 0) {
currentProvidedRange++;
}
}
return targetRanges;
}
}