Commit a66e40149479828f37be29df0d9e51650336ee91

Authored by MoisesMachado
1 parent 26982e37

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
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
... ...
vendor/plugins/geokit/lib/geo_kit/sqlite_extension.rb 0 → 100644
... ... @@ -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
... ... @@ -9,4 +9,7 @@ postgresql:
9 9 host: localhost
10 10 username: root
11 11 password:
12   - database: geokit_plugin_test
13 12 \ No newline at end of file
  13 + database: geokit_plugin_test
  14 +sqlite:
  15 + adapter: sqlite3
  16 + database: tmp/geokit_plugin_test.sqlite3
... ...
vendor/plugins/geokit/test/sqlite_extension_test.rb 0 → 100644
... ... @@ -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[&#39;DB&#39;] || &#39;mysql&#39;])
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')
... ...