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