Commit a66e40149479828f37be29df0d9e51650336ee91
1 parent
26982e37
Exists in
master
and in
29 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') | ... | ... |