public static bool TryParse(CosmosElement value, out TakeContinuationToken takeContinuationToken) { if (value == null) { throw new ArgumentNullException(nameof(value)); } if (!(value is CosmosObject continuationToken)) { takeContinuationToken = default; return(false); } if (!continuationToken.TryGetValue(TakeContinuationToken.PropertyNames.TakeCount, out CosmosNumber takeCount)) { takeContinuationToken = default; return(false); } if (!continuationToken.TryGetValue(TakeContinuationToken.PropertyNames.SourceToken, out CosmosElement sourceToken)) { takeContinuationToken = default; return(false); } takeContinuationToken = new TakeContinuationToken(Number64.ToLong(takeCount.Value), sourceToken); return(true); }
public override async ValueTask <bool> MoveNextAsync(ITrace trace) { this.cancellationToken.ThrowIfCancellationRequested(); if (trace == null) { throw new ArgumentNullException(nameof(trace)); } if (this.ReturnedFinalPage || !await this.inputStage.MoveNextAsync(trace)) { this.Current = default; this.takeCount = 0; return(false); } TryCatch <QueryPage> tryGetSourcePage = this.inputStage.Current; if (tryGetSourcePage.Failed) { this.Current = tryGetSourcePage; return(true); } QueryPage sourcePage = tryGetSourcePage.Result; List <CosmosElement> takedDocuments = sourcePage.Documents.Take(this.takeCount).ToList(); this.takeCount -= takedDocuments.Count; QueryState queryState; if (sourcePage.State != null) { TakeContinuationToken takeContinuationToken = new TakeContinuationToken( takeCount: this.takeCount, sourceToken: sourcePage.State.Value); queryState = new QueryState(TakeContinuationToken.ToCosmosElement(takeContinuationToken)); } else { queryState = default; } QueryPage queryPage = new QueryPage( documents: takedDocuments, requestCharge: sourcePage.RequestCharge, activityId: sourcePage.ActivityId, responseLengthInBytes: sourcePage.ResponseLengthInBytes, cosmosQueryExecutionInfo: sourcePage.CosmosQueryExecutionInfo, disallowContinuationTokenMessage: sourcePage.DisallowContinuationTokenMessage, additionalHeaders: sourcePage.AdditionalHeaders, state: queryState); this.Current = TryCatch <QueryPage> .FromResult(queryPage); return(true); }
private static TryCatch <IQueryPipelineStage> MonadicCreate( int takeCount, CosmosElement requestContinuationToken, CancellationToken cancellationToken, MonadicCreatePipelineStage monadicCreatePipelineStage) { if (takeCount < 0) { throw new ArgumentException($"{nameof(takeCount)}: {takeCount} must be a non negative number."); } if (monadicCreatePipelineStage == null) { throw new ArgumentNullException(nameof(monadicCreatePipelineStage)); } TakeContinuationToken takeContinuationToken; if (requestContinuationToken != null) { if (!TakeContinuationToken.TryParse(requestContinuationToken, out takeContinuationToken)) { return(TryCatch <IQueryPipelineStage> .FromException( new MalformedContinuationTokenException( $"Malformed {nameof(TakeContinuationToken)}: {requestContinuationToken}."))); } } else { takeContinuationToken = new TakeContinuationToken(takeCount, sourceToken: null); } if (takeContinuationToken.TakeCount > takeCount) { return(TryCatch <IQueryPipelineStage> .FromException( new MalformedContinuationTokenException( $"{nameof(TakeContinuationToken.TakeCount)} in {nameof(TakeContinuationToken)}: {requestContinuationToken}: {takeContinuationToken.TakeCount} can not be greater than the limit count in the query: {takeCount}."))); } TryCatch <IQueryPipelineStage> tryCreateSource = monadicCreatePipelineStage(takeContinuationToken.SourceToken, cancellationToken); if (tryCreateSource.Failed) { return(tryCreateSource); } IQueryPipelineStage stage = new ComputeTakeQueryPipelineStage( tryCreateSource.Result, cancellationToken, takeContinuationToken.TakeCount); return(TryCatch <IQueryPipelineStage> .FromResult(stage)); }
public static CosmosElement ToCosmosElement(TakeContinuationToken takeContinuationToken) { Dictionary <string, CosmosElement> dictionary = new Dictionary <string, CosmosElement>() { { TakeContinuationToken.PropertyNames.SourceToken, takeContinuationToken.SourceToken }, { TakeContinuationToken.PropertyNames.TakeCount, CosmosNumber64.Create(takeContinuationToken.TakeCount) }, }; return(CosmosObject.Create(dictionary)); }
public static async Task <TryCatch <IDocumentQueryExecutionComponent> > TryCreateAsync( int takeCount, CosmosElement requestContinuationToken, Func <CosmosElement, Task <TryCatch <IDocumentQueryExecutionComponent> > > tryCreateSourceAsync) { if (takeCount < 0) { throw new ArgumentException($"{nameof(takeCount)}: {takeCount} must be a non negative number."); } if (tryCreateSourceAsync == null) { throw new ArgumentNullException(nameof(tryCreateSourceAsync)); } TakeContinuationToken takeContinuationToken; if (requestContinuationToken != null) { if (!TakeContinuationToken.TryParse(requestContinuationToken, out takeContinuationToken)) { return(TryCatch <IDocumentQueryExecutionComponent> .FromException( new MalformedContinuationTokenException($"Malformed {nameof(TakeContinuationToken)}: {requestContinuationToken}."))); } } else { takeContinuationToken = new TakeContinuationToken(takeCount, sourceToken: null); } if (takeContinuationToken.TakeCount > takeCount) { return(TryCatch <IDocumentQueryExecutionComponent> .FromException( new MalformedContinuationTokenException($"{nameof(TakeContinuationToken.TakeCount)} in {nameof(TakeContinuationToken)}: {requestContinuationToken}: {takeContinuationToken.TakeCount} can not be greater than the limit count in the query: {takeCount}."))); } return((await tryCreateSourceAsync(takeContinuationToken.SourceToken)) .Try <IDocumentQueryExecutionComponent>((source) => new ComputeTakeDocumentQueryExecutionComponent( source, takeContinuationToken.TakeCount))); }