/// <summary>
        /// Creates an IDistinctMap based on the type.
        /// </summary>
        /// <param name="distinctQueryType">The type of distinct query.</param>
        /// <param name="distinctMapContinuationToken">The continuation token to resume from.</param>
        /// <returns>The appropriate IDistinctMap.</returns>
        public static TryCatch <DistinctMap> TryCreate(
            DistinctQueryType distinctQueryType,
            CosmosElement distinctMapContinuationToken)
        {
            TryCatch <DistinctMap> tryCreateDistinctMap;

            switch (distinctQueryType)
            {
            case DistinctQueryType.None:
                throw new ArgumentException("distinctQueryType can not be None. This part of code is not supposed to be reachable. Please contact support to resolve this issue.");

            case DistinctQueryType.Unordered:
                tryCreateDistinctMap = UnorderdDistinctMap.TryCreate(distinctMapContinuationToken);
                break;

            case DistinctQueryType.Ordered:
                tryCreateDistinctMap = OrderedDistinctMap.TryCreate(distinctMapContinuationToken);
                break;

            default:
                throw new ArgumentException($"Unrecognized DistinctQueryType: {distinctQueryType}.");
            }

            return(tryCreateDistinctMap);
        }
        /// <summary>
        /// Creates an DistinctDocumentQueryExecutionComponent
        /// </summary>
        /// <param name="executionEnvironment">The environment to execute on.</param>
        /// <param name="queryClient">The query client</param>
        /// <param name="requestContinuation">The continuation token.</param>
        /// <param name="createSourceCallback">The callback to create the source to drain from.</param>
        /// <param name="distinctQueryType">The type of distinct query.</param>
        /// <returns>A task to await on and in return </returns>
        public static async Task <IDocumentQueryExecutionComponent> CreateAsync(
            ExecutionEnvironment executionEnvironment,
            CosmosQueryClient queryClient,
            string requestContinuation,
            Func <string, Task <IDocumentQueryExecutionComponent> > createSourceCallback,
            DistinctQueryType distinctQueryType)
        {
            IDocumentQueryExecutionComponent distinctDocumentQueryExecutionComponent;

            switch (executionEnvironment)
            {
            case ExecutionEnvironment.Client:
                distinctDocumentQueryExecutionComponent = await ClientDistinctDocumentQueryExecutionComponent.CreateAsync(
                    queryClient,
                    requestContinuation,
                    createSourceCallback,
                    distinctQueryType);

                break;

            case ExecutionEnvironment.Compute:
                distinctDocumentQueryExecutionComponent = await ComputeDistinctDocumentQueryExecutionComponent.CreateAsync(
                    queryClient,
                    requestContinuation,
                    createSourceCallback,
                    distinctQueryType);

                break;

            default:
                throw new ArgumentException($"Unknown {nameof(ExecutionEnvironment)}: {executionEnvironment}.");
            }

            return(distinctDocumentQueryExecutionComponent);
        }
 private ComputeDistinctDocumentQueryExecutionComponent(
     DistinctQueryType distinctQueryType,
     DistinctMap distinctMap,
     IDocumentQueryExecutionComponent source)
     : base(distinctMap, source)
 {
 }
            /// <summary>
            /// Creates an DistinctDocumentQueryExecutionComponent
            /// </summary>
            /// <param name="queryClient">The query client</param>
            /// <param name="requestContinuation">The continuation token.</param>
            /// <param name="createSourceCallback">The callback to create the source to drain from.</param>
            /// <param name="distinctQueryType">The type of distinct query.</param>
            /// <returns>A task to await on and in return </returns>
            public static async Task <DistinctDocumentQueryExecutionComponent> CreateAsync(
                CosmosQueryClient queryClient,
                string requestContinuation,
                Func <string, Task <IDocumentQueryExecutionComponent> > createSourceCallback,
                DistinctQueryType distinctQueryType)
            {
                DistinctContinuationToken distinctContinuationToken;

                if (requestContinuation != null)
                {
                    if (!DistinctContinuationToken.TryParse(requestContinuation, out distinctContinuationToken))
                    {
                        throw queryClient.CreateBadRequestException($"Invalid {nameof(DistinctContinuationToken)}: {requestContinuation}");
                    }
                }
                else
                {
                    distinctContinuationToken = new DistinctContinuationToken(sourceToken: null, distinctMapToken: null);
                }

                DistinctMap distinctMap = DistinctMap.Create(distinctQueryType, distinctContinuationToken.DistinctMapToken);
                IDocumentQueryExecutionComponent source = await createSourceCallback(distinctContinuationToken.SourceToken);

                return(new ComputeDistinctDocumentQueryExecutionComponent(
                           distinctQueryType,
                           distinctMap,
                           source));
            }
