Skip to content

Commit

Permalink
Merge pull request #109 from kwerle/feature/optional
Browse files Browse the repository at this point in the history
Add an option to skip loading.
  • Loading branch information
Michael Noack committed Sep 16, 2016
2 parents 3420620 + f8c6054 commit f0d00e9
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 21 deletions.
11 changes: 7 additions & 4 deletions lib/geokit-rails/acts_as_mappable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ 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 ]

def acts_as_mappable(options = {})
metaclass = (class << self; self; end)

Expand All @@ -21,20 +23,21 @@ def acts_as_mappable(options = {})

if reflection = Geokit::ActsAsMappable.end_of_reflection_chain(self.through, self)
metaclass.instance_eval do
[ :distance_column_name, :default_units, :default_formula, :lat_column_name, :lng_column_name, :qualified_lat_column_name, :qualified_lng_column_name ].each do |method_name|
OPTION_SYMBOLS.each do |method_name|
define_method method_name do
reflection.klass.send(method_name)
end
end
end
else
cattr_accessor :distance_column_name, :default_units, :default_formula, :lat_column_name, :lng_column_name, :qualified_lat_column_name, :qualified_lng_column_name
cattr_accessor *OPTION_SYMBOLS

self.distance_column_name = options[:distance_column_name] || 'distance'
self.default_units = options[:default_units] || Geokit::default_units
self.default_formula = options[:default_formula] || Geokit::default_formula
self.lat_column_name = options[:lat_column_name] || 'lat'
self.lng_column_name = options[:lng_column_name] || 'lng'
self.skip_loading = options[:skip_loading]
self.qualified_lat_column_name = "#{table_name}.#{lat_column_name}"
self.qualified_lng_column_name = "#{table_name}.#{lng_column_name}"

Expand Down Expand Up @@ -105,7 +108,7 @@ def geokit_finder_adapter
# Re-init the klass after require
klass = Adapters.const_get(connection.adapter_name.camelcase)
end
klass.load(self) unless klass.loaded
klass.load(self) unless klass.loaded || skip_loading
klass.new(self)
rescue LoadError
raise UnsupportedAdapter, "`#{connection.adapter_name.downcase}` is not a supported adapter."
Expand All @@ -117,7 +120,7 @@ def within(distance, options = {})
# Add bounding box to speed up SQL request.
bounds = formulate_bounds_from_distance(
options,
normalize_point_to_lat_lng(options[:origin]),
normalize_point_to_lat_lng(options[:origin]),
options[:units] || default_units)
with_latlng.where(bound_conditions(bounds)).
where(distance_conditions(options))
Expand Down
36 changes: 19 additions & 17 deletions lib/geokit-rails/adapters/sqlserver.rb
Original file line number Diff line number Diff line change
@@ -1,43 +1,45 @@
module Geokit
module Adapters
class SQLServer < Abstract

class << self

def load(klass)
klass.connection.execute <<-EOS
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[geokit_least]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[geokit_least]
EOS

klass.connection.execute <<-EOS
CREATE FUNCTION [dbo].geokit_least (@value1 float,@value2 float) RETURNS float AS BEGIN
return (SELECT CASE WHEN @value1 < @value2 THEN @value1 ELSE @value2 END) END
EOS
klass.transaction do
klass.connection.execute <<-EOS
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[geokit_least]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[geokit_least]
EOS

klass.connection.execute <<-EOS
CREATE FUNCTION [dbo].geokit_least (@value1 float,@value2 float) RETURNS float AS BEGIN
return (SELECT CASE WHEN @value1 < @value2 THEN @value1 ELSE @value2 END) END
EOS
end
self.loaded = true
end

end

def initialize(*args)
super(*args)
end

def sphere_distance_sql(lat, lng, multiplier)
%|
(ACOS([dbo].geokit_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(POWER(#{lat_degree_units}*(#{origin.lat}-#{qualified_lat_column_name}),2)+
POWER(#{lng_degree_units}*(#{origin.lng}-#{qualified_lng_column_name}),2))
|
end

end
end
end
end

0 comments on commit f0d00e9

Please sign in to comment.