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> 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; }