From ed10f782cb31f50856c4adc7307c4a0babb0483a Mon Sep 17 00:00:00 2001 From: Alex Reisner <alex@alexreisner.com> Date: Sat, 29 Sep 2012 14:20:53 -0400 Subject: [PATCH] Merge two methods into one. Reduces code duplication. --- lib/geocoder/stores/active_record.rb | 61 ++++++++-------------------- 1 file changed, 16 insertions(+), 45 deletions(-) diff --git a/lib/geocoder/stores/active_record.rb b/lib/geocoder/stores/active_record.rb index 03e0b370..5002a9f0 100644 --- a/lib/geocoder/stores/active_record.rb +++ b/lib/geocoder/stores/active_record.rb @@ -98,10 +98,22 @@ module Geocoder::Store # * +:exclude+ - an object to exclude (used by the +nearbys+ method) # def near_scope_options(latitude, longitude, radius = 20, options = {}) - method_prefix = using_sqlite? ? "approx" : "full" - send( - method_prefix + "_near_scope_options", - latitude, longitude, radius, options + options[:units] ||= (geocoder_options[:units] || Geocoder::Configuration.units) + bearing = bearing_from_sql_options(latitude, longitude, options) + distance = distance_from_sql_options(latitude, longitude, options) + if using_sqlite? + b = Geocoder::Calculations.bounding_box([latitude, longitude], radius, options) + args = b + [ + full_column_name(geocoder_options[:latitude]), + full_column_name(geocoder_options[:longitude]) + ] + conditions = Geocoder::Sql.within_bounding_box(*args) + else + conditions = ["#{distance} <= ?", radius] + end + default_near_scope_options(latitude, longitude, radius, options).merge( + :select => select_clause(options[:select], distance, bearing), + :conditions => add_exclude_condition(conditions, options[:exclude]) ) end @@ -132,47 +144,6 @@ module Geocoder::Store end end - ## - # Scope options hash for use with a database that supports POWER(), - # SQRT(), PI(), and trigonometric functions SIN(), COS(), ASIN(), - # ATAN2(), DEGREES(), and RADIANS(). - # - def full_near_scope_options(latitude, longitude, radius, options) - options[:units] ||= (geocoder_options[:units] || Geocoder::Configuration.units) - bearing = bearing_from_sql_options(latitude, longitude, options) - distance = distance_from_sql_options(latitude, longitude, options) - conditions = ["#{distance} <= ?", radius] - default_near_scope_options(latitude, longitude, radius, options).merge( - :select => select_clause(options[:select], distance, bearing), - :conditions => add_exclude_condition(conditions, options[:exclude]) - ) - end - - ## - # Scope options hash for use with a database without trigonometric - # functions, like SQLite. Approach is to find objects within a square - # rather than a circle, so results are very approximate (will include - # objects outside the given radius). - # - # Distance and bearing calculations are *extremely inaccurate*. They - # only exist for interface consistency--not intended for production! - # - def approx_near_scope_options(latitude, longitude, radius, options) - options[:units] ||= (geocoder_options[:units] || Geocoder::Configuration.units) - bearing = bearing_from_sql_options(latitude, longitude, options) - distance = distance_from_sql_options(latitude, longitude, options) - b = Geocoder::Calculations.bounding_box([latitude, longitude], radius, options) - args = b + [ - full_column_name(geocoder_options[:latitude]), - full_column_name(geocoder_options[:longitude]) - ] - conditions = Geocoder::Sql.within_bounding_box(*args) - default_near_scope_options(latitude, longitude, radius, options).merge( - :select => select_clause(options[:select], distance, bearing), - :conditions => add_exclude_condition(conditions, options[:exclude]) - ) - end - ## # Generate the SELECT clause. # -- GitLab