Esempio n. 1
0
 public Location toLoaction()
 {
     Location location = new Location();
     location.Latitude = this.Latitude;
     location.Longitude = this.Longitude;
     return location;
 }
Esempio n. 2
0
 public LocationModel(Location location)
 {
     if (location != null)
     {
         Latitude = location.Latitude;
         Longitude = location.Longitude;
     }
 }
Esempio n. 3
0
        /// <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);
            }
        }
Esempio n. 4
0
        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));
            }
        }
Esempio n. 5
0
        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);
            }
        }
Esempio n. 6
0
        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();
        }
Esempio n. 7
0
        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);
            }
        }
Esempio n. 8
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;
            }
        }
Esempio n. 9
0
        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;
        }
Esempio n. 10
0
 public IList<BaseSearchableEnabledItem> SearchNearest(MembershipUser currentUser, Location userLocation, int searchCount, double maxDistance)
 {
     return m_MocServiceLayer.SearchNearest(currentUser, userLocation, searchCount, maxDistance);
 }
Esempio n. 11
0
 public IList<DataModel.BaseSearchableEnabledItem> GetDefaultItems(MembershipUser currentUser, Location userLocation)
 {
     return m_MocServiceLayer.GetDefaultItems(currentUser, userLocation);
 }
Esempio n. 12
0
        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));
            }
        }
Esempio n. 13
0
        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;
        }
Esempio n. 14
0
        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));
            //}
        }
Esempio n. 15
0
 public List<Ingredient> IngredientSearch(MembershipUser currentUser, Location userLocation, int searchCount, string searchText)
 {
     return m_MocServiceLayer.IngredientSearch(currentUser, userLocation, searchCount, searchText);
 }
Esempio n. 16
0
 /// <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);
 }
Esempio n. 17
0
 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);
 }
Esempio n. 18
0
 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;
 }
Esempio n. 19
0
 public IList<BaseSearchableEnabledItem> GetDefaultItems(MembershipUser currentUser, Location userLocation)
 {
     return SearchNearest(currentUser, userLocation, 20, 1);
 }
Esempio n. 20
0
 public List<GeneralDish> SearchGeneralDish(MembershipUser currentUser, Location userLocation, int searchCount, string searchText)
 {
     return m_MocServiceLayer.SearchGeneralDish(currentUser, userLocation, searchCount, searchText);
 }