Esempio n. 1
0
        public void CreateQueryRequest_ScanConsistency_HasSetting()
        {
            // Arrange

            var bucket = new Mock <IBucket>();

            bucket.Setup(m => m.Name).Returns("default");
            bucket.Setup(m => m.Configuration).Returns(new BucketConfiguration()
            {
                PoolConfiguration = new PoolConfiguration(new ClientConfiguration())
            });
            bucket.Setup(m => m.Cluster).Returns(new Mock <ICluster>().Object);

            var context = new BucketContext(bucket.Object);
            var query   = context.Query <Brewery>().ScanConsistency(ScanConsistency.RequestPlus).Where(p => p.Name == "name");

            // Act

            var result = LinqQueryRequest.CreateQueryRequest(query);

            // Assert

            Assert.NotNull(result);
            Assert.AreEqual("request_plus", result.GetFormValues()["scan_consistency"]);
        }
Esempio n. 2
0
        public void CreateQueryRequest_ScanWait_HasSetting()
        {
            // Arrange

            var bucket = new Mock <IBucket>();

            bucket.Setup(m => m.Name).Returns("default");
            bucket.Setup(m => m.Configuration).Returns(new BucketConfiguration()
            {
                PoolConfiguration = new PoolConfiguration(new ClientConfiguration())
            });
            bucket.Setup(m => m.Cluster).Returns(new Mock <ICluster>().Object);

            var scanWait = TimeSpan.FromMinutes(1);

            var context = new BucketContext(bucket.Object);
            var query   = context.Query <Brewery>().ScanWait(scanWait).Where(p => p.Name == "name");

            // Act

            var result = LinqQueryRequest.CreateQueryRequest(query);

            // Assert

            Assert.NotNull(result);
            Assert.AreEqual(scanWait.TotalMilliseconds + "ms", result.GetFormValues()["scan_wait"]);
        }
        private void ApplyQueryRequestSettings(LinqQueryRequest queryRequest, bool generateProxies)
        {
            if (ScanConsistency.HasValue)
            {
                queryRequest.ScanConsistency(ScanConsistency.Value);
            }
            if (ScanWait.HasValue)
            {
                queryRequest.ScanWait(ScanWait.Value);
            }
            if (MutationState != null)
            {
                queryRequest.ConsistentWith(MutationState);
            }

            if (UseStreaming)
            {
                if (generateProxies)
                {
                    _log.Info("Query result streaming is not supported with change tracking, streaming disabled");
                }
                else
                {
                    queryRequest.UseStreaming(true);
                }
            }
        }
Esempio n. 4
0
        public void CreateQueryRequest_All_ReturnsQueryWrappedInQueryRequest()
        {
            // Arrange

            var bucket = new Mock <IBucket>();

            bucket.Setup(m => m.Name).Returns("default");
            bucket.Setup(m => m.Configuration).Returns(new BucketConfiguration()
            {
                PoolConfiguration = new PoolConfiguration(new ClientConfiguration())
            });
            bucket.Setup(m => m.Cluster).Returns(new Mock <ICluster>().Object);

            var context = new BucketContext(bucket.Object);
            var query   = context.Query <Brewery>();

            // Act

            var result = LinqQueryRequest.CreateQueryRequest(query, p => p.All(q => q.Name == "name"));

            // Assert

            const string queryStr = "SELECT false as result FROM `default` as `Extent1` WHERE NOT ((`Extent1`.`name` = 'name')) LIMIT 1";

            Assert.NotNull(result);
            Assert.AreEqual(queryStr, result.GetOriginalStatement());
            Assert.True(result.ScalarResultBehavior.ResultExtractionRequired);
            Assert.AreEqual(true, result.ScalarResultBehavior.NoRowsResult);
        }
        public IEnumerable <T> ExecuteCollection <T>(QueryModel queryModel)
        {
            ScalarResultBehavior scalarResultBehavior;
            bool generateProxies = ShouldGenerateProxies <T>(queryModel);

            var commandData = GenerateQuery(queryModel, generateProxies, out scalarResultBehavior);

            var queryRequest = new LinqQueryRequest(commandData, scalarResultBehavior);

            ApplyQueryRequestSettings(queryRequest, generateProxies);

            if (generateProxies)
            {
                // Proxy generation was requested, and the
                queryRequest.DataMapper = new Proxies.DocumentProxyDataMapper <T>(Serializer, (IChangeTrackableContext)_bucketContext);
            }

            if (queryModel.ResultOperators.Any(p => p is ToQueryRequestResultOperator))
            {
                // ToQueryRequest was called on this LINQ query, so we should return the N1QL query in a QueryRequest object
                // The IEnumerable wrapper will be stripped by ExecuteSingle.

                return(new[] { queryRequest } as IEnumerable <T>);
            }

            return(ExecuteCollection <T>(queryRequest));
        }
