From fbaa02735e9b06b10b490523df6583ffe47c91b9 Mon Sep 17 00:00:00 2001 From: Alex Reisner <alex@alexreisner.com> Date: Mon, 11 Jun 2012 11:42:43 -0400 Subject: [PATCH] Improve checking for presence of coordinates. This fixes issue #244. --- lib/geocoder/calculations.rb | 12 ++++++++++++ lib/geocoder/stores/active_record.rb | 6 ++++-- test/calculations_test.rb | 8 +++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/geocoder/calculations.rb b/lib/geocoder/calculations.rb index a01b8915..a3f1ff98 100644 --- a/lib/geocoder/calculations.rb +++ b/lib/geocoder/calculations.rb @@ -24,6 +24,18 @@ module Geocoder # 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. # diff --git a/lib/geocoder/stores/active_record.rb b/lib/geocoder/stores/active_record.rb index 0f710762..782458f5 100644 --- a/lib/geocoder/stores/active_record.rb +++ b/lib/geocoder/stores/active_record.rb @@ -33,7 +33,7 @@ module Geocoder::Store # 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 @@ -68,7 +68,9 @@ module Geocoder::Store 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 # ---------------------------------------------------------------- diff --git a/test/calculations_test.rb b/test/calculations_test.rb index c1be1d58..ee18f836 100644 --- a/test/calculations_test.rb +++ b/test/calculations_test.rb @@ -178,5 +178,11 @@ class CalculationsTest < Test::Unit::TestCase 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 -- GitLab