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. }
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); }
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. }
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; }); } }
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; }); } }
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; }
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; }
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; }
// // 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); }
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); }
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(); }
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); }