Ejemplo n.º 1
0
        public void when_searching_nearby_places_with_name()
        {
            var places = Sut.SearchPlaces(Latitude, Longitude, "restaurants", "en", 800);

            CollectionAssert.IsNotEmpty(places);
            Assert.NotNull(places.First().Name);
        }
Ejemplo n.º 2
0
        public Address[] SearchPlaces(string query, double?latitude, double?longitude, string currentLanguage)
        {
            // the radius depends on what we want, if we have a query, then search larger, otherwise use nearby radius
            var radius = query.HasValueTrimmed()
                ? _appSettings.Data.GeoLoc.SearchRadius <= 0 ? 45000 : _appSettings.Data.GeoLoc.SearchRadius
                : _appSettings.Data.NearbyPlacesService.DefaultRadius <= 0 ? 500 : _appSettings.Data.NearbyPlacesService.DefaultRadius;

            #if DEBUG
            Console.WriteLine(string.Format("Places.SearchPlaces with query: {0} radius: {1}", query.HasValueTrimmed() ? query : "(none) [nearby]", radius));
            #endif

            latitude  = (!latitude.HasValue || latitude.Value == 0) ? _appSettings.Data.GeoLoc.DefaultLatitude : latitude;
            longitude = (!longitude.HasValue || longitude.Value == 0) ? _appSettings.Data.GeoLoc.DefaultLongitude : longitude;

            var popularAddresses = Enumerable.Empty <Address>();

            var topPopularAddresses    = Enumerable.Empty <Address>();
            var bottomPopularAddresses = Enumerable.Empty <Address>();


            popularAddresses = from a in _popularAddressProvider.GetPopularAddresses()
                               select a;

            topPopularAddresses = popularAddresses.Take(_appSettings.Data.NumberOfPreferredPlacesToShow);

            if (latitude.HasValue && longitude.HasValue)
            {
                if (string.IsNullOrEmpty(query))
                {
                    bottomPopularAddresses = popularAddresses.Skip(_appSettings.Data.NumberOfPreferredPlacesToShow);
                }
                else
                {
                    var words = query.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    bottomPopularAddresses = from a in popularAddresses.Skip(_appSettings.Data.NumberOfPreferredPlacesToShow)
                                             where
                                             words.All(
                        w =>
                        a.FriendlyName.ToUpper().Contains(w.ToUpper()) ||
                        a.FullAddress.ToUpper().Contains(w.ToUpper()))
                                             select a;
                }

                bottomPopularAddresses = bottomPopularAddresses.ForEach(p => p.AddressType = "popular");
            }

            var places = !query.HasValueTrimmed()
                ? _client.GetNearbyPlaces(latitude, longitude, currentLanguage, radius)
                : _client.SearchPlaces(latitude, longitude, query, currentLanguage, radius);

            var result = bottomPopularAddresses
                         .Concat(places.Select(ConvertToAddress));

            if (latitude.HasValue && longitude.HasValue)
            {
                result = result.OrderBy(p => AddressSortingHelper.GetRelevance(p, query, latitude, longitude));
            }

            // make sure the company favorites are at the top
            result = topPopularAddresses
                     .Concat(result);

            // take top 15
            result = result.Take(15);

            #if DEBUG
            Console.WriteLine("Places.SearchPlaces results");
            foreach (var address in result)
            {
                Console.WriteLine(string.Format("    {0}", address.DisplayLine1));
            }
            #endif

            return(result.ToArray());
        }