diff --git a/lib/geocoder/models/active_record.rb b/lib/geocoder/models/active_record.rb index 29bbe5f406d5534ffc674599c28d4c86340f10ce..62c81422ea4ecf03f8f7d5fe9bc145aef1aff29f 100644 --- a/lib/geocoder/models/active_record.rb +++ b/lib/geocoder/models/active_record.rb @@ -16,7 +16,8 @@ module Geocoder :longitude => options[:longitude] || :longitude, :geocode_block => block, :units => options[:units], - :method => options[:method] + :method => options[:method], + :lookup => options[:lookup] ) end @@ -30,8 +31,9 @@ module Geocoder :latitude => latitude_attr, :longitude => longitude_attr, :reverse_block => block, - :units => options[:units], - :method => options[:method] + :units => options[:units], + :method => options[:method], + :lookup => options[:lookup] ) end diff --git a/lib/geocoder/models/mongo_base.rb b/lib/geocoder/models/mongo_base.rb index fe7a0e1f5fe968b1178aaed8b655b2087816cc42..1a4dd886a9df0703594f920cbf8ffec977527dc7 100644 --- a/lib/geocoder/models/mongo_base.rb +++ b/lib/geocoder/models/mongo_base.rb @@ -19,7 +19,8 @@ module Geocoder :geocode_block => block, :units => options[:units], :method => options[:method], - :skip_index => options[:skip_index] || false + :skip_index => options[:skip_index] || false, + :lookup => options[:lookup] ) end @@ -34,7 +35,8 @@ module Geocoder :reverse_block => block, :units => options[:units], :method => options[:method], - :skip_index => options[:skip_index] || false + :skip_index => options[:skip_index] || false, + :lookup => options[:lookup] ) end diff --git a/lib/geocoder/query.rb b/lib/geocoder/query.rb index d909ffcaaa8fc1e5f39d5417b4507644886583a5..d201c94fbe69c50ac12fe10dcb7e27248aa7efce 100644 --- a/lib/geocoder/query.rb +++ b/lib/geocoder/query.rb @@ -33,9 +33,9 @@ module Geocoder # def lookup if ip_address? - name = Configuration.ip_lookup || Geocoder::Lookup.ip_services.first + name = options[:ip_lookup] || Configuration.ip_lookup || Geocoder::Lookup.ip_services.first else - name = Configuration.lookup || Geocoder::Lookup.street_services.first + name = options[:lookup] || Configuration.lookup || Geocoder::Lookup.street_services.first end Lookup.get(name) end diff --git a/lib/geocoder/stores/base.rb b/lib/geocoder/stores/base.rb index dfe1cfd256cce9a3a0dc47143e0950e73d46348d..fd3ccaee9a23b0000314e52357daee94b6192ade 100644 --- a/lib/geocoder/stores/base.rb +++ b/lib/geocoder/stores/base.rb @@ -101,7 +101,14 @@ module Geocoder return end - results = Geocoder.search(query) + query_options = [:lookup, :ip_lookup].inject({}) do |hash, key| + if options.has_key?(key) + val = options[key] + hash[key] = val.respond_to?(:call) ? val.call(self) : val + end + hash + end + results = Geocoder.search(query, query_options) # execute custom block, if specified in configuration block_key = reverse ? :reverse_block : :geocode_block diff --git a/test/geocoder_test.rb b/test/geocoder_test.rb index a31b82c184a2a5635ece5b536b5d8de9643dbe09..343777820f954432281d88dd42cefd8b6ff22afd 100644 --- a/test/geocoder_test.rb +++ b/test/geocoder_test.rb @@ -56,4 +56,22 @@ class GeocoderTest < Test::Unit::TestCase g.reverse_geocode assert_not_nil g.location end + + def test_geocode_with_custom_lookup_param + v = Church.new(*venue_params(:msg)) + v.geocode + assert_equal Geocoder::Result::Nominatim, v.result_class + end + + def test_geocode_with_custom_lookup_proc_param + v = BigChurch.new(*venue_params(:msg)) + v.geocode + assert_equal Geocoder::Result::Nominatim, v.result_class + end + + def test_reverse_geocode_with_custom_lookup_param + v = Temple.new(*landmark_params(:msg)) + v.reverse_geocode + assert_equal Geocoder::Result::Nominatim, v.result_class + end end diff --git a/test/query_test.rb b/test/query_test.rb index 6f68278b359964e86a1d482be18d9add4c69b82f..58772d415835a4dc29d6a82bc9f126dfe1324862 100644 --- a/test/query_test.rb +++ b/test/query_test.rb @@ -42,4 +42,9 @@ class QueryTest < Test::Unit::TestCase q = Geocoder::Query.new([43.1313,11.3131]) assert_equal "43.1313,11.3131", q.sanitized_text end + + def test_custom_lookup + query = Geocoder::Query.new("address", :lookup => :nominatim) + assert_equal Geocoder::Lookup::Nominatim, query.lookup.class + end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 9d635a18c729e80ec9c8e873e26e2ef919477df6..61e6844bc209ded85096cbeb7c4bc42ed6cb949f 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -251,6 +251,62 @@ class GasStation < ActiveRecord::Base end end +## +# Geocoded model with custom lookup. +# +class Church < ActiveRecord::Base + geocoded_by :address, :lookup => :nominatim do |obj,results| + if result = results.first + obj.result_class = result.class + end + end + + def initialize(name, address) + super() + write_attribute :name, name + write_attribute :address, address + end +end + +## +# Geocoded model with custom lookup as proc. +# +class BigChurch < ActiveRecord::Base + geocoded_by :address, :lookup => lambda{|obj| obj.custom_lookup } do |obj,results| + if result = results.first + obj.result_class = result.class + end + end + + def custom_lookup + :nominatim + end + + def initialize(name, address) + super() + write_attribute :name, name + write_attribute :address, address + end +end + +## +# Reverse geocoded model with custom lookup. +# +class Temple < ActiveRecord::Base + reverse_geocoded_by :latitude, :longitude, :lookup => :nominatim do |obj,results| + if result = results.first + obj.result_class = result.class + end + end + + def initialize(name, latitude, longitude) + super() + write_attribute :name, name + write_attribute :latitude, latitude + write_attribute :longitude, longitude + end +end + class Test::Unit::TestCase