コード例 #1
0
ファイル: SolrTests.cs プロジェクト: taliesins/CorrugatedIron
        public void SearchingByNameReturnsTheObjectId()
        {
            Client.Put(new RiakObject(Bucket, RiakSearchKey, RiakSearchDoc, RiakConstants.ContentTypes.ApplicationJson));
            Client.Put(new RiakObject(Bucket, RiakSearchKey2, RiakSearchDoc2, RiakConstants.ContentTypes.ApplicationJson));

            var mr = new RiakMapReduceQuery();

            var token = new RiakSearchPhraseToken("Al*");
            var solr = new SolrQuery { Fieldname = "name", QueryPart = token };

            var modFunArg = new RiakModuleFunctionArgInput
                                {
                                    Module = "riak_search",
                                    Function = "mapred_search",
                                    Arg = new[] {Bucket, solr.ToString()}
                                };

            mr.Inputs(modFunArg)
                .MapJs(m => m.Source(@"function(value, keydata, arg) { return [value]; }").Keep(true))
                .ReduceJs(r => r.Source(@"function(values, arg) { return values; }").Keep(true));

            var result = Client.MapReduce(mr);
            result.IsSuccess.ShouldBeTrue();

            var mrResult = result.Value;
            mrResult.PhaseResults.Count().ShouldEqual(2);

            mrResult.PhaseResults.ElementAt(0).Values.ShouldNotBeNull();
            mrResult.PhaseResults.ElementAt(1).Values.ShouldNotBeNull();
            // TODO Add data introspection to test - need to verify the results, after all.
        }
コード例 #2
0
        public void EqualsFindsOneKey()
        {
            for (int i = 0; i < 10; i++)
            {
                Client.Put(new RiakObject(Bucket, string.Format("time_{0}", i), EmptyBody, RiakConstants.ContentTypes.ApplicationJson));
            }

            var mr = new RiakMapReduceQuery {ContentType = MrContentType};

            mr.Inputs(Bucket)
                .Filter(f => f.Equal("time_8"))
                .MapJs(m => m.Source("function (o) { return [1]; }"))
                .ReduceJs(r => r.Name("Riak.reduceSum").Keep(true));

            var result = Client.MapReduce(mr);
            result.ShouldNotBeNull();

            var mrResult = result;
            mrResult.PhaseResults.ShouldNotBeNull();
            mrResult.PhaseResults.Count().ShouldEqual(2);

            mrResult.PhaseResults.ElementAt(0).Phase.ShouldEqual(0u);
            mrResult.PhaseResults.ElementAt(1).Phase.ShouldEqual(1u);

            mrResult.PhaseResults.ElementAt(0).Values.Count().ShouldEqual(0);
            mrResult.PhaseResults.ElementAt(1).Values.Count().ShouldNotEqual(0);

            var values = JsonConvert.DeserializeObject<int[]>(mrResult.PhaseResults.ElementAt(1).Values.First().FromRiakString());
            values[0].ShouldEqual(1);
        }
コード例 #3
0
        public void SearchingByNameReturnsTheObjectId()
        {
            Client.Put(new RiakObject(Bucket, RiakSearchKey, RiakSearchDoc, RiakConstants.ContentTypes.ApplicationJson));
            Client.Put(new RiakObject(Bucket, RiakSearchKey2, RiakSearchDoc2, RiakConstants.ContentTypes.ApplicationJson));

            var mr = new RiakMapReduceQuery();

            var modFunArg = new RiakModuleFunctionArgInput
                                {
                Module = "riak_search",
                Function = "mapred_search",
                Arg = new[] {Bucket, "name:Al*"}
            };

            mr.Inputs(modFunArg);

            var result = Client.MapReduce(mr);
            result.IsSuccess.ShouldBeTrue();

            var mrResult = result.Value;
            mrResult.PhaseResults.Count().ShouldEqual(1);

            mrResult.PhaseResults.ElementAt(0).Values.ShouldNotBeNull();
            // TODO Add data introspection to test - need to verify the results, after all.
        }
