public Location toLoaction() { Location location = new Location(); location.Latitude = this.Latitude; location.Longitude = this.Longitude; return location; }
public LocationModel(Location location) { if (location != null) { Latitude = location.Latitude; Longitude = location.Longitude; } }
/// <summary> /// Naive implementation of search. /// Without full text search fetures. /// Based on location and IgnoreCase /// </summary> /// <param name="searchText"></param> /// <param name="userLocation"></param> /// <returns></returns> internal List<BaseSearchableEnabledItem> Search(Location userLocation, int searchCount = 20, string searchText = null, double maxDistance = 0.5) { Stopwatch stop = Stopwatch.StartNew(); var queryCollection = Query.NE("IsDeleted", true); using (Restaurants recipesDb = new Restaurants()) { //MongoEntityRepositoryBase<RestaurantBasicData> mongoRepository = // new MongoEntityRepositoryBase<RestaurantBasicData>(recipesDb.DB); if (searchText != null) { var queryDesc = Query.Matches("Description", BsonRegularExpression.Create(new Regex(searchText, RegexOptions.IgnoreCase))); var queryName = Query.Matches("Name", BsonRegularExpression.Create(new Regex(searchText, RegexOptions.IgnoreCase))); var queryDescDishesDesc = Query.Matches("Menu.MenuParts.Dishes.Description", BsonRegularExpression.Create(new Regex(searchText, RegexOptions.IgnoreCase))); var queryDescDishesName = Query.Matches("Menu.MenuParts.Dishes.Name", BsonRegularExpression.Create(new Regex(searchText, RegexOptions.IgnoreCase))); queryCollection = Query.And( queryCollection, queryCollection = Query.Or(queryDesc, queryName, queryDescDishesDesc, queryDescDishesName) ); //queryCollection = Query.And( // queryCollection, // Query.Or(queryDesc, queryName) //); } var collection = recipesDb.DB.GetCollection<RestaurantBasicData>(typeof(RestaurantBasicData).Name); collection.EnsureIndex(IndexKeys.GeoSpatial("ItemLocation.RawLocation")); var options = GeoNearOptions.SetMaxDistance(maxDistance).SetSpherical(true);//.SetSpherical(true) var geoResults = new MongoDB.Driver.GeoNearResult<RestaurantBasicData>(); if (searchCount <= 0) { geoResults = collection.GeoNearAs<RestaurantBasicData>(queryCollection, userLocation.Longitude, userLocation.Latitude, 250, options); } else { geoResults = collection.GeoNearAs<RestaurantBasicData>(queryCollection, userLocation.Longitude, userLocation.Latitude, searchCount, options); } log.DebugFormat("Search exec={0}", stop.ElapsedMilliseconds); return FillGeoSearchItems(geoResults, userLocation); } }
public void IServiceLayer_GetDefaultItems() { //Arrange Location userLocation = new Location(); MembershipUser currentUser = null; //Act IList<BaseSearchableEnabledItem> defaultItems = m_MocServiceLayer.GetDefaultItems(currentUser, userLocation); //Assert Assert.IsTrue(defaultItems.Count > 0); foreach (var searchableItem in defaultItems) { Assert.IsInstanceOfType(searchableItem.ItemLocation, typeof(Location)); Assert.IsTrue(!string.IsNullOrEmpty(searchableItem.Name)); Assert.IsNotNull(searchableItem.MappedState); Assert.IsNotNull(searchableItem.Image); Assert.IsInstanceOfType(searchableItem.Image, typeof(ImageData)); } }
public void TestGetRawGeoResults_multippleQueries() { string searchText = "ודניאל"; Location searchLocation = new Location() { Latitude = 1, Longitude = 2 }; for (int i = 0; i < 3; i++) { AddRestourantToRepositary(); } //act var query = Query.Matches("Description", BsonRegularExpression.Create(new Regex(searchText, RegexOptions.IgnoreCase))); var queryName = Query.Matches("Name", BsonRegularExpression.Create(new Regex(searchText, RegexOptions.IgnoreCase))); var queryCollection = Query.Or(query, queryName); var collection = m_Testdb.GetCollection<RestaurantBasicData>(typeof(RestaurantBasicData).Name); var notGeoResults = collection.Find(query).ToList<RestaurantBasicData>(); collection.EnsureIndex(IndexKeys.GeoSpatial("ItemLocation.RawLocation")); var geoResults = collection.GeoNearAs<RestaurantBasicData>(queryCollection, searchLocation.Latitude, searchLocation.Longitude, 100); //assert Assert.AreEqual(3, geoResults.Hits.Count); foreach (var hit in geoResults.Hits) { Assert.IsTrue(hit.Distance > 0); Assert.IsNotNull(hit.Document); } }
private List<BaseSearchableEnabledItem> FillGeoSearchItems(MongoDB.Driver.GeoNearResult<RestaurantBasicData> geoResults, Location sourceLocation) { List<BaseSearchableEnabledItem> returnValue = new List<BaseSearchableEnabledItem>(); foreach (var result in geoResults.Hits) { BaseSearchableEnabledItem item = result.Document; Location targetLocation = item.ItemLocation; //Check if it is possible to produce on mongodb part //http://api.mongodb.org/wiki/current/Geospatial%20Indexing.html item.Distance = CalcDistance(sourceLocation, targetLocation); returnValue.Add(item); } return returnValue.OrderBy(s => s.Distance).ToList(); }
public void TestGetRawGeoResults_distanceShouldBeGreaterThen_zero() { Location searchLocation = new Location() { Latitude = 1, Longitude = 2 }; for (int i = 0; i < 3; i++) { AddRestourantToRepositary(); } var query = Query.Matches("Description", BsonRegularExpression.Create(new Regex("משהו", RegexOptions.IgnoreCase))); var collection = m_Testdb.GetCollection<RestaurantBasicData>(typeof(RestaurantBasicData).Name); var notGeoResults = collection.Find(query).ToList<RestaurantBasicData>(); collection.EnsureIndex(IndexKeys.GeoSpatial("ItemLocation.RawLocation")); var geoResults = collection.GeoNearAs<RestaurantBasicData>(query, searchLocation.Latitude, searchLocation.Longitude, 100); //act var updatedDistance = FillGeoSearchItems(geoResults); //assert Assert.AreEqual(3, updatedDistance.Count); foreach (var updated in updatedDistance) { Assert.IsTrue(updated.Distance > 0); } }
public List<BaseSearchableEnabledItem> FindNearestRestaurantsByOperator(string operatorName, Location location, double maxDistance) { using (Restaurants restaurantsDb = new Restaurants()) { //MongoEntityRepositoryBase<RestaurantBasicData> basicData = // new MongoEntityRepositoryBase<RestaurantBasicData>(restaurantsDb.DB); var queryCollection = Query.NE("IsDeleted", true); var queryName = Query.Matches("Name", BsonRegularExpression.Create(new Regex(operatorName, RegexOptions.IgnoreCase))); //var queryAddres = Query.Matches("Address.City", BsonRegularExpression.Create(new Regex(city, RegexOptions.IgnoreCase))); //var queryDescription = Query.Matches("Description", BsonRegularExpression.Create(new Regex(city, RegexOptions.IgnoreCase))); var queryMenu = Query.Exists("Menu.MenuParts.3"); queryCollection = Query.And( queryCollection, queryName, queryMenu ); var collection = restaurantsDb.DB.GetCollection<RestaurantBasicData>(typeof(RestaurantBasicData).Name); collection.EnsureIndex(IndexKeys.GeoSpatial("ItemLocation.RawLocation")); collection.EnsureIndex(IndexKeys.Ascending("IsDeleted")); var options = GeoNearOptions.SetMaxDistance(maxDistance).SetSpherical(true); GeoNearResult<RestaurantBasicData> geoResults; geoResults = collection.GeoNearAs<RestaurantBasicData>(queryCollection, location.Longitude, location.Latitude, 20, options); var restaurantsList = FillGeoSearchItems(geoResults, location); //var allRests = basicData.FindAs(queryCollection, 0).OrderBy(r => r.Name).Reverse(); //List<RestaurantBasicData> restaurantsList = allRests.ToList(); int restsCount = restaurantsList != null ? restaurantsList.Count : 0; log.InfoFormat("[FindAllRestaurantsByOperator] count={0}.", restsCount); return restaurantsList; } }
private double CalcDistance(Location sourceLocation, Location targetLocation) { //Check if this function can produced by native mongodb query double dDistance = Double.MinValue; double dLat1InRad = sourceLocation.Latitude * (Math.PI / 180.0); double dLong1InRad = sourceLocation.Longitude * (Math.PI / 180.0); double dLat2InRad = targetLocation.Latitude * (Math.PI / 180.0); double dLong2InRad = targetLocation.Longitude * (Math.PI / 180.0); double dLongitude = dLong2InRad - dLong1InRad; double dLatitude = dLat2InRad - dLat1InRad; // Intermediate result a. double a = Math.Pow(Math.Sin(dLatitude / 2.0), 2.0) + Math.Cos(dLat1InRad) * Math.Cos(dLat2InRad) * Math.Pow(Math.Sin(dLongitude / 2.0), 2.0); // Intermediate result c (great circle distance in Radians). double c = 2.0 * Math.Asin(Math.Sqrt(a)); // Distance. // const Double kEarthRadiusMiles = 3956.0; const Double kEarthRadiusKms = 6376.5; dDistance = kEarthRadiusKms * c; return dDistance; }
public IList<BaseSearchableEnabledItem> SearchNearest(MembershipUser currentUser, Location userLocation, int searchCount, double maxDistance) { return m_MocServiceLayer.SearchNearest(currentUser, userLocation, searchCount, maxDistance); }
public IList<DataModel.BaseSearchableEnabledItem> GetDefaultItems(MembershipUser currentUser, Location userLocation) { return m_MocServiceLayer.GetDefaultItems(currentUser, userLocation); }
public void IServiceLayer_Search_FreeText_ShouldReturnList() { //Arrange Location userLocation = new Location(); MembershipUser currentUser = null; string searchText = "שניצל"; int searchCount = 20; //Act IList<BaseSearchableEnabledItem> searchedItems = m_MocServiceLayer.Search(currentUser, userLocation, searchCount, searchText, 1); //Assert Assert.IsTrue(searchedItems.Count > 0); foreach (var searchableItem in searchedItems) { Assert.IsInstanceOfType(searchableItem.ItemLocation, typeof(Location)); Assert.IsTrue(!string.IsNullOrEmpty(searchableItem.Name)); Assert.IsNotNull(searchableItem.MappedState); Assert.IsNotNull(searchableItem.Image); Assert.IsInstanceOfType(searchableItem.Image, typeof(ImageData)); } }
internal CouponType FindNearestCoupon(List<CouponType> couponsList, Location location) { if (couponsList == null || couponsList.Count == 0 || location == null) { log.WarnFormat("[FindNearestCoupon] couponsList is null or empty or location=null"); return null; } CouponType returnCoupon = null; double minimalDistance = 1; //Max distance in Radians foreach (CouponType coupon in couponsList) { if (coupon.LocationsList != null && coupon.LocationsList[0] != null) { double e = (3.1415926538 * location.Latitude / 180); double f = (3.1415926538 * location.Longitude / 180); double g = (3.1415926538 * coupon.LocationsList[0].Latitude / 180); double h = (3.1415926538 * coupon.LocationsList[0].Longitude / 180); double i = (Math.Cos(e) * Math.Cos(g) * Math.Cos(f) * Math.Cos(h) + Math.Cos(e) * Math.Sin(f) * Math.Cos(g) * Math.Sin(h) + Math.Sin(e) * Math.Sin(g)); double j = (Math.Acos(i)); if (minimalDistance > j) { returnCoupon = coupon; minimalDistance = j; } } //else //{ // log.WarnFormat("[FindNearestCoupon] tried to get nearest coupon, but one of coupons has NULL location."); // return null; //} } return returnCoupon; }
public void SaveUserActivity_Save_PropertiesOfActivity_Update_ActivityPoint_and_TotalPoints() { //Arrange string RestaurantID = "51b02f863720e81d6cf62a3b"; Location userLocation = new Location() { Latitude = 32.325037, Longitude = 34.867577 }; //MembershipUser currentUser = null; var activity = new AddRestaurantActivity() { RestaurantID = RestaurantID, LocationAdd = userLocation }; //m_MocBackOfficeService; //Act //IList<BaseSearchableEnabledItem> searchedItems = m_MocServiceLayer.Search(currentUser, userLocation, searchCount, searchText, 1); m_MocServiceLayer.SaveUserActivity(activity); //Assert Assert.IsNotNull(activity); //Assert.IsTrue(searchedItems.Count > 0); //foreach (var searchableItem in searchedItems) //{ // Assert.IsInstanceOfType(searchableItem.ItemLocation, typeof(Location)); // Assert.IsTrue(!string.IsNullOrEmpty(searchableItem.Name)); // Assert.IsNotNull(searchableItem.MappedState); // Assert.IsNotNull(searchableItem.Image); // Assert.IsInstanceOfType(searchableItem.Image, typeof(ImageData)); //} }
public List<Ingredient> IngredientSearch(MembershipUser currentUser, Location userLocation, int searchCount, string searchText) { return m_MocServiceLayer.IngredientSearch(currentUser, userLocation, searchCount, searchText); }
/// <summary> /// Will use this function to find similar restaurants in DB, while import new restaurants /// </summary> /// <param name="userLocation"></param> /// <param name="searchCount"></param> /// <param name="maxDistance"></param> /// <returns></returns> public IList<BaseSearchableEnabledItem> SearchNearestService(Location location, int searchCount, double maxDistance) { log.DebugFormat("[SearchNearestSevice] location={0}, searchCount={1}, maxDistance(in Radians)={2}.", location, searchCount, maxDistance); List<BaseSearchableEnabledItem> returnValue = new List<BaseSearchableEnabledItem>(); SearchUtility searchEngine = new SearchUtility(); return searchEngine.Search(location, searchCount, null, maxDistance); }
public IList<BaseSearchableEnabledItem> SearchNearest(MembershipUser currentUser, Location userLocation, int searchCount, double maxDistance) { log.DebugFormat("[Search] currentUser={0}, userLocation={1}, searchCount={2}.", currentUser, userLocation, searchCount); List<BaseSearchableEnabledItem> returnValue = new List<BaseSearchableEnabledItem>(); m_userProfile.TraceSuggestValue(string.Empty, userLocation.Latitude, userLocation.Longitude); SearchUtility searchEngine = new SearchUtility(); return searchEngine.Search(userLocation, searchCount, null, maxDistance); }
public List<GeneralDish> SearchGeneralDish(MembershipUser currentUser, Location userLocation, int searchCount, string searchText) { log.DebugFormat("[SearchGeneralDish] currentUser={0}, userLocation={1}, searchCount={2}, searchText={3}.", currentUser, userLocation, searchCount, searchText); List<GeneralDish> returnValue = new List<GeneralDish>(); SearchUtility searchEngine = new SearchUtility(); returnValue = searchEngine.SearchGeneralDish(searchCount, searchText); m_userProfile.TraceSuggestValue(searchText, userLocation.Latitude, userLocation.Longitude); return returnValue; }
public IList<BaseSearchableEnabledItem> GetDefaultItems(MembershipUser currentUser, Location userLocation) { return SearchNearest(currentUser, userLocation, 20, 1); }
public List<GeneralDish> SearchGeneralDish(MembershipUser currentUser, Location userLocation, int searchCount, string searchText) { return m_MocServiceLayer.SearchGeneralDish(currentUser, userLocation, searchCount, searchText); }