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