public async Task FeedRangePKRangeId_GetPartitionKeyRangesAsync() { Documents.PartitionKeyRange partitionKeyRange = new Documents.PartitionKeyRange() { Id = Guid.NewGuid().ToString(), MinInclusive = "AA", MaxExclusive = "BB" }; FeedRangePartitionKeyRange feedRangePartitionKeyRange = new FeedRangePartitionKeyRange(partitionKeyRange.Id); IEnumerable <string> pkRanges = await feedRangePartitionKeyRange.GetPartitionKeyRangesAsync(Mock.Of <Routing.IRoutingMapProvider>(), null, null, default(CancellationToken)); Assert.AreEqual(1, pkRanges.Count()); Assert.AreEqual(partitionKeyRange.Id, pkRanges.First()); }
public void FeedRangePKRangeId_RequestVisitor() { Documents.PartitionKeyRange partitionKeyRange = new Documents.PartitionKeyRange() { Id = Guid.NewGuid().ToString(), MinInclusive = "AA", MaxExclusive = "BB" }; FeedRangePartitionKeyRange feedRangePartitionKeyRange = new FeedRangePartitionKeyRange(partitionKeyRange.Id); RequestMessage requestMessage = new RequestMessage(); feedRangePartitionKeyRange.Accept(FeedRangeRequestMessagePopulatorVisitor.Singleton, requestMessage); Assert.IsNotNull(requestMessage.PartitionKeyRangeId); Assert.IsFalse(requestMessage.IsPartitionKeyRangeHandlerRequired); }
public async Task GetPartitionKeyRangesAsync_WithPKRangeIdToken() { DocumentFeedResponse <Documents.PartitionKeyRange> ranges = await this.Container.ClientContext.DocumentClient.ReadPartitionKeyRangeFeedAsync(this.Container.LinkUri); FeedRange feedToken = new FeedRangePartitionKeyRange(ranges.First().Id); List <string> resolvedRanges = (await this.Container.GetPartitionKeyRangesAsync(feedToken)).ToList(); Assert.AreEqual(1, resolvedRanges.Count); foreach (string id in resolvedRanges) { Assert.IsTrue(ranges.Any(range => range.Id == id)); } }
public async Task FeedRangePKRangeId_GetEffectiveRangesAsync_Null() { Documents.PartitionKeyRange partitionKeyRange = new Documents.PartitionKeyRange() { Id = Guid.NewGuid().ToString(), MinInclusive = "AA", MaxExclusive = "BB" }; FeedRangePartitionKeyRange feedRangePartitionKeyRange = new FeedRangePartitionKeyRange(partitionKeyRange.Id); Routing.IRoutingMapProvider routingProvider = Mock.Of <Routing.IRoutingMapProvider>(); Mock.Get(routingProvider) .SetupSequence(f => f.TryGetPartitionKeyRangeByIdAsync(It.IsAny <string>(), It.IsAny <string>(), It.Is <bool>(b => true))) .ReturnsAsync((Documents.PartitionKeyRange)null) .ReturnsAsync((Documents.PartitionKeyRange)null); List <Documents.Routing.Range <string> > ranges = await feedRangePartitionKeyRange.GetEffectiveRangesAsync(routingProvider, null, null); }
public async Task FeedRangePKRangeId_GetEffectiveRangesAsync_Null() { Documents.PartitionKeyRange partitionKeyRange = new Documents.PartitionKeyRange() { Id = Guid.NewGuid().ToString(), MinInclusive = "AA", MaxExclusive = "BB" }; FeedRangePartitionKeyRange feedRangePartitionKeyRange = new FeedRangePartitionKeyRange(partitionKeyRange.Id); IRoutingMapProvider routingProvider = Mock.Of <IRoutingMapProvider>(); Mock.Get(routingProvider) .SetupSequence(f => f.TryGetPartitionKeyRangeByIdAsync(It.IsAny <string>(), It.IsAny <string>(), It.Is <bool>(b => true))) .ReturnsAsync((Documents.PartitionKeyRange)null) .ReturnsAsync((Documents.PartitionKeyRange)null); CosmosException exception = await Assert.ThrowsExceptionAsync <CosmosException>(() => feedRangePartitionKeyRange.GetEffectiveRangesAsync(routingProvider, null, null)); Assert.AreEqual(HttpStatusCode.Gone, exception.StatusCode); Assert.AreEqual((int)Documents.SubStatusCodes.PartitionKeyRangeGone, exception.SubStatusCode); }
public async Task FeedRangePKRangeId_GetEffectiveRangesAsync() { Documents.PartitionKeyRange partitionKeyRange = new Documents.PartitionKeyRange() { Id = Guid.NewGuid().ToString(), MinInclusive = "AA", MaxExclusive = "BB" }; FeedRangePartitionKeyRange feedRangePartitionKeyRange = new FeedRangePartitionKeyRange(partitionKeyRange.Id); Routing.IRoutingMapProvider routingProvider = Mock.Of <Routing.IRoutingMapProvider>(); Mock.Get(routingProvider) .Setup(f => f.TryGetPartitionKeyRangeByIdAsync(It.IsAny <string>(), It.Is <string>(s => s == partitionKeyRange.Id), It.IsAny <bool>())) .ReturnsAsync(partitionKeyRange); List <Documents.Routing.Range <string> > ranges = await feedRangePartitionKeyRange.GetEffectiveRangesAsync(routingProvider, null, null); Assert.AreEqual(1, ranges.Count); Assert.AreEqual(partitionKeyRange.ToRange().Min, ranges[0].Min); Assert.AreEqual(partitionKeyRange.ToRange().Max, ranges[0].Max); }
public async Task FeedRangeEPK_GetPartitionKeyRangesAsync() { Documents.Routing.Range <string> range = new Documents.Routing.Range <string>("AA", "BB", true, false); Documents.PartitionKeyRange partitionKeyRange = new Documents.PartitionKeyRange() { Id = Guid.NewGuid().ToString(), MinInclusive = range.Min, MaxExclusive = range.Max }; FeedRangePartitionKeyRange feedRangePartitionKeyRange = new FeedRangePartitionKeyRange(partitionKeyRange.Id); IRoutingMapProvider routingProvider = Mock.Of <IRoutingMapProvider>(); Mock.Get(routingProvider) .Setup(f => f.TryGetOverlappingRangesAsync(It.IsAny <string>(), It.Is <Documents.Routing.Range <string> >(s => s == range), It.IsAny <ITrace>(), It.IsAny <bool>())) .ReturnsAsync(new List <Documents.PartitionKeyRange>() { partitionKeyRange }); FeedRangeEpk FeedRangeEpk = new FeedRangeEpk(range); IEnumerable <string> pkRanges = await FeedRangeEpk.GetPartitionKeyRangesAsync(routingProvider, null, null, default, NoOpTrace.Singleton);
public static ChangeFeedPartitionKeyResultSetIteratorCore BuildResultSetIterator( string partitionKeyRangeId, string continuationToken, int?maxItemCount, ContainerInternal container, DateTime?startTime, bool startFromBeginning) { FeedRangeInternal feedRange = new FeedRangePartitionKeyRange(partitionKeyRangeId); ChangeFeedStartFrom startFrom; if (continuationToken != null) { // For continuation based feed range we need to manufactor a new continuation token that has the partition key range id in it. startFrom = new ChangeFeedStartFromContinuationAndFeedRange(continuationToken, feedRange); } else if (startTime.HasValue) { startFrom = ChangeFeedStartFrom.Time(startTime.Value, feedRange); } else if (startFromBeginning) { startFrom = ChangeFeedStartFrom.Beginning(feedRange); } else { startFrom = ChangeFeedStartFrom.Now(feedRange); } ChangeFeedRequestOptions requestOptions = new ChangeFeedRequestOptions() { PageSizeHint = maxItemCount, }; return(new ChangeFeedPartitionKeyResultSetIteratorCore( clientContext: container.ClientContext, container: container, changeFeedStartFrom: startFrom, options: requestOptions)); }
public async Task FeedRangeEPK_GetPartitionKeyRangesAsync() { Documents.Routing.Range <string> range = new Documents.Routing.Range <string>("AA", "BB", true, false); Documents.PartitionKeyRange partitionKeyRange = new Documents.PartitionKeyRange() { Id = Guid.NewGuid().ToString(), MinInclusive = range.Min, MaxExclusive = range.Max }; FeedRangePartitionKeyRange feedRangePartitionKeyRange = new FeedRangePartitionKeyRange(partitionKeyRange.Id); IRoutingMapProvider routingProvider = Mock.Of <IRoutingMapProvider>(); Mock.Get(routingProvider) .Setup(f => f.TryGetOverlappingRangesAsync(It.IsAny <string>(), It.Is <Documents.Routing.Range <string> >(s => s == range), It.IsAny <bool>())) .ReturnsAsync(new List <Documents.PartitionKeyRange>() { partitionKeyRange }); FeedRangeEpk feedRangeEPK = new FeedRangeEpk(range); IEnumerable <string> pkRanges = await feedRangeEPK.GetPartitionKeyRangesAsync(routingProvider, null, null, default(CancellationToken)); Assert.AreEqual(1, pkRanges.Count()); Assert.AreEqual(partitionKeyRange.Id, pkRanges.First()); }
public async Task FeedRange_PKRangeId_Serialization() { string continuationToken = "TBD"; string containerRid = Guid.NewGuid().ToString(); DocumentFeedResponse <Documents.PartitionKeyRange> ranges = await this.Container.ClientContext.DocumentClient.ReadPartitionKeyRangeFeedAsync(this.Container.LinkUri); Documents.PartitionKeyRange oneRange = ranges.First(); FeedRangePartitionKeyRange original = new FeedRangePartitionKeyRange(oneRange.Id); FeedRangeCompositeContinuation feedRangeSimpleContinuation = new FeedRangeCompositeContinuation(containerRid, original, new List <Documents.Routing.Range <string> >() { oneRange.ToRange() }, continuationToken); string serialized = feedRangeSimpleContinuation.ToString(); Assert.IsTrue(FeedRangeContinuation.TryParse(serialized, out FeedRangeContinuation feedRangeContinuation)); FeedRangeCompositeContinuation deserialized = feedRangeContinuation as FeedRangeCompositeContinuation; FeedRangePartitionKeyRange deserializedFeedRange = deserialized.FeedRange as FeedRangePartitionKeyRange; Assert.IsNotNull(deserialized, "Error deserializing to FeedRangePartitionKeyRange"); Assert.AreEqual(original.PartitionKeyRangeId, deserializedFeedRange.PartitionKeyRangeId); Assert.AreEqual(continuationToken, deserialized.GetContinuation()); }
public void Visit(FeedRangePartitionKeyRange feedRange, RequestMessage requestMessage) { requestMessage.PartitionKeyRangeId = new Documents.PartitionKeyRangeIdentity(feedRange.PartitionKeyRangeId); }
internal async Task <(string, ResponseMessage)> ReadNextInternalAsync(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); if (this.compositeContinuationToken == null) { PartitionKeyRangeCache pkRangeCache = await this.clientContext.DocumentClient.GetPartitionKeyRangeCacheAsync(); this.containerRid = await this.container.GetRIDAsync(cancellationToken); if (this.changeFeedStartFrom is ChangeFeedStartFromContinuation startFromContinuation) { this.compositeContinuationToken = await StandByFeedContinuationToken.CreateAsync( this.containerRid, startFromContinuation.Continuation, pkRangeCache.TryGetOverlappingRangesAsync); (CompositeContinuationToken token, string id) = await this.compositeContinuationToken.GetCurrentTokenAsync(); if (token.Token != null) { this.changeFeedStartFrom = ChangeFeedStartFrom.ContinuationToken(token.Token); } else { this.changeFeedStartFrom = ChangeFeedStartFrom.Beginning(); } } else { this.compositeContinuationToken = await StandByFeedContinuationToken.CreateAsync( this.containerRid, initialStandByFeedContinuationToken : null, pkRangeCache.TryGetOverlappingRangesAsync); } } (CompositeContinuationToken currentRangeToken, string rangeId) = await this.compositeContinuationToken.GetCurrentTokenAsync(); FeedRange feedRange = new FeedRangePartitionKeyRange(rangeId); if (currentRangeToken.Token != null) { this.changeFeedStartFrom = new ChangeFeedStartFromContinuationAndFeedRange(currentRangeToken.Token, (FeedRangeInternal)feedRange); } else { this.changeFeedStartFrom = ChangeFeedStartFrom.Beginning(feedRange); } ResponseMessage response = await this.NextResultSetDelegateAsync(this.changeFeedOptions, cancellationToken); if (await this.ShouldRetryFailureAsync(response, cancellationToken)) { return(await this.ReadNextInternalAsync(cancellationToken)); } if (response.IsSuccessStatusCode || response.StatusCode == HttpStatusCode.NotModified) { // Change Feed read uses Etag for continuation currentRangeToken.Token = response.Headers.ETag; } return(rangeId, response); }