def __init__(self, range_by_id, range_by_info, ordered_partition_key_ranges, ordered_partition_info, collection_unique_id): self._rangeById = range_by_id self._rangeByInfo = range_by_info self._orderedPartitionKeyRanges = ordered_partition_key_ranges self._orderedRanges = [routing_range._Range(pkr[_PartitionKeyRange.MinInclusive], pkr[_PartitionKeyRange.MaxExclusive], True, False) for pkr in ordered_partition_key_ranges] self._orderedPartitionInfo = ordered_partition_info self._collectionUniqueId = collection_unique_id
def test_advanced(self): partition_key_ranges = [{u'id': u'0', u'minInclusive': u'', u'maxExclusive': u'05C1C9CD673398'}, {u'id': u'1', u'minInclusive': u'05C1C9CD673398', u'maxExclusive': u'05C1D9CD673398'}, {u'id': u'2', u'minInclusive': u'05C1D9CD673398', u'maxExclusive': u'05C1E399CD6732'}, {u'id': u'3', u'minInclusive': u'05C1E399CD6732', u'maxExclusive': u'05C1E9CD673398'}, {u'id': u'4', u'minInclusive': u'05C1E9CD673398', u'maxExclusive': u'FF'}] partitionRangeWithInfo = [(r, True) for r in partition_key_ranges] pkRange = routing_range._Range("", "FF", True, False) collection_routing_map = _CollectionRoutingMap.CompleteRoutingMap(partitionRangeWithInfo, 'sample collection id') overlapping_partition_key_ranges = collection_routing_map.get_overlapping_ranges(pkRange) self.assertEqual(len(overlapping_partition_key_ranges), len(partition_key_ranges)) self.assertEqual(overlapping_partition_key_ranges, partition_key_ranges)
def test_empty_ranges(self): # query range is the whole partition key range pkRange = routing_range._Range("", "FF", True, False) overlapping_partition_key_ranges = self.get_overlapping_ranges( [pkRange]) self.assertEqual(len(overlapping_partition_key_ranges), len(self.partition_key_ranges)) self.assertEqual(overlapping_partition_key_ranges, self.partition_key_ranges) # query range list is empty overlapping_partition_key_ranges = self.get_overlapping_ranges([]) self.assertEqual(len(overlapping_partition_key_ranges), 0) # validate the overlaping partition key ranges results for empty ranges is empty empty_start_range = routing_range._Range("", "", False, True) empty_end_range = routing_range._Range("FF", "FF", False, True) empty_range = routing_range._Range("AA", "AA", False, True) self.validate_empty_query_ranges( [empty_range], [empty_start_range], [empty_end_range], [empty_start_range, empty_range], [empty_start_range, empty_end_range], [empty_range, empty_end_range], [empty_range, empty_range, empty_end_range])
def test_empty_ranges_are_thrown_away(self): e1 = routing_range._Range("", "", True, False) r1 = routing_range._Range("", "AB", True, False) e2 = routing_range._Range("AB", "AB", True, False) r2 = routing_range._Range("AB", "AC", True, False) e3 = routing_range._Range("AC", "AC", True, False) e4 = routing_range._Range("AD", "AD", True, False) self.validate_overlapping_ranges_results([e1, r1, e2, r2, e3, e4], self.get_overlapping_ranges( [r1, r2])) self.validate_against_cached_collection_results( [e1, r1, e2, r2, e3, e4])
def _subtract_range(self, r, partition_key_range): """ Evaluates and returns r - partition_key_range :Parameters: partition_key_range (dict): partition key range r (routing_range._Range): query range :Returns: (routing_range._Range): the subtract r - partition_key_range """ left = max(partition_key_range[routing_range._PartitionKeyRange.MaxExclusive], r.min) if left == r.min: leftInclusive = r.isMinInclusive else: leftInclusive = False queryRange = routing_range._Range(left, r.max, leftInclusive, r.isMaxInclusive) return queryRange
def test_complex(self): ranges = [ # all are covered by self.partition_key_ranges[1] routing_range._Range("05C1C9CD673398", "05C1D9CD673391", True, False), routing_range._Range("05C1D9CD673391", "05C1D9CD673392", True, False), routing_range._Range("05C1D9CD673393", "05C1D9CD673395", True, False), routing_range._Range("05C1D9CD673395", "05C1D9CD673395", True, False), # all are covered by self.partition_key_ranges[4]] routing_range._Range("05C1E9CD673398", "05C1E9CD673401", True, False), routing_range._Range("05C1E9CD673402", "05C1E9CD673403", True, False), # empty range routing_range._Range("FF", "FF", True, False), ] self.validate_against_cached_collection_results(ranges) self.validate_overlapping_ranges_results( ranges, [self.partition_key_ranges[1], self.partition_key_ranges[4]])
def test_collection_routing_map(self): Id = 'id' MinInclusive = 'minInclusive' MaxExclusive = 'maxExclusive' partitionKeyRanges = \ [ ({Id : "2", MinInclusive : "0000000050", MaxExclusive : "0000000070"}, 2), ({Id : "0", MinInclusive : "", MaxExclusive : "0000000030"}, 0), ({Id : "1", MinInclusive : "0000000030", MaxExclusive : "0000000050"}, 1), ({Id : "3", MinInclusive : "0000000070", MaxExclusive : "FF"}, 3) ] crm = _CollectionRoutingMap.CompleteRoutingMap(partitionKeyRanges, "") self.assertEqual("0", crm._orderedPartitionKeyRanges[0][Id]) self.assertEqual("1", crm._orderedPartitionKeyRanges[1][Id]) self.assertEqual("2", crm._orderedPartitionKeyRanges[2][Id]) self.assertEqual("3", crm._orderedPartitionKeyRanges[3][Id]) self.assertEqual(0, crm._orderedPartitionInfo[0]) self.assertEqual(1, crm._orderedPartitionInfo[1]) self.assertEqual(2, crm._orderedPartitionInfo[2]) self.assertEqual(3, crm._orderedPartitionInfo[3]) self.assertEqual("0", crm.get_range_by_effective_partition_key("")[Id]) self.assertEqual( "0", crm.get_range_by_effective_partition_key("0000000000")[Id]) self.assertEqual( "1", crm.get_range_by_effective_partition_key("0000000030")[Id]) self.assertEqual( "1", crm.get_range_by_effective_partition_key("0000000031")[Id]) self.assertEqual( "3", crm.get_range_by_effective_partition_key("0000000071")[Id]) self.assertEqual("0", crm.get_range_by_partition_key_range_id("0")[Id]) self.assertEqual("1", crm.get_range_by_partition_key_range_id("1")[Id]) fullRangeMinToMaxRange = routing_range._Range( _CollectionRoutingMap.MinimumInclusiveEffectivePartitionKey, _CollectionRoutingMap.MaximumExclusiveEffectivePartitionKey, True, False) overlappingRanges = crm.get_overlapping_ranges( [fullRangeMinToMaxRange]) self.assertEqual(4, len(overlappingRanges)) onlyParitionRanges = [item[0] for item in partitionKeyRanges] def getKey(r): return r['id'] onlyParitionRanges.sort(key=getKey) self.assertEqual(overlappingRanges, onlyParitionRanges) noPoint = routing_range._Range( _CollectionRoutingMap.MinimumInclusiveEffectivePartitionKey, _CollectionRoutingMap.MinimumInclusiveEffectivePartitionKey, False, False) self.assertEqual(0, len(crm.get_overlapping_ranges([noPoint]))) onePoint = routing_range._Range("0000000040", "0000000040", True, True) overlappingPartitionKeyRanges = crm.get_overlapping_ranges([onePoint]) self.assertEqual(1, len(overlappingPartitionKeyRanges)) self.assertEqual("1", overlappingPartitionKeyRanges[0][Id]) ranges = [ routing_range._Range("0000000040", "0000000045", True, True), routing_range._Range("0000000045", "0000000046", True, True), routing_range._Range("0000000046", "0000000050", True, True) ] overlappingPartitionKeyRanges = crm.get_overlapping_ranges(ranges) self.assertEqual(2, len(overlappingPartitionKeyRanges)) self.assertEqual("1", overlappingPartitionKeyRanges[0][Id]) self.assertEqual("2", overlappingPartitionKeyRanges[1][Id])
def test_collection_routing_map(self): Id = 'id' MinInclusive = 'minInclusive' MaxExclusive = 'maxExclusive' partitionKeyRanges = \ [ ({Id : "2", MinInclusive : "0000000050", MaxExclusive : "0000000070"}, 2), ({Id : "0", MinInclusive : "", MaxExclusive : "0000000030"}, 0), ({Id : "1", MinInclusive : "0000000030", MaxExclusive : "0000000050"}, 1), ({Id : "3", MinInclusive : "0000000070", MaxExclusive : "FF"}, 3) ] crm = _CollectionRoutingMap.CompleteRoutingMap(partitionKeyRanges, "") self.assertEqual("0", crm._orderedPartitionKeyRanges[0][Id]) self.assertEqual("1", crm._orderedPartitionKeyRanges[1][Id]) self.assertEqual("2", crm._orderedPartitionKeyRanges[2][Id]) self.assertEqual("3", crm._orderedPartitionKeyRanges[3][Id]) self.assertEqual(0, crm._orderedPartitionInfo[0]) self.assertEqual(1, crm._orderedPartitionInfo[1]) self.assertEqual(2, crm._orderedPartitionInfo[2]) self.assertEqual(3, crm._orderedPartitionInfo[3]) self.assertEqual("0", crm.get_range_by_effective_partition_key("")[Id]) self.assertEqual("0", crm.get_range_by_effective_partition_key("0000000000")[Id]) self.assertEqual("1", crm.get_range_by_effective_partition_key("0000000030")[Id]) self.assertEqual("1", crm.get_range_by_effective_partition_key("0000000031")[Id]) self.assertEqual("3", crm.get_range_by_effective_partition_key("0000000071")[Id]) self.assertEqual("0", crm.get_range_by_partition_key_range_id("0")[Id]) self.assertEqual("1", crm.get_range_by_partition_key_range_id("1")[Id]) fullRangeMinToMaxRange = routing_range._Range(_CollectionRoutingMap.MinimumInclusiveEffectivePartitionKey, _CollectionRoutingMap.MaximumExclusiveEffectivePartitionKey, True, False) overlappingRanges = crm.get_overlapping_ranges([fullRangeMinToMaxRange]) self.assertEqual(4, len(overlappingRanges)) onlyParitionRanges = [item[0] for item in partitionKeyRanges] def getKey(r): return r['id'] onlyParitionRanges.sort(key = getKey) self.assertEqual(overlappingRanges, onlyParitionRanges) noPoint = routing_range._Range(_CollectionRoutingMap.MinimumInclusiveEffectivePartitionKey, _CollectionRoutingMap.MinimumInclusiveEffectivePartitionKey, False, False) self.assertEqual(0, len(crm.get_overlapping_ranges([noPoint]))) onePoint = routing_range._Range("0000000040", "0000000040", True, True) overlappingPartitionKeyRanges = crm.get_overlapping_ranges([onePoint]); self.assertEqual(1, len(overlappingPartitionKeyRanges)) self.assertEqual("1", overlappingPartitionKeyRanges[0][Id]) ranges = [ routing_range._Range("0000000040", "0000000045", True, True), routing_range._Range("0000000045", "0000000046", True, True), routing_range._Range("0000000046", "0000000050", True, True) ] overlappingPartitionKeyRanges = crm.get_overlapping_ranges(ranges); self.assertEqual(2, len(overlappingPartitionKeyRanges)) self.assertEqual("1", overlappingPartitionKeyRanges[0][Id]) self.assertEqual("2", overlappingPartitionKeyRanges[1][Id])
def test_routing_map_provider(self): collection_link = self.GetDocumentCollectionLink(self.created_db, self.created_collection) partition_key_ranges = list(self.client._ReadPartitionKeyRanges(collection_link)) routing_mp = _PartitionKeyRangeCache(self.client) overlapping_partition_key_ranges = routing_mp.get_overlapping_ranges(collection_link, routing_range._Range("", "FF", True, False)) self.assertEqual(len(overlapping_partition_key_ranges), len(partition_key_ranges)) self.assertEqual(overlapping_partition_key_ranges, partition_key_ranges)