Refactored code that improves performance and readability

This commit is contained in:
William Woods 2023-04-03 07:22:50 +00:00
parent d73c0bdf73
commit 37ec1935ea

View File

@ -1,7 +1,6 @@
package com.twitter.follow_recommendations.common.clients.geoduck package com.twitter.follow_recommendations.common.clients.geoduck
import com.twitter.follow_recommendations.common.models.GeohashAndCountryCode import com.twitter.follow_recommendations.common.models.GeohashAndCountryCode
import com.twitter.geoduck.common.thriftscala.Location
import com.twitter.geoduck.common.thriftscala.PlaceQuery import com.twitter.geoduck.common.thriftscala.PlaceQuery
import com.twitter.geoduck.common.thriftscala.ReverseGeocodeIPRequest import com.twitter.geoduck.common.thriftscala.ReverseGeocodeIPRequest
import com.twitter.geoduck.service.thriftscala.GeoContext import com.twitter.geoduck.service.thriftscala.GeoContext
@ -12,46 +11,21 @@ import javax.inject.Singleton
@Singleton @Singleton
class ReverseGeocodeClient @Inject() (rgcService: ReverseGeocoder.MethodPerEndpoint) { class ReverseGeocodeClient @Inject() (rgcService: ReverseGeocoder.MethodPerEndpoint) {
def getGeohashAndCountryCode(ipAddress: String): Stitch[GeohashAndCountryCode] = { def getGeohashAndCountryCode(ipAddress: String): Stitch[GeohashAndCountryCode] =
Stitch Stitch.callFuture {
.callFuture { rgcService.reverseGeocodeIp(
rgcService ReverseGeocodeIPRequest(Seq(ipAddress), PlaceQuery(None), simpleReverseGeocode = true)
.reverseGeocodeIp( ).map { response =>
ReverseGeocodeIPRequest( response.found.get(ipAddress) match {
Seq(ipAddress), case Some(location) => getGeohashAndCountryCodeFromLocation(location)
PlaceQuery(None), case _ => GeohashAndCountryCode(None, None)
simpleReverseGeocode = true }
) // note: simpleReverseGeocode means that country code will be included in response
).map { response =>
response.found.get(ipAddress) match {
case Some(location) => getGeohashAndCountryCodeFromLocation(location)
case _ => GeohashAndCountryCode(None, None)
}
}
}
}
private def getGeohashAndCountryCodeFromLocation(location: Location): GeohashAndCountryCode = {
val countryCode: Option[String] = location.simpleRgcResult.flatMap { _.countryCodeAlpha2 }
val geohashString: Option[String] = location.geohash.flatMap { hash =>
hash.stringGeohash.flatMap { hashString =>
Some(ReverseGeocodeClient.truncate(hashString))
} }
} }
private def getGeohashAndCountryCodeFromLocation(location: Location): GeohashAndCountryCode = {
val countryCode = location.simpleRgcResult.flatMap(_.countryCodeAlpha2)
val geohashString = location.geohash.flatMap(_.stringGeohash.map(_.take(4)))
GeohashAndCountryCode(geohashString, countryCode) GeohashAndCountryCode(geohashString, countryCode)
} }
}
object ReverseGeocodeClient {
val DefaultGeoduckIPRequestContext: GeoContext =
GeoContext(allPlaceTypes = true, includeGeohash = true, includeCountryCode = true)
// All these geohashes are guessed by IP (Logical Location Source).
// So take the four letters to make sure it is consistent with LocationServiceClient
val GeohashLengthAfterTruncation = 4
def truncate(geohash: String): String = geohash.take(GeohashLengthAfterTruncation)
} }