Esempio n. 6
0
        /// <summary>
        /// Execute a Couchbase query asynchronously.
        /// </summary>
        /// <typeparam name="T">Type being queried.</typeparam>
        /// <typeparam name="TResult">Type returned by <paramref name="additionalExpression"/>.</typeparam>
        /// <param name="source">Query to execute asynchronously.  Must be a Couchbase LINQ query.</param>
        /// <param name="additionalExpression">Additional expressions to apply to the query before executing.  Typically used for aggregates.</param>
        /// <returns>Task which contains the query result when completed.</returns>
        /// <remarks>
        /// <para>The expression contained in <paramref name="additionalExpression"/> is applied to the query before
        /// it is executed asynchrounously.  Typically, this would be used to apply an aggregate, First, Single,
        /// or other operation to the query that normall  triggers immediate query execution.  Passing these actions
        /// in <paramref name="additionalExpression"/> delays their execution so that they can be handled asynchronously.</para>
        /// <para><paramref name="additionalExpression"/> must return a scalar value or a single object.  It should not return another
        /// instance of <see cref="IQueryable{T}"/>.</para>
        /// </remarks>
        /// <example>
        /// var document = await query.ExecuteAsync(query => query.First());
        /// </example>
        /// <example>
        /// var avg = await query.ExecuteAsync(query => query.Average(p => p.Abv));
        /// </example>
        public static async Task <TResult> ExecuteAsync <T, TResult>(this IQueryable <T> source,
                                                                     Expression <Func <IQueryable <T>, TResult> > additionalExpression)
        {
            if (source is EnumerableQuery)
            {
                // Allow ExecuteAsync to simply run synchronously when executed against an in-memory collection
                // This supports injecting mock IBucketContext instances into unit tests of business logic
                // https://github.com/couchbaselabs/Linq2Couchbase/issues/191

                var additionalFunction = additionalExpression.Compile();
                return(additionalFunction(source));
            }

            EnsureBucketQueryable(source, "ExecuteAsync", "source");

            if (typeof(TResult).GetTypeInfo().IsGenericTypeDefinition&&
                (typeof(TResult).GetGenericTypeDefinition() == typeof(IQueryable <>)))
            {
                throw new ArgumentException("additionalExpression must return a scalar value, not IQueryable.", "additionalExpression");
            }

            var queryRequest = LinqQueryRequest.CreateQueryRequest(source, additionalExpression);

            return(await
                       ((IBucketQueryExecutorProvider)source).BucketQueryExecutor.ExecuteSingleAsync <TResult>(queryRequest)
                   .ConfigureAwait(false));
        }
Esempio n. 7
0
        public void CreateQueryRequest_First_ReturnsQueryWrappedInQueryRequest()
        {
            // Arrange

            var bucket = new Mock <IBucket>();

            bucket.Setup(m => m.Name).Returns("default");
            bucket.Setup(m => m.Configuration).Returns(new BucketConfiguration()
            {
                PoolConfiguration = new PoolConfiguration(new ClientConfiguration())
            });
            bucket.Setup(m => m.Cluster).Returns(new Mock <ICluster>().Object);

            var context = new BucketContext(bucket.Object);
            var query   = context.Query <Brewery>().Where(p => p.Name == "name");

            // Act

            var result = LinqQueryRequest.CreateQueryRequest(query, p => p.First());

            // Assert

            const string queryStr = "SELECT `Extent1`.* FROM `default` as `Extent1` WHERE (`Extent1`.`name` = 'name') LIMIT 1";

            Assert.NotNull(result);
            Assert.AreEqual(queryStr, result.GetOriginalStatement());
            Assert.False(result.ReturnDefaultWhenEmpty);
        }
