From 8b8a0f1f3049b6cd908c3e2273ed71be7fca0dae Mon Sep 17 00:00:00 2001 From: Esteban Ceron Date: Thu, 29 Nov 2018 17:36:27 -0500 Subject: [PATCH] [FEATURE] include redshift adapter to support geolocation --- geokit-rails.gemspec | 1 + lib/geokit-rails/acts_as_mappable.rb | 5 ++++- lib/geokit-rails/adapters/redshift.rb | 22 ++++++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 lib/geokit-rails/adapters/redshift.rb diff --git a/geokit-rails.gemspec b/geokit-rails.gemspec index 1cbba93..27b0dad 100644 --- a/geokit-rails.gemspec +++ b/geokit-rails.gemspec @@ -26,6 +26,7 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'test-unit' spec.add_development_dependency "mocha", "~> 0.9" spec.add_development_dependency 'coveralls' + spec.add_development_dependency 'activerecord5-redshift-adapter', '~> 1.0' spec.add_development_dependency "mysql2", "~> 0.2" spec.add_development_dependency "activerecord-mysql2spatial-adapter" spec.add_development_dependency "pg", "~> 0.10" diff --git a/lib/geokit-rails/acts_as_mappable.rb b/lib/geokit-rails/acts_as_mappable.rb index a31b0a6..de2a2e6 100644 --- a/lib/geokit-rails/acts_as_mappable.rb +++ b/lib/geokit-rails/acts_as_mappable.rb @@ -11,7 +11,10 @@ module Glue # :nodoc: extend ActiveSupport::Concern module ClassMethods # :nodoc: - OPTION_SYMBOLS = [ :distance_column_name, :default_units, :default_formula, :lat_column_name, :lng_column_name, :qualified_lat_column_name, :qualified_lng_column_name, :skip_loading ] + OPTION_SYMBOLS = [ :distance_column_name, :default_units, + :default_formula, :lat_column_name, + :lng_column_name, :qualified_lat_column_name, + :qualified_lng_column_name, :skip_loading ] def acts_as_mappable(options = {}) metaclass = (class << self; self; end) diff --git a/lib/geokit-rails/adapters/redshift.rb b/lib/geokit-rails/adapters/redshift.rb new file mode 100644 index 0000000..0afc331 --- /dev/null +++ b/lib/geokit-rails/adapters/redshift.rb @@ -0,0 +1,22 @@ +module Geokit + module Adapters + class Redshift < Abstract + + def sphere_distance_sql(lat, lng, multiplier) + %| + (ACOS(least(1,COS(#{lat})*COS(#{lng})*COS(RADIANS(#{qualified_lat_column_name}))*COS(RADIANS(#{qualified_lng_column_name}))+ + COS(#{lat})*SIN(#{lng})*COS(RADIANS(#{qualified_lat_column_name}))*SIN(RADIANS(#{qualified_lng_column_name}))+ + SIN(#{lat})*SIN(RADIANS(#{qualified_lat_column_name}))))*#{multiplier}) + | + end + + def flat_distance_sql(origin, lat_degree_units, lng_degree_units) + %| + SQRT(POW(#{lat_degree_units}*(#{origin.lat}-#{qualified_lat_column_name}),2)+ + POW(#{lng_degree_units}*(#{origin.lng}-#{qualified_lng_column_name}),2)) + | + end + + end + end +end