コード例 #4
0
        private void DeleteExpiredSessions()
        {
            // MR to get sessions to delete
            var query = new RiakMapReduceQuery();
            query.Inputs(ApplicationName)
                .MapJs(
                    m =>
                    m.Source(@"
function (value, keyData, arg) {
    var now = new Date(Date.parse(arg));
    var metadata = value.values[0].metadata;
    var expires = metadata['X-Riak-Meta']['X-Riak-Meta-Expires'];

    if (arg > expires) 
    {
        return [value.key, expires];
    }
    else
    {
        return [];
    }
}")
                        .Argument(DateTime.Now.ToString("R")));

            var results = _client.MapReduce(query);

            if (results.IsSuccess)
            {
                var keys = results.Value.PhaseResults.ElementAt(results.Value.PhaseResults.Count() - 1).Value.FromRiakString();
                var keyList = JsonConvert.DeserializeObject<string[]>(keys);

                var riakObjectIdList = keyList.Select(key => new RiakObjectId(ApplicationName, key)).ToList();

                _client.Async.Delete(riakObjectIdList, deleteResults => { return; });
            }
        }
コード例 #5
0
        private void InvokeExpireCallbackAndDeleteSession()
        {
            // MR to get sessions to delete
            var query = new RiakMapReduceQuery();
            query.Inputs(ApplicationName)
                .MapJs(
                    m =>
                    m.Source(@"
function (value, keyData, arg) {
    var now = new Date(Date.parse(arg));
    var metadata = value.values[0].metadata;
    var expires = metadata['X-Riak-Meta']['X-Riak-Meta-Expires'];

    if (arg > expires) 
    {
        return [value.key, expires];
    }
    else
    {
        return [];
    }
}")
                        .Argument(DateTime.Now.ToString("R")));

            var results = _client.MapReduce(query);
            
            if (results.IsSuccess)
            {
                var keys = results.Value.PhaseResults.ElementAt(results.Value.PhaseResults.Count() - 1).Value.FromRiakString();
                var keyList = JsonConvert.DeserializeObject<string[]>(keys);

                var riakObjectIdList = keyList.Select(key => new RiakObjectId(ApplicationName, key)).ToList();

                // for some stupid reason, we have to retrieve all of the deleted keys, process them, and THEN delete them
                var riakSessionObjects = _client.Get(riakObjectIdList);
                foreach (var riakSessionObject in riakSessionObjects)
                {
                    var value = riakSessionObject.Value;
                    var session = new RiakSessionItem(value);
                    _expireCallBack.Invoke(value.Key, Deserialize(session.SessionStoreItems));
                }

                _client.Async.Delete(riakObjectIdList, deleteResults => { return; });
            }
        }
コード例 #6
0
        public IQueryable<Dinner> FindByLocation(float latitude, float longitude)
        {
            var mr = new RiakMapReduceQuery { ContentType = RiakConstants.ContentTypes.ApplicationJson };

            var input = new RiakIntIndexRangeInput(DinnerBucket, "EventDate_int", int.Parse(DateTime.Now.ToString("yyyyMMdd")), int.MaxValue);

            mr.Inputs(input)
                .MapJs(m => m.Name("Riak.mapValuesJson").Keep(false))
                .MapJs(
                    m =>
                    m.Source(
                        @"
            function (value, keyData, arg) {
            // From http://stackoverflow.com/questions/27928/how-do-i-calculate-distance-between-two-latitude-longitude-points
            var lat, long = arg.split(""|"");

            var R = 6371; // Radius of the earth in km
            var dLat = (lat2-lat).toRad();  // Javascript functions in radians
            var dLon = (lon2-lon).toRad();
            var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) *
            Math.sin(dLon/2) * Math.sin(dLon/2);
            var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
            var d = R * c; // Distance in km
            var m = d * 1.609344; // Distance in miles

            if (m < 100) {
            return [value];
            }
            else
            {
            return [];
            }
            }
            ")
                        .Argument(string.Format("{0}|{1}", latitude, longitude))
                        .Keep(true));

            return MapReduceDinners(mr);

            //var dinners = from dinner in FindUpcomingDinners()
            //              join i in NearestDinners(latitude, longitude)
            //              on dinner.DinnerID equals i.DinnerID
            //              select dinner;

            //return dinners;
        }
コード例 #7
0
        public IQueryable<Dinner> NearestDinners(double latitude, double longitude)
        {
            var mr = new RiakMapReduceQuery {ContentType = RiakConstants.ContentTypes.ApplicationJson};

            mr.Inputs(DinnerBucket)
                .MapJs(
                    m =>
                    m.Source(
                        @"
            function (value, keyData, arg) {
            // From http://stackoverflow.com/questions/27928/how-do-i-calculate-distance-between-two-latitude-longitude-points
            var lat, long = arg.split(""|"");

            var R = 6371; // Radius of the earth in km
            var dLat = (lat2-lat).toRad();  // Javascript functions in radians
            var dLon = (lon2-lon).toRad();
            var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) *
            Math.sin(dLon/2) * Math.sin(dLon/2);
            var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
            var d = R * c; // Distance in km
            var m = d * 1.609344; // Distance in miles

            if (m < 100) {
            return [value];
            }
            else
            {
            return [];
            }
            }
            ")
                        .Argument(string.Format("{0}|{1}", latitude, longitude))
                        .Keep(true));

            return MapReduceDinners(mr);

            //return from d in _db.Dinners
            //       where DistanceBetween(latitude, longitude, d.Latitude, d.Longitude) < 100
            //       select d;
        }
コード例 #8
0
        public IQueryable<Dinner> FindUpcomingDinners()
        {
            var mr = new RiakMapReduceQuery { ContentType = RiakConstants.ContentTypes.ApplicationJson };

            // TODO: Modify DinnerId to be a string.

            var input = new RiakIntIndexRangeInput(DinnerBucket, "EventDate_int", int.Parse(DateTime.Now.ToString("yyyyMMdd")), int.MaxValue);

            mr.Inputs(input)
                .MapJs(m => m.Name("Riak.mapValuesJson").Keep(true));

            return MapReduceDinners(mr);

            //return from dinner in FindAllDinners()
            //       where dinner.EventDate >= DateTime.Now
            //       orderby dinner.EventDate
            //       select dinner;
        }
コード例 #9
0
        //
        // Query Methods
        public IQueryable<Dinner> FindDinnersByText(string q)
        {
            var mr = new RiakMapReduceQuery { ContentType = RiakConstants.ContentTypes.ApplicationJson };

            mr.Inputs(DinnerBucket)
                .MapJs(m => m.Source(@"
            function (value, keyData, arg) {
            var o = Riak.mapValuesJson(value)[0];

            if (o.Title.Contains(arg.keyword)
            || o.Description.Contains(arg.keyword)
            || o.HostedBy.Contains(arg.keyword))
            {
            return [o];
            }
            }
            ").Argument(q).Keep(true));

            // TODO create a version of this using RiakSearch

            var mrResult = _client.MapReduce(mr);
            if (mrResult.IsSuccess)
            {
                var results = mrResult.Value.PhaseResults.Last().GetObjects<Dinner>();
                return results.AsQueryable();
            }

            throw new ApplicationException(mrResult.ErrorMessage);
        }
コード例 #10
0
        public void StartsWithAndBetweenReturnASubsetOfAllKeys()
        {
            for (var i = 0; i < 10; i++)
            {
                Client.Put(new RiakObject(Bucket, string.Format("time_{0}", i), EmptyBody, RiakConstants.ContentTypes.ApplicationJson));
            }

            var mr = new RiakMapReduceQuery { ContentType = MrContentType };

            mr.Inputs(Bucket)
                .Filter(f => f.And(l => l.StartsWith("time"),
                                   r => r.Tokenize("_", 2)
                                            .StringToInt()
                                            .Between(3, 7, true)))
                .MapJs(m => m.Source("function (o) { return [1]; }").Keep(false))
                .ReduceJs(r => r.Name("Riak.reduceSum").Keep(true));

            var result = Client.MapReduce(mr);
            result.ShouldNotBeNull();

            var mrResult = result;
            mrResult.PhaseResults.ShouldNotBeNull();
            mrResult.PhaseResults.Count().ShouldEqual(2);

            var values = result.PhaseResults.ElementAt(1).GetObjects<int[]>().First();
            values[0].ShouldEqual(5);
        }
コード例 #11
0
        public void SearchingByNameUsingRiakSearchObjectReturnsTheObjectid()
        {
            Client.Put(new RiakObject(Bucket, RiakSearchKey, RiakSearchDoc, RiakConstants.ContentTypes.ApplicationJson));
            Client.Put(new RiakObject(Bucket, RiakSearchKey2, RiakSearchDoc2, RiakConstants.ContentTypes.ApplicationJson));

            var mr = new RiakMapReduceQuery();

            //var rspt = new RiakSearchPhraseToken {Field = "name", Term = "Al*"};
            var rspt = new RiakSearchPhraseToken("Al*");

            var mfa = new RiakModuleFunctionArgInput
                          {
                              Module = "riak_search",
                              Function = "mapred_search",
                              Arg = new[] {Bucket, rspt.ToString()}
                          };

            mr.Inputs(mfa);

            var result = Client.MapReduce(mr);
            result.IsSuccess.ShouldBeTrue();

            var mrResult = result.Value;
            mrResult.PhaseResults.Count().ShouldEqual(1);

            mrResult.PhaseResults.ElementAt(0).Values.ShouldNotBeNull();
        }
コード例 #12
0
        public void StartsWithFindsAllKeys()
        {
            for (int i = 0; i < 10; i++)
            {
                Client.Put(new RiakObject(Bucket, string.Format("time_{0}", i), EmptyBody, RiakConstants.ContentTypes.ApplicationJson));
            }

            var mr = new RiakMapReduceQuery { ContentType = MrContentType };

            mr.Inputs(Bucket)
                .Filter(f => f.StartsWith("time"))
                .MapJs(m => m.Source("function (o) { return [1]; }"))
                .ReduceJs(r => r.Name("Riak.reduceSum").Keep(true));

            var result = Client.MapReduce(mr);
            result.IsSuccess.ShouldBeTrue();

            var mrResult = result.Value;
            mrResult.PhaseResults.ShouldNotBeNull();
            mrResult.PhaseResults.Count().ShouldEqual(2);

            mrResult.PhaseResults.ElementAt(0).Phase.ShouldEqual(0u);
            mrResult.PhaseResults.ElementAt(1).Phase.ShouldEqual(1u);

            mrResult.PhaseResults.ElementAt(0).Values.Count().ShouldEqual(0);
            mrResult.PhaseResults.ElementAt(1).Values.Count().ShouldNotEqual(0);

            var values = result.Value.PhaseResults.ElementAt(1).GetObjects<int[]>().First();
            values[0].ShouldEqual(10);
        }