Esempio n. 8
0
        public void CreateQueryRequest_WithAggregate_ReturnsQueryWrappedInQueryRequest()
        {
            // Arrange

            var bucket = new Mock <IBucket>();

            bucket.Setup(m => m.Name).Returns("default");
            bucket.Setup(m => m.Configuration).Returns(new BucketConfiguration()
            {
                PoolConfiguration = new PoolConfiguration(new ClientConfiguration())
            });
            bucket.Setup(m => m.Cluster).Returns(new Mock <ICluster>().Object);

            var context = new BucketContext(bucket.Object);
            var query   = context.Query <Beer>().Where(p => p.Name == "name");

            // Act

            var result = LinqQueryRequest.CreateQueryRequest(query, p => p.Average(q => q.Abv));

            // Assert

            const string queryStr = "SELECT AVG(`Extent1`.`abv`) as `result` FROM `default` as `Extent1` WHERE (`Extent1`.`name` = 'name')";

            Assert.NotNull(result);
            Assert.AreEqual(queryStr, result.GetOriginalStatement());
            Assert.True(result.ScalarResultBehavior.ResultExtractionRequired);
        }
        public async Task <T> ExecuteSingleAsync <T>(LinqQueryRequest queryRequest, CancellationToken cancellationToken)
        {
            var resultSet = await ExecuteCollectionAsync <T>(queryRequest, cancellationToken).ConfigureAwait(false);

            return(queryRequest.ReturnDefaultWhenEmpty
                ? resultSet.SingleOrDefault()
                : resultSet.Single());
        }
        public async Task <T> ExecuteSingleAsync <T>(LinqQueryRequest queryRequest)
        {
            var resultSet = await ExecuteCollectionAsync <T>(queryRequest);

            return(queryRequest.ReturnDefaultWhenEmpty
                ? resultSet.SingleOrDefault()
                : resultSet.Single());
        }
Esempio n. 11
0
        /// <summary>
        /// Execute a Couchbase query asynchronously.
        /// </summary>
        /// <typeparam name="T">Type being queried.</typeparam>
        /// <param name="source">Query to execute asynchronously.  Must be a Couchbase LINQ query.</param>
        /// <returns>Task which contains the query result when completed.</returns>
        /// <example>
        /// var results = await query.ExecuteAsync();
        /// </example>
        public static async Task <IEnumerable <T> > ExecuteAsync <T>(this IQueryable <T> source)
        {
            EnsureBucketQueryable(source, "ExecuteAsync", "source");

            var queryRequest = LinqQueryRequest.CreateQueryRequest(source);

            return(await
                       ((IBucketQueryExecutorProvider)source).BucketQueryExecutor.ExecuteCollectionAsync <T>(queryRequest)
                   .ConfigureAwait(false));
        }
        public LinqQueryRequestValue(LinqQueryRequest value, LinqQueryRequestDataInfo linqQueryRequestInfo)
        {
            if (linqQueryRequestInfo == null)
            {
                throw new ArgumentNullException("linqQueryRequestInfo");
            }

            Value = value;
            DataInfo = linqQueryRequestInfo;
        }
        public LinqQueryRequestValue(LinqQueryRequest value, LinqQueryRequestDataInfo linqQueryRequestInfo)
        {
            if (linqQueryRequestInfo == null)
            {
                throw new ArgumentNullException("linqQueryRequestInfo");
            }

            Value    = value;
            DataInfo = linqQueryRequestInfo;
        }
        /// <summary>
        /// Execute a <see cref="LinqQueryRequest"/>.
        /// </summary>
        /// <typeparam name="T">Type returned by the query.</typeparam>
        /// <param name="queryRequest">Request to execute.</param>
        /// <returns>List of objects returned by the request.</returns>
        public IEnumerable <T> ExecuteCollection <T>(LinqQueryRequest queryRequest)
        {
            if (!queryRequest.ScalarResultBehavior.ResultExtractionRequired)
            {
                var result = _bucket.Query <T>(queryRequest);

                return(ParseResult(result));
            }
            else
            {
                var result = _bucket.Query <ScalarResult <T> >(queryRequest);

                return(queryRequest.ScalarResultBehavior.ApplyResultExtraction(ParseResult(result)));
            }
        }
 private void ApplyQueryRequestSettings(LinqQueryRequest queryRequest)
 {
     if (ScanConsistency.HasValue)
     {
         queryRequest.ScanConsistency(ScanConsistency.Value);
     }
     if (ScanWait.HasValue)
     {
         queryRequest.ScanWait(ScanWait.Value);
     }
     if (MutationState != null)
     {
         queryRequest.ConsistentWith(MutationState);
     }
 }
        /// <summary>
        /// Asynchronously execute a <see cref="LinqQueryRequest"/>.
        /// </summary>
        /// <typeparam name="T">Type returned by the query.</typeparam>
        /// <param name="queryRequest">Request to execute.</param>
        /// <param name="cancellationToken">Cancellation token.</param>
        /// <returns>Task which contains a list of objects returned by the request when complete.</returns>
        public async Task <IEnumerable <T> > ExecuteCollectionAsync <T>(LinqQueryRequest queryRequest, CancellationToken cancellationToken)
        {
            if (!queryRequest.ScalarResultBehavior.ResultExtractionRequired)
            {
                var result = await _bucket.QueryAsync <T>(queryRequest, cancellationToken).ConfigureAwait(false);

                return(ParseResult(result));
            }
            else
            {
                var result = await _bucket.QueryAsync <ScalarResult <T> >(queryRequest, cancellationToken).ConfigureAwait(false);

                return(queryRequest.ScalarResultBehavior.ApplyResultExtraction(ParseResult(result)));
            }
        }
