コード例 #1
0
        public void Test_GroupByAfterJoin()
        {
            var mockBucket = new Mock <IBucket>();

            mockBucket.SetupGet(e => e.Name).Returns("default");

            var query =
                from beer in QueryFactory.Queryable <Beer>(mockBucket.Object)
                join brewery in QueryFactory.Queryable <Brewery>(mockBucket.Object) on beer.BreweryId equals
                N1QlFunctions.Key(brewery)
                group beer by brewery.Name
                into g
                select new { breweryName = g.Key, avgAbv = g.Average(p => p.Abv) };

            const string expected =
                "SELECT `Extent2`.`name` as `breweryName`, AVG(`Extent1`.`abv`) as `avgAbv` " +
                "FROM `default` as `Extent1` " +
                "INNER JOIN `default` as `Extent2` ON (`Extent1`.`brewery_id` = META(`Extent2`).id) " +
                "GROUP BY `Extent2`.`name`";

            var n1QlQuery = CreateN1QlQuery(mockBucket.Object, query.Expression);

            Assert.AreEqual(expected, n1QlQuery);
        }
コード例 #2
0
        public void Test_InnerJoin_SortAndFilter()
        {
            var mockBucket = new Mock <IBucket>();

            mockBucket.SetupGet(e => e.Name).Returns("default");

            var query = from beer in QueryFactory.Queryable <Beer>(mockBucket.Object)
                        join brewery in QueryFactory.Queryable <Brewery>(mockBucket.Object)
                        on beer.BreweryId equals N1QlFunctions.Key(brewery)
                            where brewery.Geo.Longitude > -80
                        orderby beer.Name
                        select new { beer.Name, beer.Abv, BreweryName = brewery.Name };

            const string expected = "SELECT `Extent1`.`name` as `Name`, `Extent1`.`abv` as `Abv`, `Extent2`.`name` as `BreweryName` " +
                                    "FROM `default` as `Extent1` " +
                                    "INNER JOIN `default` as `Extent2` " +
                                    "ON KEYS `Extent1`.`brewery_id` " +
                                    "WHERE (`Extent2`.`geo`.`lon` > -80) " +
                                    "ORDER BY `Extent1`.`name` ASC";

            var n1QlQuery = CreateN1QlQuery(mockBucket.Object, query.Expression);

            Assert.AreEqual(expected, n1QlQuery);
        }
コード例 #3
0
        public IFetchedJob Dequeue(string[] queues, CancellationToken cancellationToken)
        {
            lock (syncLock)
            {
                while (true)
                {
                    cancellationToken.ThrowIfCancellationRequested();
                    int invisibilityTimeoutEpoch = DateTime.UtcNow.Add(invisibilityTimeout.Negate()).ToEpoch();
                    logger.Trace("Looking for any jobs from the queue");

                    using (new CouchbaseDistributedLock(DISTRIBUTED_LOCK_KEY, defaultLockTimeout, storage))
                    {
                        using (IBucket bucket = storage.Client.OpenBucket(storage.Options.DefaultBucket))
                        {
                            BucketContext   context = new BucketContext(bucket);
                            Documents.Queue data    = context.Query <Documents.Queue>()
                                                      .Where(q => q.DocumentType == DocumentTypes.Queue && queues.Contains(q.Name) && (N1QlFunctions.IsMissing(q.FetchedAt) || q.FetchedAt < invisibilityTimeoutEpoch))
                                                      .OrderBy(q => q.CreatedOn)
                                                      .FirstOrDefault();

                            if (data != null)
                            {
                                IDocumentFragment <Documents.Queue> result = bucket.MutateIn <Documents.Queue>(data.Id)
                                                                             .Upsert(q => q.FetchedAt, DateTime.UtcNow.ToEpoch(), true)
                                                                             .Execute();

                                if (result.Success)
                                {
                                    logger.Trace($"Found job {data.JobId} from the queue {data.Name}");
                                    return(new FetchedJob(storage, data));
                                }
                            }
                        }
                    }

                    logger.Trace($"Unable to find any jobs in the queue. Will check the queue for jobs in {storage.Options.QueuePollInterval.TotalSeconds} seconds");
                    cancellationToken.WaitHandle.WaitOne(storage.Options.QueuePollInterval);
                }
            }
        }
コード例 #4
0
        public void AggregateTests_JoinBeforeGroupByAndMultipartKey()
        {
            using (var cluster = new Cluster(TestConfigurations.DefaultConfig()))
            {
                using (var bucket = cluster.OpenBucket("beer-sample"))
                {
                    var context = new BucketContext(bucket);

                    var breweries =
                        from beer in context.Query <Beer>()
                        join brewery in context.Query <Brewery>() on beer.BreweryId equals N1QlFunctions.Key(brewery)
                            where beer.Type == "beer"
                        group beer by new { breweryid = beer.BreweryId, breweryName = brewery.Name }
                    into g
                        select new { g.Key.breweryName, count = g.Count(), avgAbv = g.Average(p => p.Abv) };

                    foreach (var brewery in breweries)
                    {
                        Console.WriteLine("Brewery {0} has {1} beers with {2:f2} average ABV", brewery.breweryName, brewery.count, brewery.avgAbv);
                    }
                }
            }
        }
コード例 #5
0
        public ActionResult Join()
        {
            var db = new BucketContext(ClusterHelper.GetBucket("travel-sample"));

            // To join between documents, at least on side of the equality must be N1QlFunctions.Key(x)
            // Prior to Couchbase Server 4.5, this must be the right side
            // After 4.5, this can be the left side assuming a proper index is available for the right side

            var query = from route in db.Query <Route>()
                        join airline in db.Query <Airline>() on route.AirlineId equals N1QlFunctions.Key(airline)
                            where route.SourceAirport == "ATL" && route.DestinationAirport == "ABE"
                        orderby airline.Name, route.Stops
                select new RouteModel
            {
                AirlineName = airline.Name,
                Stops       = route.Stops,
                Schedule    = route.Schedule.ToList()
            };

            return(View(query));
        }