private Address[] ProcessAddresses(string name, IEnumerable <Address> allResults, double?latitude, double?longitude, string currentLanguage, GeoResult geoResult = null) { IEnumerable <Address> addressesGeocode; IEnumerable <Address> addressesPlaces = new Address[0]; // ReSharper disable CompareOfFloatsByEqualityOperator if (latitude.HasValue && longitude.HasValue && (latitude.Value != 0 || longitude.Value != 0)) // ReSharper restore CompareOfFloatsByEqualityOperator { addressesGeocode = allResults .OrderBy(adrs => Position.CalculateDistance(adrs.Latitude, adrs.Longitude, latitude.Value, longitude.Value)); } else { addressesGeocode = allResults; } var term = name.FirstOrDefault(); int n; if (!int.TryParse(term + "", out n)) { var nearbyService = new Places(_placeProvider, _appSettings, _popularAddressProvider); addressesPlaces = nearbyService.SearchPlaces(name, latitude, longitude, currentLanguage); } return(addressesGeocode .Take(20) .Concat(addressesPlaces.Take(20)) .OrderBy(p => AddressSortingHelper.GetRelevance(p, name, latitude, longitude)) .ToArray()); }
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()); }