Esempio n. 17
0
        /// <summary>
        /// Execute a Couchbase query asynchronously.
        /// </summary>
        /// <typeparam name="T">Type being queried.</typeparam>
        /// <typeparam name="TResult">Type returned by <paramref name="additionalExpression"/>.</typeparam>
        /// <param name="source">Query to execute asynchronously.  Must be a Couchbase LINQ query.</param>
        /// <param name="additionalExpression">Additional expressions to apply to the query before executing.  Typically used for aggregates.</param>
        /// <returns>Task which contains the query result when completed.</returns>
        /// <remarks>
        /// <para>The expression contained in <paramref name="additionalExpression"/> is applied to the query before
        /// it is executed asynchrounously.  Typically, this would be used to apply an aggregate, First, Single,
        /// or other operation to the query that normall  triggers immediate query execution.  Passing these actions
        /// in <paramref name="additionalExpression"/> delays their execution so that they can be handled asynchronously.</para>
        /// <para><paramref name="additionalExpression"/> must return a scalar value or a single object.  It should not return another
        /// instance of <see cref="IQueryable{T}"/>.</para>
        /// </remarks>
        /// <example>
        /// var document = await query.ExecuteAsync(query => query.First());
        /// </example>
        /// <example>
        /// var avg = await query.ExecuteAsync(query => query.Average(p => p.Abv));
        /// </example>
        public static async Task <TResult> ExecuteAsync <T, TResult>(this IQueryable <T> source,
                                                                     Expression <Func <IQueryable <T>, TResult> > additionalExpression)
        {
            EnsureBucketQueryable(source, "ExecuteAsync", "source");

            if (typeof(TResult).GetTypeInfo().IsGenericTypeDefinition&&
                (typeof(TResult).GetGenericTypeDefinition() == typeof(IQueryable <>)))
            {
                throw new ArgumentException("additionalExpression must return a scalar value, not IQueryable.", "additionalExpression");
            }

            var queryRequest = LinqQueryRequest.CreateQueryRequest(source, additionalExpression);

            return(await
                       ((IBucketQueryExecutorProvider)source).BucketQueryExecutor.ExecuteSingleAsync <TResult>(queryRequest)
                   .ConfigureAwait(false));
        }
Esempio n. 18
0
        /// <summary>
        /// Execute a Couchbase query asynchronously.
        /// </summary>
        /// <typeparam name="T">Type being queried.</typeparam>
        /// <param name="source">Query to execute asynchronously.  Must be a Couchbase LINQ query.</param>
        /// <returns>Task which contains the query result when completed.</returns>
        /// <example>
        /// var results = await query.ExecuteAsync();
        /// </example>
        public static async Task <IEnumerable <T> > ExecuteAsync <T>(this IQueryable <T> source)
        {
            if (source is EnumerableQuery)
            {
                // Allow ExecuteAsync to simply run synchronously when executed against an in-memory collection
                // This supports injecting mock IBucketContext instances into unit tests of business logic
                // https://github.com/couchbaselabs/Linq2Couchbase/issues/191

                return(source.AsEnumerable());
            }

            EnsureBucketQueryable(source, "ExecuteAsync", "source");

            var queryRequest = LinqQueryRequest.CreateQueryRequest(source);

            return(await
                       ((IBucketQueryExecutorProvider)source).BucketQueryExecutor.ExecuteCollectionAsync <T>(queryRequest)
                   .ConfigureAwait(false));
        }
 public Task <T> ExecuteSingleAsync <T>(LinqQueryRequest queryRequest)
 {
     throw new NotImplementedException();
 }
 public Task <IEnumerable <T> > ExecuteCollectionAsync <T>(LinqQueryRequest queryResult)
 {
     throw new NotImplementedException();
 }
Esempio n. 21
0
 public Task <T> ExecuteSingleAsync <T>(LinqQueryRequest queryRequest, CancellationToken cancellationToken)
 {
     throw new NotImplementedException();
 }