Esempio n. 1
0
            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);
                }
Esempio n. 5
0
            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));
            }
Esempio n. 6
0
        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);
                }