public static bool TryParse( string serializedContinuationToken, out AggregateContinuationToken aggregateContinuationToken) { if (serializedContinuationToken == null) { throw new ArgumentNullException(nameof(serializedContinuationToken)); } if (!CosmosElement.TryParse <CosmosObject>(serializedContinuationToken, out CosmosObject rawAggregateContinuationToken)) { aggregateContinuationToken = default; return(false); } CosmosElement rawSingleGroupAggregatorContinuationToken = rawAggregateContinuationToken[AggregateContinuationToken.SingleGroupAggregatorContinuationTokenName]; if (!(rawSingleGroupAggregatorContinuationToken is CosmosString singleGroupAggregatorContinuationToken)) { aggregateContinuationToken = default; return(false); } CosmosElement rawSourceContinuationToken = rawAggregateContinuationToken[AggregateContinuationToken.SourceContinuationTokenName]; if (!(rawSourceContinuationToken is CosmosString sourceContinuationToken)) { aggregateContinuationToken = default; return(false); } aggregateContinuationToken = new AggregateContinuationToken(rawAggregateContinuationToken); return(true); }
public static async Task <TryCatch <IDocumentQueryExecutionComponent> > TryCreateAsync( AggregateOperator[] aggregates, IReadOnlyDictionary <string, AggregateOperator?> aliasToAggregateType, IReadOnlyList <string> orderedAliases, bool hasSelectValue, string requestContinuation, Func <string, Task <TryCatch <IDocumentQueryExecutionComponent> > > tryCreateSourceAsync) { string sourceContinuationToken; string singleGroupAggregatorContinuationToken; if (requestContinuation != null) { if (!AggregateContinuationToken.TryParse(requestContinuation, out AggregateContinuationToken aggregateContinuationToken)) { return(TryCatch <IDocumentQueryExecutionComponent> .FromException( new MalformedContinuationTokenException($"Malfomed {nameof(AggregateContinuationToken)}: '{requestContinuation}'"))); } sourceContinuationToken = aggregateContinuationToken.SourceContinuationToken; singleGroupAggregatorContinuationToken = aggregateContinuationToken.SingleGroupAggregatorContinuationToken; } else { sourceContinuationToken = null; singleGroupAggregatorContinuationToken = null; } TryCatch <SingleGroupAggregator> tryCreateSingleGroupAggregator = SingleGroupAggregator.TryCreate( aggregates, aliasToAggregateType, orderedAliases, hasSelectValue, singleGroupAggregatorContinuationToken); if (!tryCreateSingleGroupAggregator.Succeeded) { return(TryCatch <IDocumentQueryExecutionComponent> .FromException( tryCreateSingleGroupAggregator.Exception)); } return((await tryCreateSourceAsync(sourceContinuationToken)).Try <IDocumentQueryExecutionComponent>((source) => { return new ComputeAggregateDocumentQueryExecutionComponent( source, tryCreateSingleGroupAggregator.Result, hasSelectValue); })); }
public static CosmosElement ToCosmosElement(AggregateContinuationToken aggregateContinuationToken) { Dictionary <string, CosmosElement> dictionary = new Dictionary <string, CosmosElement>() { { AggregateContinuationToken.SourceTokenName, aggregateContinuationToken.SourceContinuationToken }, { AggregateContinuationToken.AggregationTokenName, aggregateContinuationToken.SingleGroupAggregatorContinuationToken } }; return(CosmosObject.Create(dictionary)); }
public static TryCatch <IQueryPipelineStage> MonadicCreate( IReadOnlyList <AggregateOperator> aggregates, IReadOnlyDictionary <string, AggregateOperator?> aliasToAggregateType, IReadOnlyList <string> orderedAliases, bool hasSelectValue, CosmosElement continuationToken, CancellationToken cancellationToken, MonadicCreatePipelineStage monadicCreatePipelineStage) { cancellationToken.ThrowIfCancellationRequested(); AggregateContinuationToken aggregateContinuationToken; if (continuationToken != null) { if (!AggregateContinuationToken.TryCreateFromCosmosElement( continuationToken, out aggregateContinuationToken)) { return(TryCatch <IQueryPipelineStage> .FromException( new MalformedContinuationTokenException( $"Malfomed {nameof(AggregateContinuationToken)}: '{continuationToken}'"))); } } else { aggregateContinuationToken = new AggregateContinuationToken(singleGroupAggregatorContinuationToken: null, sourceContinuationToken: null); } TryCatch <SingleGroupAggregator> tryCreateSingleGroupAggregator = SingleGroupAggregator.TryCreate( aggregates, aliasToAggregateType, orderedAliases, hasSelectValue, aggregateContinuationToken.SingleGroupAggregatorContinuationToken); if (tryCreateSingleGroupAggregator.Failed) { return(TryCatch <IQueryPipelineStage> .FromException(tryCreateSingleGroupAggregator.Exception)); } TryCatch <IQueryPipelineStage> tryCreateSource; if (aggregateContinuationToken.SourceContinuationToken is CosmosString stringToken && (stringToken.Value == DoneSourceToken.Value)) { tryCreateSource = TryCatch <IQueryPipelineStage> .FromResult(EmptyQueryPipelineStage.Singleton); }
public static async Task <IDocumentQueryExecutionComponent> CreateAsync( CosmosQueryClient queryClient, AggregateOperator[] aggregates, IReadOnlyDictionary <string, AggregateOperator?> aliasToAggregateType, IReadOnlyList <string> orderedAliases, bool hasSelectValue, string requestContinuation, Func <string, Task <IDocumentQueryExecutionComponent> > createSourceCallback) { string sourceContinuationToken; string singleGroupAggregatorContinuationToken; if (requestContinuation != null) { if (!AggregateContinuationToken.TryParse(requestContinuation, out AggregateContinuationToken aggregateContinuationToken)) { throw queryClient.CreateBadRequestException($"Malfomed {nameof(AggregateContinuationToken)}: '{requestContinuation}'"); } sourceContinuationToken = aggregateContinuationToken.SourceContinuationToken; singleGroupAggregatorContinuationToken = aggregateContinuationToken.SingleGroupAggregatorContinuationToken; } else { sourceContinuationToken = null; singleGroupAggregatorContinuationToken = null; } IDocumentQueryExecutionComponent source = await createSourceCallback(sourceContinuationToken); SingleGroupAggregator singleGroupAggregator = SingleGroupAggregator.Create( queryClient, aggregates, aliasToAggregateType, orderedAliases, hasSelectValue, singleGroupAggregatorContinuationToken); return(new ComputeAggregateDocumentQueryExecutionComponent( source, singleGroupAggregator, hasSelectValue)); }
public override bool TryGetContinuationToken(out string state) { if (this.IsDone) { state = null; return(true); } if (!this.Source.TryGetContinuationToken(out string sourceState)) { state = null; return(false); } AggregateContinuationToken aggregateContinuationToken = AggregateContinuationToken.Create( this.singleGroupAggregator.GetContinuationToken(), sourceState); state = aggregateContinuationToken.ToString(); return(true); }
public static bool TryCreateFromCosmosElement( CosmosElement continuationToken, out AggregateContinuationToken aggregateContinuationToken) { if (continuationToken == null) { throw new ArgumentNullException(nameof(continuationToken)); } if (!(continuationToken is CosmosObject rawAggregateContinuationToken)) { aggregateContinuationToken = default; return(false); } if (!rawAggregateContinuationToken.TryGetValue( AggregateContinuationToken.AggregationTokenName, out CosmosElement singleGroupAggregatorContinuationToken)) { aggregateContinuationToken = default; return(false); } if (!rawAggregateContinuationToken.TryGetValue( AggregateContinuationToken.SourceTokenName, out CosmosElement sourceContinuationToken)) { aggregateContinuationToken = default; return(false); } aggregateContinuationToken = new AggregateContinuationToken( singleGroupAggregatorContinuationToken: singleGroupAggregatorContinuationToken, sourceContinuationToken: sourceContinuationToken); return(true); }