Skip to content

Commit

Permalink
Improve checking for presence of coordinates.
Browse files Browse the repository at this point in the history
This fixes issue alexreisner#244.
  • Loading branch information
alexreisner committed Jun 11, 2012
1 parent f7fbf23 commit fbaa027
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 3 deletions.
12 changes: 12 additions & 0 deletions lib/geocoder/calculations.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,18 @@ module Calculations
# Not a number constant
NAN = defined?(::Float::NAN) ? ::Float::NAN : 0 / 0.0

##
# Returns true if all given arguments are valid latitude/longitude values.
#
def coordinates_present?(*args)
args.each do |a|
# note that Float::NAN != Float::NAN
# still, this could probably be improved:
return false if (!a.is_a?(Numeric) or a.to_s == "NaN")
end
true
end

##
# Distance spanned by one degree of latitude in the given units.
#
Expand Down
6 changes: 4 additions & 2 deletions lib/geocoder/stores/active_record.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def self.included(base)
#
scope :near, lambda{ |location, *args|
latitude, longitude = Geocoder::Calculations.extract_coordinates(location)
if latitude and longitude and ![latitude, longitude].include?(Geocoder::Calculations::NAN)
if Geocoder::Calculations.coordinates_present?(latitude, longitude)
near_scope_options(latitude, longitude, *args)
else
where(false_condition) # no results if no lat/lon given
Expand Down Expand Up @@ -68,7 +68,9 @@ module ClassMethods

def distance_from_sql(location, *args)
latitude, longitude = Geocoder::Calculations.extract_coordinates(location)
distance_from_sql_options(latitude, longitude, *args) if latitude and longitude
if Geocoder::Calculations.coordinates_present?(latitude, longitude)
distance_from_sql_options(latitude, longitude, *args)
end
end

private # ----------------------------------------------------------------
Expand Down
8 changes: 7 additions & 1 deletion test/calculations_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -178,5 +178,11 @@ def o.to_coordinates
assert_in_delta 1.0 / 3, result.first, 1E-5
assert_in_delta 2.0 / 3, result.last, 1E-5
end
end

def test_coordinates_present
assert Geocoder::Calculations.coordinates_present?(3.23)
assert !Geocoder::Calculations.coordinates_present?(nil)
assert !Geocoder::Calculations.coordinates_present?(Geocoder::Calculations::NAN)
assert !Geocoder::Calculations.coordinates_present?(3.23, nil)
end
end

0 comments on commit fbaa027

Please sign in to comment.