activerecord-spatial 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +1670 -0
- data/Gemfile +12 -13
- data/Guardfile +7 -10
- data/MIT-LICENSE +1 -1
- data/README.rdoc +8 -19
- data/Rakefile +2 -1
- data/activerecord-spatial.gemspec +12 -13
- data/lib/activerecord-spatial/active_record/connection_adapters/postgresql/adapter_extensions/active_record.rb +46 -0
- data/lib/activerecord-spatial/active_record/connection_adapters/postgresql/adapter_extensions.rb +7 -38
- data/lib/activerecord-spatial/active_record/connection_adapters/postgresql/postgis.rb +6 -7
- data/lib/activerecord-spatial/active_record/connection_adapters/postgresql/unknown_srid.rb +4 -5
- data/lib/activerecord-spatial/active_record/models/geography_column.rb +1 -2
- data/lib/activerecord-spatial/active_record/models/geometry_column.rb +1 -2
- data/lib/activerecord-spatial/active_record/models/spatial_column.rb +1 -2
- data/lib/activerecord-spatial/active_record/models/spatial_ref_sys.rb +5 -6
- data/lib/activerecord-spatial/active_record.rb +0 -1
- data/lib/activerecord-spatial/associations/active_record.rb +62 -120
- data/lib/activerecord-spatial/associations/base.rb +26 -75
- data/lib/activerecord-spatial/associations/preloader/spatial_association.rb +57 -0
- data/lib/activerecord-spatial/associations/reflection/spatial_reflection.rb +41 -0
- data/lib/activerecord-spatial/associations.rb +26 -4
- data/lib/activerecord-spatial/spatial_columns.rb +85 -94
- data/lib/activerecord-spatial/spatial_function.rb +62 -51
- data/lib/activerecord-spatial/spatial_scope_constants/postgis_2_0.rb +48 -0
- data/lib/activerecord-spatial/spatial_scope_constants/postgis_2_2.rb +46 -0
- data/lib/activerecord-spatial/spatial_scope_constants/postgis_legacy.rb +30 -0
- data/lib/activerecord-spatial/spatial_scope_constants.rb +10 -61
- data/lib/activerecord-spatial/spatial_scopes.rb +47 -49
- data/lib/activerecord-spatial/version.rb +1 -2
- data/lib/activerecord-spatial.rb +2 -6
- data/lib/tasks/test.rake +21 -19
- data/test/.rubocop.yml +35 -0
- data/test/accessors_geographies_tests.rb +19 -19
- data/test/accessors_geometries_tests.rb +19 -19
- data/test/adapter_tests.rb +1 -2
- data/test/associations_tests.rb +181 -203
- data/test/geography_column_tests.rb +2 -3
- data/test/geometry_column_tests.rb +1 -2
- data/test/models/bar.rb +2 -3
- data/test/models/blort.rb +1 -2
- data/test/models/foo.rb +2 -3
- data/test/models/foo3d.rb +2 -3
- data/test/models/foo_geography.rb +2 -3
- data/test/models/zortable.rb +2 -3
- data/test/spatial_function_tests.rb +12 -17
- data/test/spatial_scopes_geographies_tests.rb +17 -20
- data/test/spatial_scopes_tests.rb +84 -75
- data/test/test_helper.rb +66 -79
- metadata +16 -14
- data/lib/activerecord-spatial/associations/active_record_3.rb +0 -123
data/test/test_helper.rb
CHANGED
@@ -4,16 +4,19 @@ require 'simplecov'
|
|
4
4
|
SimpleCov.command_name('Unit Tests')
|
5
5
|
SimpleCov.start do
|
6
6
|
add_filter '/test/'
|
7
|
+
add_filter '/.bundle/'
|
7
8
|
end
|
8
9
|
|
9
10
|
require 'rubygems'
|
10
11
|
require 'minitest/autorun'
|
11
12
|
require 'minitest/reporters'
|
13
|
+
require 'rails'
|
12
14
|
require 'active_support'
|
13
15
|
require 'active_support/core_ext/module/aliasing'
|
14
16
|
require 'active_support/dependencies'
|
15
17
|
require 'active_record'
|
16
18
|
require 'active_record/fixtures'
|
19
|
+
require 'active_record/test_case'
|
17
20
|
require 'logger'
|
18
21
|
|
19
22
|
require File.join(File.dirname(__FILE__), %w{ .. lib activerecord-spatial })
|
@@ -22,11 +25,11 @@ POSTGIS_PATHS = [
|
|
22
25
|
ENV['POSTGIS_PATH'],
|
23
26
|
'/opt/local/share/postgresql*/contrib/postgis-*',
|
24
27
|
'/usr/share/postgresql*/contrib/postgis-*',
|
25
|
-
'/usr/pgsql-*/share/contrib/postgis-*'
|
28
|
+
'/usr/pgsql-*/share/contrib/postgis-*'
|
26
29
|
].compact
|
27
30
|
|
28
31
|
puts "ActiveRecordSpatial #{ActiveRecordSpatial::VERSION}"
|
29
|
-
puts "ActiveRecord #{Gem.loaded_specs['activerecord'].version
|
32
|
+
puts "ActiveRecord #{Gem.loaded_specs['activerecord'].version}"
|
30
33
|
puts "Ruby #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} - #{RbConfig::CONFIG['RUBY_INSTALL_NAME']}"
|
31
34
|
puts "Geos library #{Geos::VERSION}" if defined?(Geos::VERSION)
|
32
35
|
puts "GEOS #{Geos::GEOS_VERSION}"
|
@@ -35,7 +38,8 @@ if defined?(Geos::FFIGeos)
|
|
35
38
|
puts "Using #{Geos::FFIGeos.geos_library_paths.join(', ')}"
|
36
39
|
end
|
37
40
|
|
38
|
-
|
41
|
+
ActiveSupport::TestCase.test_order = :random
|
42
|
+
ActiveRecord::Base.logger = Logger.new('debug.log') if ENV['ENABLE_LOGGER']
|
39
43
|
ActiveRecord::Base.configurations = {
|
40
44
|
'arunit' => {}
|
41
45
|
}
|
@@ -46,9 +50,9 @@ ActiveRecord::Base.configurations = {
|
|
46
50
|
}.each do |file|
|
47
51
|
file = File.join('test', file)
|
48
52
|
|
49
|
-
next unless File.
|
53
|
+
next unless File.exist?(file)
|
50
54
|
|
51
|
-
configuration = YAML.
|
55
|
+
configuration = YAML.safe_load(File.read(file))
|
52
56
|
|
53
57
|
if configuration['arunit']
|
54
58
|
ActiveRecord::Base.configurations['arunit'].merge!(configuration['arunit'])
|
@@ -59,17 +63,21 @@ ActiveRecord::Base.configurations = {
|
|
59
63
|
end
|
60
64
|
end
|
61
65
|
|
62
|
-
ActiveRecord::Base.establish_connection
|
66
|
+
ActiveRecord::Base.establish_connection :arunit
|
63
67
|
ARBC = ActiveRecord::Base.connection
|
64
68
|
|
65
|
-
|
69
|
+
postgresql_version = ARBC.select_rows('SELECT version()').first.first
|
70
|
+
|
71
|
+
if postgresql_version.present?
|
66
72
|
puts "PostgreSQL info from version(): #{postgresql_version}"
|
67
73
|
end
|
68
74
|
|
69
|
-
puts
|
75
|
+
puts 'Checking for PostGIS install'
|
70
76
|
2.times do
|
71
77
|
begin
|
72
|
-
|
78
|
+
postgis_version = ActiveRecordSpatial::POSTGIS[:lib]
|
79
|
+
|
80
|
+
if postgis_version.present?
|
73
81
|
puts "PostGIS info from postgis_full_version(): #{postgis_version}"
|
74
82
|
break
|
75
83
|
end
|
@@ -77,9 +85,7 @@ puts "Checking for PostGIS install"
|
|
77
85
|
puts "Trying to install PostGIS. If this doesn't work, you'll have to do this manually!"
|
78
86
|
|
79
87
|
plpgsql = ARBC.select_rows(%{SELECT count(*) FROM pg_language WHERE lanname = 'plpgsql'}).first.first.to_i
|
80
|
-
|
81
|
-
ARBC.execute(%{CREATE LANGUAGE plpgsql})
|
82
|
-
end
|
88
|
+
ARBC.execute(%{CREATE LANGUAGE plpgsql}) if plpgsql.zero?
|
83
89
|
|
84
90
|
%w{
|
85
91
|
postgis.sql
|
@@ -105,35 +111,39 @@ class ActiveRecordSpatialTestCase < ActiveRecord::TestCase
|
|
105
111
|
|
106
112
|
REGEXP_WKB_HEX = /[A-Fa-f0-9\s]+/
|
107
113
|
|
108
|
-
POINT_WKT = 'POINT(10 10.01)'
|
109
|
-
POINT_EWKT = 'SRID=4326; POINT(10 10.01)'
|
110
|
-
POINT_EWKT_WITH_DEFAULT = 'SRID=default; POINT(10 10.01)'
|
111
|
-
POINT_WKB =
|
112
|
-
POINT_WKB_BIN = "\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x40\x85\xEB\x51\xB8\x1E\x05\x24\x40"
|
113
|
-
POINT_EWKB =
|
114
|
-
POINT_EWKB_BIN = "\x01\x01\x00\x00\x20\xE6\x10\x00\x00\x00\x00\x00\x00\x00\x00\x24\x40\x85\xEB\x51\xB8\x1E\x05\x24\x40"
|
115
|
-
POINT_G_LAT_LNG =
|
116
|
-
POINT_G_LAT_LNG_URL_VALUE =
|
117
|
-
|
118
|
-
POLYGON_WKT = 'POLYGON((0 0, 1 1, 2.5 2.5, 5 5, 0 0))'
|
119
|
-
POLYGON_EWKT = 'SRID=4326; POLYGON((0 0, 1 1, 2.5 2.5, 5 5, 0 0))'
|
120
|
-
|
114
|
+
POINT_WKT = 'POINT(10 10.01)'.freeze
|
115
|
+
POINT_EWKT = 'SRID=4326; POINT(10 10.01)'.freeze
|
116
|
+
POINT_EWKT_WITH_DEFAULT = 'SRID=default; POINT(10 10.01)'.freeze
|
117
|
+
POINT_WKB = '0101000000000000000000244085EB51B81E052440'.freeze
|
118
|
+
POINT_WKB_BIN = "\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x40\x85\xEB\x51\xB8\x1E\x05\x24\x40".freeze
|
119
|
+
POINT_EWKB = '0101000020E6100000000000000000244085EB51B81E052440'.freeze
|
120
|
+
POINT_EWKB_BIN = "\x01\x01\x00\x00\x20\xE6\x10\x00\x00\x00\x00\x00\x00\x00\x00\x24\x40\x85\xEB\x51\xB8\x1E\x05\x24\x40".freeze
|
121
|
+
POINT_G_LAT_LNG = '(10.01, 10)'.freeze
|
122
|
+
POINT_G_LAT_LNG_URL_VALUE = '10.01,10'.freeze
|
123
|
+
|
124
|
+
POLYGON_WKT = 'POLYGON((0 0, 1 1, 2.5 2.5, 5 5, 0 0))'.freeze
|
125
|
+
POLYGON_EWKT = 'SRID=4326; POLYGON((0 0, 1 1, 2.5 2.5, 5 5, 0 0))'.freeze
|
126
|
+
|
127
|
+
POLYGON_WKB = '
|
121
128
|
0103000000010000000500000000000000000000000000000000000000000000000000F
|
122
129
|
03F000000000000F03F0000000000000440000000000000044000000000000014400000
|
123
130
|
00000000144000000000000000000000000000000000
|
124
|
-
|
131
|
+
'.gsub(/\s/, '').freeze
|
132
|
+
|
125
133
|
POLYGON_WKB_BIN = [
|
126
134
|
"\x01\x03\x00\x00\x00\x01\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00",
|
127
135
|
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xF0\x3F\x00",
|
128
136
|
"\x00\x00\x00\x00\x00\xF0\x3F\x00\x00\x00\x00\x00\x00\x04\x40\x00\x00\x00\x00",
|
129
137
|
"\x00\x00\x04\x40\x00\x00\x00\x00\x00\x00\x14\x40\x00\x00\x00\x00\x00\x00\x14",
|
130
138
|
"\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
131
|
-
].join
|
132
|
-
|
139
|
+
].join.freeze
|
140
|
+
|
141
|
+
POLYGON_EWKB = '
|
133
142
|
0103000020E610000001000000050000000000000000000000000000000000000000000
|
134
143
|
0000000F03F000000000000F03F00000000000004400000000000000440000000000000
|
135
144
|
1440000000000000144000000000000000000000000000000000
|
136
|
-
|
145
|
+
'.gsub(/\s/, '').freeze
|
146
|
+
|
137
147
|
POLYGON_EWKB_BIN = [
|
138
148
|
"\x01\x03\x00\x00\x20\xE6\x10\x00\x00\x01\x00\x00\x00\x05\x00\x00\x00",
|
139
149
|
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
|
@@ -141,11 +151,11 @@ class ActiveRecordSpatialTestCase < ActiveRecord::TestCase
|
|
141
151
|
"\x00\x00\x00\x00\x04\x40\x00\x00\x00\x00\x00\x00\x04\x40\x00\x00\x00",
|
142
152
|
"\x00\x00\x00\x14\x40\x00\x00\x00\x00\x00\x00\x14\x40\x00\x00\x00\x00",
|
143
153
|
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
144
|
-
].join
|
154
|
+
].join.freeze
|
145
155
|
|
146
|
-
POLYGON_WITH_INTERIOR_RING =
|
156
|
+
POLYGON_WITH_INTERIOR_RING = 'POLYGON((0 0, 5 0, 5 5, 0 5, 0 0),(4 4, 4 1, 1 1, 1 4, 4 4))'.freeze
|
147
157
|
|
148
|
-
LINESTRING_WKT =
|
158
|
+
LINESTRING_WKT = 'LINESTRING (0 0, 5 5, 5 10, 10 10)'.freeze
|
149
159
|
|
150
160
|
GEOMETRYCOLLECTION_WKT = 'GEOMETRYCOLLECTION (
|
151
161
|
MULTIPOLYGON (
|
@@ -161,20 +171,23 @@ class ActiveRecordSpatialTestCase < ActiveRecord::TestCase
|
|
161
171
|
LINESTRING (0 0, 2 3),
|
162
172
|
MULTIPOINT ((0 0), (2 3)),
|
163
173
|
POINT (9 0)
|
164
|
-
)'
|
174
|
+
)'.freeze
|
165
175
|
|
166
|
-
BOUNDS_G_LAT_LNG =
|
167
|
-
BOUNDS_G_LAT_LNG_URL_VALUE = '0.1,0.1,5.2,5.2'
|
176
|
+
BOUNDS_G_LAT_LNG = '((0.1, 0.1), (5.2, 5.2))'.freeze
|
177
|
+
BOUNDS_G_LAT_LNG_URL_VALUE = '0.1,0.1,5.2,5.2'.freeze
|
168
178
|
|
169
179
|
class << self
|
170
180
|
def load_models(*args)
|
171
|
-
|
181
|
+
self.fixture_table_names = args.collect do |arg|
|
182
|
+
arg.to_s.pluralize
|
183
|
+
end
|
172
184
|
|
173
185
|
args.each do |model|
|
174
186
|
model = model.to_s
|
175
187
|
klass = model.classify
|
188
|
+
fixtures model.tableize
|
176
189
|
|
177
|
-
ActiveSupport::Dependencies.load_file(BASE_PATH.join("models/#{model}.rb"), [
|
190
|
+
ActiveSupport::Dependencies.load_file(BASE_PATH.join("models/#{model}.rb"), [klass])
|
178
191
|
end
|
179
192
|
end
|
180
193
|
|
@@ -195,12 +208,16 @@ class ActiveRecordSpatialTestCase < ActiveRecord::TestCase
|
|
195
208
|
def after_suite
|
196
209
|
ActiveSupport::Dependencies.clear
|
197
210
|
end
|
211
|
+
|
212
|
+
def table_exists?(table)
|
213
|
+
ARBC.data_source_exists?(table)
|
214
|
+
end
|
198
215
|
end
|
199
216
|
|
200
217
|
def setup
|
201
|
-
|
202
|
-
|
203
|
-
|
218
|
+
return unless ActiveRecord::Base.logger
|
219
|
+
|
220
|
+
ActiveRecord::Base.logger.debug("Beginning tests for #{self.class.name}##{method_name}")
|
204
221
|
end
|
205
222
|
|
206
223
|
def assert_saneness_of_point(point)
|
@@ -213,49 +230,20 @@ class ActiveRecordSpatialTestCase < ActiveRecord::TestCase
|
|
213
230
|
assert_kind_of(Geos::Polygon, polygon)
|
214
231
|
cs = polygon.exterior_ring.coord_seq
|
215
232
|
assert_equal([
|
216
|
-
[
|
217
|
-
[
|
218
|
-
[
|
219
|
-
[
|
220
|
-
[
|
233
|
+
[0, 0],
|
234
|
+
[1, 1],
|
235
|
+
[2.5, 2.5],
|
236
|
+
[5, 5],
|
237
|
+
[0, 0]
|
221
238
|
], cs.to_a)
|
222
239
|
end
|
223
|
-
end
|
224
|
-
|
225
|
-
if !defined?(ActiveRecord::SQLCounter)
|
226
|
-
module ActiveRecord
|
227
|
-
class SQLCounter
|
228
|
-
cattr_accessor :ignored_sql
|
229
|
-
self.ignored_sql = [
|
230
|
-
/^PRAGMA (?!(table_info))/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/,
|
231
|
-
/^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/,
|
232
|
-
/^SHOW max_identifier_length/, /^BEGIN/, /^COMMIT/, /^ROLLBACK/, /\WFROM pg_/
|
233
|
-
]
|
234
|
-
|
235
|
-
cattr_accessor :log
|
236
|
-
self.log = []
|
237
|
-
|
238
|
-
attr_reader :ignore
|
239
|
-
|
240
|
-
def initialize(ignore = self.class.ignored_sql)
|
241
|
-
@ignore = ignore
|
242
|
-
end
|
243
|
-
|
244
|
-
def call(name, start, finish, message_id, values)
|
245
|
-
sql = values[:sql]
|
246
|
-
|
247
|
-
# FIXME: this seems bad. we should probably have a better way to indicate
|
248
|
-
# the query was cached
|
249
|
-
return if 'CACHE' == values[:name] || ignore.any? { |x| x =~ sql }
|
250
|
-
self.class.log << sql
|
251
|
-
end
|
252
|
-
end
|
253
240
|
|
254
|
-
|
241
|
+
def reflection_key(key)
|
242
|
+
key.to_s
|
255
243
|
end
|
256
244
|
end
|
257
245
|
|
258
|
-
class SpatialTestRunner <
|
246
|
+
class SpatialTestRunner < Minitest::Reporters::SpecReporter
|
259
247
|
def before_suite(suite)
|
260
248
|
super(suite)
|
261
249
|
suite.before_suite if suite.respond_to?(:before_suite)
|
@@ -267,5 +255,4 @@ class SpatialTestRunner < MiniTest::Reporters::SpecReporter
|
|
267
255
|
end
|
268
256
|
end
|
269
257
|
|
270
|
-
|
271
|
-
|
258
|
+
Minitest::Reporters.use!(SpatialTestRunner.new)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-spatial
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- J Smith
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -16,34 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
- - "!="
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: 4.0.0
|
19
|
+
version: '5.0'
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
24
|
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version: '
|
30
|
-
- - "!="
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: 4.0.0
|
26
|
+
version: '5.0'
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: geos-extensions
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
36
30
|
requirements:
|
37
31
|
- - ">="
|
38
32
|
- !ruby/object:Gem::Version
|
39
|
-
version: 0.
|
33
|
+
version: '0.5'
|
40
34
|
type: :runtime
|
41
35
|
prerelease: false
|
42
36
|
version_requirements: !ruby/object:Gem::Requirement
|
43
37
|
requirements:
|
44
38
|
- - ">="
|
45
39
|
- !ruby/object:Gem::Version
|
46
|
-
version: 0.
|
40
|
+
version: '0.5'
|
47
41
|
description: ActiveRecord Spatial gives AR the ability to work with PostGIS columns.
|
48
42
|
email: dark.panda@gmail.com
|
49
43
|
executables: []
|
@@ -52,6 +46,7 @@ extra_rdoc_files:
|
|
52
46
|
- README.rdoc
|
53
47
|
files:
|
54
48
|
- ".gitignore"
|
49
|
+
- ".rubocop.yml"
|
55
50
|
- Gemfile
|
56
51
|
- Guardfile
|
57
52
|
- MIT-LICENSE
|
@@ -61,6 +56,7 @@ files:
|
|
61
56
|
- lib/activerecord-spatial.rb
|
62
57
|
- lib/activerecord-spatial/active_record.rb
|
63
58
|
- lib/activerecord-spatial/active_record/connection_adapters/postgresql/adapter_extensions.rb
|
59
|
+
- lib/activerecord-spatial/active_record/connection_adapters/postgresql/adapter_extensions/active_record.rb
|
64
60
|
- lib/activerecord-spatial/active_record/connection_adapters/postgresql/postgis.rb
|
65
61
|
- lib/activerecord-spatial/active_record/connection_adapters/postgresql/unknown_srid.rb
|
66
62
|
- lib/activerecord-spatial/active_record/models/geography_column.rb
|
@@ -69,14 +65,19 @@ files:
|
|
69
65
|
- lib/activerecord-spatial/active_record/models/spatial_ref_sys.rb
|
70
66
|
- lib/activerecord-spatial/associations.rb
|
71
67
|
- lib/activerecord-spatial/associations/active_record.rb
|
72
|
-
- lib/activerecord-spatial/associations/active_record_3.rb
|
73
68
|
- lib/activerecord-spatial/associations/base.rb
|
69
|
+
- lib/activerecord-spatial/associations/preloader/spatial_association.rb
|
70
|
+
- lib/activerecord-spatial/associations/reflection/spatial_reflection.rb
|
74
71
|
- lib/activerecord-spatial/spatial_columns.rb
|
75
72
|
- lib/activerecord-spatial/spatial_function.rb
|
76
73
|
- lib/activerecord-spatial/spatial_scope_constants.rb
|
74
|
+
- lib/activerecord-spatial/spatial_scope_constants/postgis_2_0.rb
|
75
|
+
- lib/activerecord-spatial/spatial_scope_constants/postgis_2_2.rb
|
76
|
+
- lib/activerecord-spatial/spatial_scope_constants/postgis_legacy.rb
|
77
77
|
- lib/activerecord-spatial/spatial_scopes.rb
|
78
78
|
- lib/activerecord-spatial/version.rb
|
79
79
|
- lib/tasks/test.rake
|
80
|
+
- test/.rubocop.yml
|
80
81
|
- test/accessors_geographies_tests.rb
|
81
82
|
- test/accessors_geometries_tests.rb
|
82
83
|
- test/adapter_tests.rb
|
@@ -120,11 +121,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
121
|
version: '0'
|
121
122
|
requirements: []
|
122
123
|
rubyforge_project:
|
123
|
-
rubygems_version: 2.
|
124
|
+
rubygems_version: 2.6.11
|
124
125
|
signing_key:
|
125
126
|
specification_version: 4
|
126
127
|
summary: ActiveRecord Spatial gives AR the ability to work with PostGIS columns.
|
127
128
|
test_files:
|
129
|
+
- test/.rubocop.yml
|
128
130
|
- test/accessors_geographies_tests.rb
|
129
131
|
- test/accessors_geometries_tests.rb
|
130
132
|
- test/adapter_tests.rb
|
@@ -1,123 +0,0 @@
|
|
1
|
-
|
2
|
-
module ActiveRecord
|
3
|
-
module Associations
|
4
|
-
class Builder::Spatial < Builder::HasMany #:nodoc:
|
5
|
-
self.macro = SPATIAL_MACRO
|
6
|
-
self.valid_options += VALID_SPATIAL_OPTIONS
|
7
|
-
self.valid_options -= INVALID_SPATIAL_OPTIONS
|
8
|
-
end
|
9
|
-
|
10
|
-
class Preloader #:nodoc:
|
11
|
-
class SpatialAssociation < HasMany #:nodoc:
|
12
|
-
def records_for(ids)
|
13
|
-
table_name = reflection.quoted_table_name
|
14
|
-
join_name = model.quoted_table_name
|
15
|
-
column = %{#{SPATIAL_JOIN_QUOTED_NAME}.#{model.quoted_primary_key}}
|
16
|
-
geom = {
|
17
|
-
:class => model,
|
18
|
-
:table_alias => SPATIAL_JOIN_NAME
|
19
|
-
}
|
20
|
-
|
21
|
-
if reflection.options[:geom].is_a?(Hash)
|
22
|
-
geom.merge!(reflection.options[:geom])
|
23
|
-
else
|
24
|
-
geom[:column] = reflection.options[:geom]
|
25
|
-
end
|
26
|
-
|
27
|
-
scoped.
|
28
|
-
select(%{array_to_string(array_agg(#{column}), ',') AS "#{SPATIAL_FIELD_ALIAS}"}).
|
29
|
-
joins(
|
30
|
-
"INNER JOIN #{join_name} AS #{SPATIAL_JOIN_QUOTED_NAME} ON (" <<
|
31
|
-
klass.send("st_#{reflection.options[:relationship]}",
|
32
|
-
geom,
|
33
|
-
(reflection.options[:scope_options] || {}).merge(
|
34
|
-
:column => reflection.options[:foreign_geom]
|
35
|
-
)
|
36
|
-
).where_values.join(' AND ') <<
|
37
|
-
")"
|
38
|
-
).
|
39
|
-
where(model.arel_table.alias(SPATIAL_JOIN_NAME)[model.primary_key].in(ids)).
|
40
|
-
group(table[klass.primary_key])
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
class AssociationScope #:nodoc:
|
46
|
-
def add_constraints_with_spatial(scope)
|
47
|
-
return add_constraints_without_spatial(scope) if !self.association.is_a?(SpatialAssociation)
|
48
|
-
|
49
|
-
tables = construct_tables
|
50
|
-
|
51
|
-
chain.each_with_index do |reflection, i|
|
52
|
-
table, foreign_table = tables.shift, tables.first
|
53
|
-
|
54
|
-
conditions = self.conditions[i]
|
55
|
-
geom_options = {
|
56
|
-
:class => self.association.klass
|
57
|
-
}
|
58
|
-
|
59
|
-
if self.association.geom.is_a?(Hash)
|
60
|
-
geom_options.merge!(
|
61
|
-
:value => owner[self.association.geom[:name]]
|
62
|
-
)
|
63
|
-
geom_options.merge!(self.association.geom)
|
64
|
-
else
|
65
|
-
geom_options.merge!(
|
66
|
-
:value => owner[self.association.geom],
|
67
|
-
:name => self.association.geom
|
68
|
-
)
|
69
|
-
end
|
70
|
-
|
71
|
-
if reflection == chain.last
|
72
|
-
scope = scope.send("st_#{self.association.relationship}", geom_options, self.association.scope_options)
|
73
|
-
|
74
|
-
if reflection.type
|
75
|
-
scope = scope.where(table[reflection.type].eq(owner.class.base_class.name))
|
76
|
-
end
|
77
|
-
|
78
|
-
conditions.each do |condition|
|
79
|
-
scope = scope.where(interpolate(condition))
|
80
|
-
end
|
81
|
-
else
|
82
|
-
constraint = scope.where(
|
83
|
-
scope.send(
|
84
|
-
"st_#{self.association.relationship}",
|
85
|
-
owner[self.association.foreign_geom],
|
86
|
-
self.association.scope_options
|
87
|
-
).where_values
|
88
|
-
).join(' AND ')
|
89
|
-
|
90
|
-
if reflection.type
|
91
|
-
type = chain[i + 1].klass.base_class.name
|
92
|
-
constraint = table[reflection.type].eq(type).and(constraint)
|
93
|
-
end
|
94
|
-
|
95
|
-
scope = scope.joins(join(foreign_table, constraint))
|
96
|
-
|
97
|
-
unless conditions.empty?
|
98
|
-
scope = scope.where(sanitize(conditions, table))
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
scope
|
104
|
-
end
|
105
|
-
alias_method_chain :add_constraints, :spatial
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
module ActiveRecordSpatial::Associations
|
111
|
-
module ClassMethods #:nodoc:
|
112
|
-
def has_many_spatially(name, options = {}, &extension)
|
113
|
-
options = build_options(options)
|
114
|
-
|
115
|
-
if !ActiveRecordSpatial::SpatialScopeConstants::RELATIONSHIPS.include?(options[:relationship].to_s)
|
116
|
-
raise ArgumentError.new(%{Invalid spatial relationship "#{options[:relationship]}", expected one of #{ActiveRecordSpatial::SpatialScopeConstants::RELATIONSHIPS.inspect}})
|
117
|
-
end
|
118
|
-
|
119
|
-
ActiveRecord::Associations::Builder::Spatial.build(self, name, options, &extension)
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|