Commit a66e40149479828f37be29df0d9e51650336ee91
1 parent
26982e37
Exists in
master
and in
22 other branches
ActionItem261: modified the geokit plugin to works with sqlites
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1651 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
5 changed files
with
73 additions
and
3 deletions
Show diff stats
vendor/plugins/geokit/lib/geo_kit/acts_as_mappable.rb
| ... | ... | @@ -390,6 +390,11 @@ module GeoKit |
| 390 | 390 | COS(#{lat})*SIN(#{lng})*COS(RADIANS(#{qualified_lat_column_name}))*SIN(RADIANS(#{qualified_lng_column_name}))+ |
| 391 | 391 | SIN(#{lat})*SIN(RADIANS(#{qualified_lat_column_name}))))*#{multiplier}) |
| 392 | 392 | SQL_END |
| 393 | + when "sqlite" | |
| 394 | + # The /1.0 in the end is to force the convertion to float | |
| 395 | + sql=<<-SQL_END | |
| 396 | + (SPHERIC_DISTANCE(#{lat},#{lng},RADIANS(#{qualified_lat_column_name}),RADIANS(#{qualified_lng_column_name}),#{multiplier})/1.0) | |
| 397 | + SQL_END | |
| 393 | 398 | else |
| 394 | 399 | sql = "unhandled #{connection.adapter_name.downcase} adapter" |
| 395 | 400 | end |
| ... | ... | @@ -411,6 +416,11 @@ module GeoKit |
| 411 | 416 | SQRT(POW(#{lat_degree_units}*(#{origin.lat}-#{qualified_lat_column_name}),2)+ |
| 412 | 417 | POW(#{lng_degree_units}*(#{origin.lng}-#{qualified_lng_column_name}),2)) |
| 413 | 418 | SQL_END |
| 419 | + when "sqlite" | |
| 420 | + sql=<<-SQL_END | |
| 421 | + (SQRT(POW(#{lat_degree_units}*(#{origin.lat}-#{qualified_lat_column_name}),2)+ | |
| 422 | + POW(#{lng_degree_units}*(#{origin.lng}-#{qualified_lng_column_name}),2))/1.0) | |
| 423 | + SQL_END | |
| 414 | 424 | else |
| 415 | 425 | sql = "unhandled #{connection.adapter_name.downcase} adapter" |
| 416 | 426 | end |
| ... | ... | @@ -433,4 +443,4 @@ class Array |
| 433 | 443 | end |
| 434 | 444 | self.sort!{|a,b|a.send(distance_attribute_name) <=> b.send(distance_attribute_name)} |
| 435 | 445 | end |
| 436 | -end | |
| 437 | 446 | \ No newline at end of file |
| 447 | +end | ... | ... |
| ... | ... | @@ -0,0 +1,28 @@ |
| 1 | +if ActiveRecord::Base.connection.adapter_name =~ /^sqlite$/i | |
| 2 | + | |
| 3 | + database = ActiveRecord::Base.connection.raw_connection | |
| 4 | + | |
| 5 | + database.create_function('pow', 2, :numeric) do |func, base, exponent| | |
| 6 | + func.set_result(base.to_f ** exponent.to_f) | |
| 7 | + end | |
| 8 | + | |
| 9 | + database.create_function('radians', 1, :numeric) do |func, value| | |
| 10 | + func.set_result(value.to_f * Math::PI / 180.0) | |
| 11 | + end | |
| 12 | + | |
| 13 | + database.create_function('sqrt', 1, :numeric) do |func, value| | |
| 14 | + func.set_result(Math.sqrt(value)) | |
| 15 | + end | |
| 16 | + | |
| 17 | + database.create_function('spheric_distance', 5, :real) do |func, lat1, long1, lat2, long2, radius| | |
| 18 | + func.set_result( | |
| 19 | + radius.to_f * Math.acos( | |
| 20 | + [1, | |
| 21 | + Math.cos(lat1.to_f) * Math.cos(long1.to_f) * Math.cos(lat2.to_f) * Math.cos(long2.to_f) + | |
| 22 | + Math.cos(lat1.to_f) * Math.sin(long1.to_f) * Math.cos(lat2.to_f) * Math.sin(long2.to_f) + | |
| 23 | + Math.sin(lat1.to_f) * Math.sin(lat2.to_f) | |
| 24 | + ].min | |
| 25 | + ) | |
| 26 | + ) | |
| 27 | + end | |
| 28 | +end | ... | ... |
vendor/plugins/geokit/test/database.yml
| ... | ... | @@ -0,0 +1,27 @@ |
| 1 | +require File.dirname(__FILE__) + '/test_helper' | |
| 2 | + | |
| 3 | +if ActiveRecord::Base.connection.adapter_name =~ /^sqlite$/i | |
| 4 | + | |
| 5 | + # this test only makes sense when using sqlite | |
| 6 | + class SQliteExtensionTest < Test::Unit::TestCase | |
| 7 | + | |
| 8 | + def test_pow_function | |
| 9 | + assert_in_delta 8.0, ActiveRecord::Base.connection.execute('select pow(2.0, 3.0) as result').first['result'], 0.0001 | |
| 10 | + end | |
| 11 | + | |
| 12 | + def test_radians_function | |
| 13 | + assert_in_delta Math::PI/2, ActiveRecord::Base.connection.execute('select radians(90) as rad').first['rad'], 0.0001 | |
| 14 | + end | |
| 15 | + | |
| 16 | + def test_sqrt_function | |
| 17 | + assert_in_delta 1.4142, ActiveRecord::Base.connection.execute('select sqrt(2) as sqrt').first['sqrt'], 0.0001 | |
| 18 | + end | |
| 19 | + | |
| 20 | + def test_spheric_distance_function | |
| 21 | + args = [32.918593, -96.958444, 32.951613, -96.958444].map{|l|l * Math::PI/180} | |
| 22 | + assert_in_delta 2.28402, ActiveRecord::Base.connection.execute("select spheric_distance(#{args.inspect[1..-2]}, 3963.19) as dist").first['dist'], 0.0001 | |
| 23 | + end | |
| 24 | + | |
| 25 | + end | |
| 26 | + | |
| 27 | +end | ... | ... |
vendor/plugins/geokit/test/test_helper.rb
| ... | ... | @@ -15,4 +15,6 @@ ActiveRecord::Base.establish_connection(databases[ENV['DB'] || 'mysql']) |
| 15 | 15 | load(File.join(plugin_test_dir, 'schema.rb')) |
| 16 | 16 | |
| 17 | 17 | # Load fixtures from the plugin |
| 18 | -Test::Unit::TestCase.fixture_path = File.join(plugin_test_dir, 'fixtures/') | |
| 19 | 18 | \ No newline at end of file |
| 19 | +Test::Unit::TestCase.fixture_path = File.join(plugin_test_dir, 'fixtures/') | |
| 20 | + | |
| 21 | +require File.join(plugin_test_dir, '../../../../lib/sqlite_extension') | ... | ... |