diff --git a/lib/geocoder/stores/active_record.rb b/lib/geocoder/stores/active_record.rb index b5ee5b4a869477a6855b6fa86efed7e0b7443a89..03e0b3705d0f582538cfbdda7ed1cf7f6f497ad3 100644 --- a/lib/geocoder/stores/active_record.rb +++ b/lib/geocoder/stores/active_record.rb @@ -116,24 +116,30 @@ module Geocoder::Store ) 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) + def bearing_from_sql_options(latitude, longitude, options = {}) if !options.include?(:bearing) options[:bearing] = Geocoder::Configuration.distances end if options[:bearing] - bearing = Geocoder::Sql.full_bearing( + method_prefix = using_sqlite? ? "approx" : "full" + Geocoder::Sql.send( + method_prefix + "_bearing", latitude, longitude, full_column_name(geocoder_options[:latitude]), full_column_name(geocoder_options[:longitude]), options ) 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( @@ -152,22 +158,9 @@ module Geocoder::Store # only exist for interface consistency--not intended for production! # def approx_near_scope_options(latitude, longitude, radius, options) - if !options.include?(:bearing) - options[:bearing] = Geocoder::Configuration.distances - end - if options[:bearing] - bearing = Geocoder::Sql.approx_bearing( - latitude, longitude, - full_column_name(geocoder_options[:latitude]), - full_column_name(geocoder_options[:longitude]) - ) - else - bearing = false - end - 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]),