Beispiel #5
0
 public static TryCatch <IQueryPipelineStage> MonadicCreate(
     ExecutionEnvironment executionEnvironment,
     CosmosElement requestContinuation,
     CancellationToken cancellationToken,
     MonadicCreatePipelineStage monadicCreatePipelineStage,
     DistinctQueryType distinctQueryType) => executionEnvironment switch
 {
            private ClientDistinctDocumentQueryExecutionComponent(
                DistinctQueryType distinctQueryType,
                DistinctMap distinctMap,
                IDocumentQueryExecutionComponent source)
                : base(distinctMap, source)
            {
                if ((distinctQueryType != DistinctQueryType.Unordered) && (distinctQueryType != DistinctQueryType.Ordered))
                {
                    throw new ArgumentException($"Unknown {nameof(DistinctQueryType)}: {distinctQueryType}.");
                }

                this.distinctQueryType = distinctQueryType;
            }
Beispiel #7
0
        private static async Task <List <CosmosElement> > CreateAndDrainAsync(
            IReadOnlyList <IReadOnlyList <CosmosElement> > pages,
            ExecutionEnvironment executionEnvironment,
            CosmosElement continuationToken,
            DistinctQueryType distinctQueryType)
        {
            IQueryPipelineStage source = new MockQueryPipelineStage(pages);

            TryCatch <IQueryPipelineStage> tryCreateDistinctQueryPipelineStage = DistinctQueryPipelineStage.MonadicCreate(
                executionEnvironment: executionEnvironment,
                requestContinuation: continuationToken,
                distinctQueryType: distinctQueryType,
                cancellationToken: default,
            private ClientDistinctQueryPipelineStage(
                DistinctQueryType distinctQueryType,
                DistinctMap distinctMap,
                IQueryPipelineStage source,
                CancellationToken cancellationToken)
                : base(distinctMap, source, cancellationToken)
            {
                if ((distinctQueryType != DistinctQueryType.Unordered) && (distinctQueryType != DistinctQueryType.Ordered))
                {
                    throw new ArgumentException($"Unknown {nameof(DistinctQueryType)}: {distinctQueryType}.");
                }

                this.distinctQueryType = distinctQueryType;
            }
Beispiel #9
0
        /// <summary>
        /// Initializes a new instance of the DistinctDocumentQueryExecutionComponent class.
        /// </summary>
        /// <param name="distinctQueryType">The type of distinct query.</param>
        /// <param name="previousHash">The previous that distinct map saw.</param>
        /// <param name="source">The source to drain from.</param>
        private DistinctDocumentQueryExecutionComponent(
            DistinctQueryType distinctQueryType,
            UInt192?previousHash,
            IDocumentQueryExecutionComponent source)
            : base(source)
        {
            if (distinctQueryType == DistinctQueryType.None)
            {
                throw new ArgumentException("It doesn't make sense to create a distinct component of type None.");
            }

            this.distinctQueryType = distinctQueryType;
            this.distinctMap       = DistinctMap.Create(distinctQueryType, previousHash);
        }
 /// <summary>
 /// Creates an IDistinctMap based on the type.
 /// </summary>
 /// <param name="distinctQueryType">The type of distinct query.</param>
 /// <param name="previousHash">The hash of the previous value successfully inserted into this DistinctMap</param>
 /// <returns>The appropriate IDistinctMap.</returns>
 public static DistinctMap Create(DistinctQueryType distinctQueryType, UInt192? previousHash)
 {
     switch (distinctQueryType)
     {
         case DistinctQueryType.None:
             throw new ArgumentException("distinctQueryType can not be None. This part of code is not supposed to be reachable. Please contact support to resolve this issue.");
         case DistinctQueryType.Unordered:
             return new UnorderdDistinctMap();
         case DistinctQueryType.Ordered:
             return new OrderedDistinctMap(previousHash.GetValueOrDefault());
         default:
             throw new ArgumentException($"Unrecognized DistinctQueryType: {distinctQueryType}.");
     }
 }
            public static TryCatch <IQueryPipelineStage> MonadicCreate(
                CosmosElement requestContinuation,
                CancellationToken cancellationToken,
                MonadicCreatePipelineStage monadicCreatePipelineStage,
                DistinctQueryType distinctQueryType)
            {
                if (monadicCreatePipelineStage == null)
                {
                    throw new ArgumentNullException(nameof(monadicCreatePipelineStage));
                }

                DistinctContinuationToken distinctContinuationToken;

                if (requestContinuation != null)
                {
                    if (!DistinctContinuationToken.TryParse(requestContinuation, out distinctContinuationToken))
                    {
                        return(TryCatch <IQueryPipelineStage> .FromException(
                                   new MalformedContinuationTokenException(
                                       $"Invalid {nameof(DistinctContinuationToken)}: {requestContinuation}")));
                    }
                }
                else
                {
                    distinctContinuationToken = new DistinctContinuationToken(sourceToken: null, distinctMapToken: null);
                }

                TryCatch <DistinctMap> tryCreateDistinctMap = DistinctMap.TryCreate(
                    distinctQueryType,
                    distinctContinuationToken.DistinctMapToken);

                if (!tryCreateDistinctMap.Succeeded)
                {
                    return(TryCatch <IQueryPipelineStage> .FromException(tryCreateDistinctMap.Exception));
                }

                TryCatch <IQueryPipelineStage> tryCreateSource = monadicCreatePipelineStage(distinctContinuationToken.SourceToken, cancellationToken);

                if (!tryCreateSource.Succeeded)
                {
                    return(TryCatch <IQueryPipelineStage> .FromException(tryCreateSource.Exception));
                }

                return(TryCatch <IQueryPipelineStage> .FromResult(
                           new ComputeDistinctQueryPipelineStage(
                               tryCreateDistinctMap.Result,
                               tryCreateSource.Result,
                               cancellationToken)));
            }
            public static async Task <TryCatch <IDocumentQueryExecutionComponent> > TryCreateAsync(
                CosmosElement requestContinuation,
                Func <CosmosElement, Task <TryCatch <IDocumentQueryExecutionComponent> > > tryCreateSourceAsync,
                DistinctQueryType distinctQueryType)
            {
                if (tryCreateSourceAsync == null)
                {
                    throw new ArgumentNullException(nameof(tryCreateSourceAsync));
                }

                DistinctContinuationToken distinctContinuationToken;

                if (requestContinuation != null)
                {
                    if (!DistinctContinuationToken.TryParse(requestContinuation, out distinctContinuationToken))
                    {
                        return(TryCatch <IDocumentQueryExecutionComponent> .FromException(
                                   new MalformedContinuationTokenException($"Invalid {nameof(DistinctContinuationToken)}: {requestContinuation}")));
                    }
                }
                else
                {
                    distinctContinuationToken = new DistinctContinuationToken(sourceToken: null, distinctMapToken: null);
                }

                TryCatch <DistinctMap> tryCreateDistinctMap = DistinctMap.TryCreate(
                    distinctQueryType,
                    distinctContinuationToken.DistinctMapToken);

                if (!tryCreateDistinctMap.Succeeded)
                {
                    return(TryCatch <IDocumentQueryExecutionComponent> .FromException(tryCreateDistinctMap.Exception));
                }

                TryCatch <IDocumentQueryExecutionComponent> tryCreateSource = await tryCreateSourceAsync(
                    distinctContinuationToken.SourceToken);

                if (!tryCreateSource.Succeeded)
                {
                    return(TryCatch <IDocumentQueryExecutionComponent> .FromException(tryCreateSource.Exception));
                }

                return(TryCatch <IDocumentQueryExecutionComponent> .FromResult(
                           new ComputeDistinctDocumentQueryExecutionComponent(
                               distinctQueryType,
                               tryCreateDistinctMap.Result,
                               tryCreateSource.Result)));
            }
Beispiel #13
0
        /// <summary>
        /// Creates an IDistinctMap based on the type.
        /// </summary>
        /// <param name="distinctQueryType">The type of distinct query.</param>
        /// <param name="distinctMapContinuationToken">The continuation token to resume from.</param>
        /// <returns>The appropriate IDistinctMap.</returns>
        public static DistinctMap Create(
            DistinctQueryType distinctQueryType,
            string distinctMapContinuationToken)
        {
            switch (distinctQueryType)
            {
            case DistinctQueryType.None:
                throw new ArgumentException("distinctQueryType can not be None. This part of code is not supposed to be reachable. Please contact support to resolve this issue.");

            case DistinctQueryType.Unordered:
                return(UnorderdDistinctMap.Create(distinctMapContinuationToken));

            case DistinctQueryType.Ordered:
                return(OrderedDistinctMap.Create(distinctMapContinuationToken));

            default:
                throw new ArgumentException($"Unrecognized DistinctQueryType: {distinctQueryType}.");
            }
        }
Beispiel #14
0
        /// <summary>
        /// Creates an DistinctDocumentQueryExecutionComponent
        /// </summary>
        /// <param name="requestContinuation">The continuation token.</param>
        /// <param name="createSourceCallback">The callback to create the source to drain from.</param>
        /// <param name="distinctQueryType">The type of distinct query.</param>
        /// <returns>A task to await on and in return </returns>
        public static async Task <IDocumentQueryExecutionComponent> CreateAsync(
            string requestContinuation,
            Func <string, Task <IDocumentQueryExecutionComponent> > createSourceCallback,
            DistinctQueryType distinctQueryType)
        {
            DistinctContinuationToken distinctContinuationToken = new DistinctContinuationToken(null, null);

            if (requestContinuation != null)
            {
                distinctContinuationToken = DistinctContinuationToken.Parse(requestContinuation);
                if (distinctQueryType != DistinctQueryType.Ordered && distinctContinuationToken.LastHash != null)
                {
                    throw new BadRequestException($"DistinctContinuationToken is malformed: {distinctContinuationToken}. DistinctContinuationToken can not have a 'lastHash', when the query type is not ordered (ex SELECT DISTINCT VALUE c.blah FROM c ORDER BY c.blah).");
                }
            }

            return(new DistinctDocumentQueryExecutionComponent(
                       distinctQueryType,
                       distinctContinuationToken.LastHash,
                       await createSourceCallback(distinctContinuationToken.SourceToken)));
        }
Beispiel #15
0
        public static async Task <TryCatch <IDocumentQueryExecutionComponent> > TryCreateAsync(
            ExecutionEnvironment executionEnvironment,
            CosmosElement requestContinuation,
            Func <CosmosElement, Task <TryCatch <IDocumentQueryExecutionComponent> > > tryCreateSourceAsync,
            DistinctQueryType distinctQueryType)
        {
            if (tryCreateSourceAsync == null)
            {
                throw new ArgumentNullException(nameof(tryCreateSourceAsync));
            }

            TryCatch <IDocumentQueryExecutionComponent> tryCreateDistinctDocumentQueryExecutionComponent;

            switch (executionEnvironment)
            {
            case ExecutionEnvironment.Client:
                tryCreateDistinctDocumentQueryExecutionComponent = await ClientDistinctDocumentQueryExecutionComponent.TryCreateAsync(
                    requestContinuation,
                    tryCreateSourceAsync,
                    distinctQueryType);

                break;

            case ExecutionEnvironment.Compute:
                tryCreateDistinctDocumentQueryExecutionComponent = await ComputeDistinctDocumentQueryExecutionComponent.TryCreateAsync(
                    requestContinuation,
                    tryCreateSourceAsync,
                    distinctQueryType);

                break;

            default:
                throw new ArgumentException($"Unknown {nameof(ExecutionEnvironment)}: {executionEnvironment}.");
            }

            return(tryCreateDistinctDocumentQueryExecutionComponent);
        }
            public static TryCatch <IQueryPipelineStage> MonadicCreate(
                CosmosElement requestContinuation,
                CancellationToken cancellationToken,
                MonadicCreatePipelineStage monadicCreatePipelineStage,
                DistinctQueryType distinctQueryType)
            {
                if (monadicCreatePipelineStage == null)
                {
                    throw new ArgumentNullException(nameof(monadicCreatePipelineStage));
                }

                DistinctContinuationToken distinctContinuationToken;

                if (requestContinuation != null)
                {
                    if (!DistinctContinuationToken.TryParse(requestContinuation, out distinctContinuationToken))
                    {
                        return(TryCatch <IQueryPipelineStage> .FromException(
                                   new MalformedContinuationTokenException(
                                       $"Invalid {nameof(DistinctContinuationToken)}: {requestContinuation}")));
                    }
                }
                else
                {
                    distinctContinuationToken = new DistinctContinuationToken(
                        sourceToken: null,
                        distinctMapToken: null);
                }

                CosmosElement distinctMapToken = distinctContinuationToken.DistinctMapToken != null
                    ? CosmosString.Create(distinctContinuationToken.DistinctMapToken)
                    : null;

                TryCatch <DistinctMap> tryCreateDistinctMap = DistinctMap.TryCreate(
                    distinctQueryType,
                    distinctMapToken);

                if (!tryCreateDistinctMap.Succeeded)
                {
                    return(TryCatch <IQueryPipelineStage> .FromException(tryCreateDistinctMap.Exception));
                }

                CosmosElement sourceToken;

                if (distinctContinuationToken.SourceToken != null)
                {
                    TryCatch <CosmosElement> tryParse = CosmosElement.Monadic.Parse(distinctContinuationToken.SourceToken);
                    if (tryParse.Failed)
                    {
                        return(TryCatch <IQueryPipelineStage> .FromException(
                                   new MalformedContinuationTokenException(
                                       message : $"Invalid Source Token: {distinctContinuationToken.SourceToken}",
                                       innerException : tryParse.Exception)));
                    }

                    sourceToken = tryParse.Result;
                }
                else
                {
                    sourceToken = null;
                }

                TryCatch <IQueryPipelineStage> tryCreateSource = monadicCreatePipelineStage(sourceToken, cancellationToken);

                if (!tryCreateSource.Succeeded)
                {
                    return(TryCatch <IQueryPipelineStage> .FromException(tryCreateSource.Exception));
                }

                return(TryCatch <IQueryPipelineStage> .FromResult(
                           new ClientDistinctQueryPipelineStage(
                               distinctQueryType,
                               tryCreateDistinctMap.Result,
                               tryCreateSource.Result,
                               cancellationToken)));
            }
Beispiel #17
0
 /// <summary>
 /// Creates an IDistinctMap based on the type.
 /// </summary>
 /// <param name="distinctQueryType">The type of distinct query.</param>
 /// <param name="distinctMapContinuationToken">The continuation token to resume from.</param>
 /// <returns>The appropriate IDistinctMap.</returns>
 public static TryCatch <DistinctMap> TryCreate(
     DistinctQueryType distinctQueryType,
     CosmosElement distinctMapContinuationToken) => distinctQueryType switch
 {