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/associations_tests.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
|
2
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
3
3
|
require 'test_helper'
|
4
4
|
|
5
5
|
class DefaultIntersectsRelationshipTest < ActiveRecordSpatialTestCase
|
@@ -12,12 +12,18 @@ class DefaultIntersectsRelationshipTest < ActiveRecordSpatialTestCase
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_reflection
|
15
|
-
assert_equal(:has_many, Foo.reflections[:bars].macro)
|
16
|
-
assert_equal(:intersects, Foo.reflections[:bars].options[:relationship])
|
15
|
+
assert_equal(:has_many, Foo.reflections[reflection_key(:bars)].macro)
|
16
|
+
assert_equal(:intersects, Foo.reflections[reflection_key(:bars)].options[:relationship])
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_association
|
20
|
-
|
20
|
+
values = nil
|
21
|
+
|
22
|
+
assert_sql(/ST_intersects\('#{REGEXP_WKB_HEX}'::geometry, "bars"\."the_geom"/) do
|
23
|
+
values = Foo.first.bars.collect(&:id).sort
|
24
|
+
end
|
25
|
+
|
26
|
+
assert_equal([3], values)
|
21
27
|
end
|
22
28
|
end
|
23
29
|
|
@@ -27,19 +33,19 @@ class RelationshipsTest < ActiveRecordSpatialTestCase
|
|
27
33
|
end
|
28
34
|
|
29
35
|
{
|
30
|
-
:
|
31
|
-
:
|
32
|
-
:
|
33
|
-
:
|
34
|
-
:
|
35
|
-
:
|
36
|
-
:
|
37
|
-
:
|
38
|
-
:
|
39
|
-
:
|
40
|
-
:
|
41
|
-
:
|
42
|
-
:'3dintersects' => [
|
36
|
+
contains: [],
|
37
|
+
containsproperly: [],
|
38
|
+
covers: [],
|
39
|
+
coveredby: [3],
|
40
|
+
crosses: [],
|
41
|
+
disjoint: [1, 2],
|
42
|
+
equals: [],
|
43
|
+
intersects: [3],
|
44
|
+
orderingequals: [],
|
45
|
+
overlaps: [],
|
46
|
+
touches: [],
|
47
|
+
within: [3],
|
48
|
+
:'3dintersects' => [3]
|
43
49
|
}.each do |relationship, ids|
|
44
50
|
define_method("test_#{relationship}") do
|
45
51
|
skip("ST_#{relationship} is unavailable") unless Foo.respond_to?("st_#{relationship}")
|
@@ -47,11 +53,11 @@ class RelationshipsTest < ActiveRecordSpatialTestCase
|
|
47
53
|
Foo.reflections.delete(:bars)
|
48
54
|
|
49
55
|
Foo.class_eval do
|
50
|
-
has_many_spatially :bars, :
|
56
|
+
has_many_spatially :bars, relationship: relationship
|
51
57
|
end
|
52
58
|
|
53
|
-
assert_equal(:has_many, Foo.reflections[:bars].macro)
|
54
|
-
assert_equal(relationship, Foo.reflections[:bars].options[:relationship])
|
59
|
+
assert_equal(:has_many, Foo.reflections[reflection_key(:bars)].macro)
|
60
|
+
assert_equal(relationship, Foo.reflections[reflection_key(:bars)].options[:relationship])
|
55
61
|
assert_equal(ids, Foo.first.bars.collect(&:id).sort)
|
56
62
|
end
|
57
63
|
end
|
@@ -63,19 +69,19 @@ class RelationshipsWithSelfTest < ActiveRecordSpatialTestCase
|
|
63
69
|
end
|
64
70
|
|
65
71
|
{
|
66
|
-
:
|
67
|
-
:
|
68
|
-
:
|
69
|
-
:
|
70
|
-
:
|
71
|
-
:
|
72
|
-
:
|
73
|
-
:
|
74
|
-
:
|
75
|
-
:
|
76
|
-
:
|
77
|
-
:
|
78
|
-
:'3dintersects' => [
|
72
|
+
contains: [1],
|
73
|
+
containsproperly: [1],
|
74
|
+
covers: [1],
|
75
|
+
coveredby: [1, 3],
|
76
|
+
crosses: [],
|
77
|
+
disjoint: [2],
|
78
|
+
equals: [1],
|
79
|
+
intersects: [1, 3],
|
80
|
+
orderingequals: [1],
|
81
|
+
overlaps: [],
|
82
|
+
touches: [],
|
83
|
+
within: [1, 3],
|
84
|
+
:'3dintersects' => [1, 3]
|
79
85
|
}.each do |relationship, ids|
|
80
86
|
define_method("test_#{relationship}") do
|
81
87
|
skip("ST_#{relationship} is unavailable") unless Foo.respond_to?("st_#{relationship}")
|
@@ -83,11 +89,11 @@ class RelationshipsWithSelfTest < ActiveRecordSpatialTestCase
|
|
83
89
|
Foo.reflections.delete(:foos)
|
84
90
|
|
85
91
|
Foo.class_eval do
|
86
|
-
has_many_spatially :foos, :
|
92
|
+
has_many_spatially :foos, relationship: relationship
|
87
93
|
end
|
88
94
|
|
89
|
-
assert_equal(:has_many, Foo.reflections[:foos].macro)
|
90
|
-
assert_equal(relationship, Foo.reflections[:foos].options[:relationship])
|
95
|
+
assert_equal(:has_many, Foo.reflections[reflection_key(:foos)].macro)
|
96
|
+
assert_equal(relationship, Foo.reflections[reflection_key(:foos)].options[:relationship])
|
91
97
|
assert_equal(ids, Foo.first.foos.collect(&:id).sort)
|
92
98
|
end
|
93
99
|
end
|
@@ -99,19 +105,19 @@ class RelationshipsWithForeignGeomTest < ActiveRecordSpatialTestCase
|
|
99
105
|
end
|
100
106
|
|
101
107
|
{
|
102
|
-
:
|
103
|
-
:
|
104
|
-
:
|
105
|
-
:
|
106
|
-
:
|
107
|
-
:
|
108
|
-
:
|
109
|
-
:
|
110
|
-
:
|
111
|
-
:
|
112
|
-
:
|
113
|
-
:
|
114
|
-
:'3dintersects' => [
|
108
|
+
contains: [],
|
109
|
+
containsproperly: [],
|
110
|
+
covers: [],
|
111
|
+
coveredby: [3],
|
112
|
+
crosses: [],
|
113
|
+
disjoint: [1, 2],
|
114
|
+
equals: [],
|
115
|
+
intersects: [3],
|
116
|
+
orderingequals: [],
|
117
|
+
overlaps: [],
|
118
|
+
touches: [],
|
119
|
+
within: [3],
|
120
|
+
:'3dintersects' => [3]
|
115
121
|
}.each do |relationship, ids|
|
116
122
|
define_method("test_#{relationship}") do
|
117
123
|
skip("ST_#{relationship} is unavailable") unless Foo.respond_to?("st_#{relationship}")
|
@@ -120,14 +126,14 @@ class RelationshipsWithForeignGeomTest < ActiveRecordSpatialTestCase
|
|
120
126
|
|
121
127
|
Foo.class_eval do
|
122
128
|
has_many_spatially :bars,
|
123
|
-
:
|
124
|
-
:
|
129
|
+
relationship: relationship,
|
130
|
+
foreign_geom: :the_other_geom
|
125
131
|
end
|
126
132
|
|
127
|
-
assert_equal(:has_many, Foo.reflections[:bars].macro)
|
128
|
-
assert_equal(relationship, Foo.reflections[:bars].options[:relationship])
|
129
|
-
assert_equal(:the_geom, Foo.reflections[:bars].options[:geom])
|
130
|
-
assert_equal(:the_other_geom, Foo.reflections[:bars].options[:foreign_geom])
|
133
|
+
assert_equal(:has_many, Foo.reflections[reflection_key(:bars)].macro)
|
134
|
+
assert_equal(relationship, Foo.reflections[reflection_key(:bars)].options[:relationship])
|
135
|
+
assert_equal(:the_geom, Foo.reflections[reflection_key(:bars)].options[:geom])
|
136
|
+
assert_equal(:the_other_geom, Foo.reflections[reflection_key(:bars)].options[:foreign_geom])
|
131
137
|
assert_equal(ids, Foo.first.bars.collect(&:id).sort)
|
132
138
|
end
|
133
139
|
end
|
@@ -139,19 +145,19 @@ class RelationshipsWithGeomTest < ActiveRecordSpatialTestCase
|
|
139
145
|
end
|
140
146
|
|
141
147
|
{
|
142
|
-
:
|
143
|
-
:
|
144
|
-
:
|
145
|
-
:
|
146
|
-
:
|
147
|
-
:
|
148
|
-
:
|
149
|
-
:
|
150
|
-
:
|
151
|
-
:
|
152
|
-
:
|
153
|
-
:
|
154
|
-
:'3dintersects' => [
|
148
|
+
contains: [],
|
149
|
+
containsproperly: [],
|
150
|
+
covers: [],
|
151
|
+
coveredby: [3],
|
152
|
+
crosses: [],
|
153
|
+
disjoint: [1, 2],
|
154
|
+
equals: [],
|
155
|
+
intersects: [3],
|
156
|
+
orderingequals: [],
|
157
|
+
overlaps: [],
|
158
|
+
touches: [3],
|
159
|
+
within: [],
|
160
|
+
:'3dintersects' => [3]
|
155
161
|
}.each do |relationship, ids|
|
156
162
|
define_method("test_#{relationship}") do
|
157
163
|
skip("ST_#{relationship} is unavailable") unless Foo.respond_to?("st_#{relationship}")
|
@@ -160,14 +166,14 @@ class RelationshipsWithGeomTest < ActiveRecordSpatialTestCase
|
|
160
166
|
|
161
167
|
Foo.class_eval do
|
162
168
|
has_many_spatially :bars,
|
163
|
-
:
|
164
|
-
:
|
169
|
+
relationship: relationship,
|
170
|
+
geom: :the_other_geom
|
165
171
|
end
|
166
172
|
|
167
|
-
assert_equal(:has_many, Foo.reflections[:bars].macro)
|
168
|
-
assert_equal(relationship, Foo.reflections[:bars].options[:relationship])
|
169
|
-
assert_equal(:the_other_geom, Foo.reflections[:bars].options[:geom])
|
170
|
-
assert_equal(:the_geom, Foo.reflections[:bars].options[:foreign_geom])
|
173
|
+
assert_equal(:has_many, Foo.reflections[reflection_key(:bars)].macro)
|
174
|
+
assert_equal(relationship, Foo.reflections[reflection_key(:bars)].options[:relationship])
|
175
|
+
assert_equal(:the_other_geom, Foo.reflections[reflection_key(:bars)].options[:geom])
|
176
|
+
assert_equal(:the_geom, Foo.reflections[reflection_key(:bars)].options[:foreign_geom])
|
171
177
|
assert_equal(ids, Foo.first.bars.collect(&:id).sort)
|
172
178
|
end
|
173
179
|
end
|
@@ -193,8 +199,8 @@ class WithCounterSqlTest < ActiveRecordSpatialTestCase
|
|
193
199
|
assert_raise(ArgumentError) do
|
194
200
|
Foo.class_eval do
|
195
201
|
has_many_spatially :bars,
|
196
|
-
:
|
197
|
-
:
|
202
|
+
class_name: 'Bar',
|
203
|
+
counter_sql: 'SELECT COUNT(*) bars.* FROM bars'
|
198
204
|
end
|
199
205
|
end
|
200
206
|
end
|
@@ -206,9 +212,9 @@ class ScopeOptionsTest < ActiveRecordSpatialTestCase
|
|
206
212
|
|
207
213
|
Foo.class_eval do
|
208
214
|
has_many_spatially :bars,
|
209
|
-
:
|
210
|
-
:
|
211
|
-
:
|
215
|
+
class_name: 'Bar',
|
216
|
+
scope_options: {
|
217
|
+
use_index: false
|
212
218
|
}
|
213
219
|
end
|
214
220
|
end
|
@@ -235,7 +241,7 @@ class PreloadTest < ActiveRecordSpatialTestCase
|
|
235
241
|
end
|
236
242
|
end
|
237
243
|
|
238
|
-
assert_equal([
|
244
|
+
assert_equal([1, 1, 2], values)
|
239
245
|
end
|
240
246
|
|
241
247
|
def test_with_eager_loading
|
@@ -248,7 +254,7 @@ class PreloadTest < ActiveRecordSpatialTestCase
|
|
248
254
|
end
|
249
255
|
end
|
250
256
|
|
251
|
-
assert_equal([
|
257
|
+
assert_equal([1, 1, 2], values)
|
252
258
|
end
|
253
259
|
end
|
254
260
|
|
@@ -258,8 +264,8 @@ class PreloadWithOtherGeomTest < ActiveRecordSpatialTestCase
|
|
258
264
|
|
259
265
|
Foo.class_eval do
|
260
266
|
has_many_spatially :bars,
|
261
|
-
:
|
262
|
-
:
|
267
|
+
class_name: 'Bar',
|
268
|
+
geom: :the_other_geom
|
263
269
|
end
|
264
270
|
end
|
265
271
|
|
@@ -273,7 +279,7 @@ class PreloadWithOtherGeomTest < ActiveRecordSpatialTestCase
|
|
273
279
|
end
|
274
280
|
end
|
275
281
|
|
276
|
-
assert_equal([
|
282
|
+
assert_equal([1, 0, 2], values)
|
277
283
|
end
|
278
284
|
|
279
285
|
def test_with_eager_loading
|
@@ -286,27 +292,7 @@ class PreloadWithOtherGeomTest < ActiveRecordSpatialTestCase
|
|
286
292
|
end
|
287
293
|
end
|
288
294
|
|
289
|
-
assert_equal([
|
290
|
-
end
|
291
|
-
end
|
292
|
-
|
293
|
-
class OrderingTest < ActiveRecordSpatialTestCase
|
294
|
-
def self.before_suite
|
295
|
-
load_models(:foo, :bar)
|
296
|
-
|
297
|
-
Foo.class_eval do
|
298
|
-
has_many_spatially :bars,
|
299
|
-
:relationship => :disjoint,
|
300
|
-
:order => 'ST_area(the_geom)'
|
301
|
-
end
|
302
|
-
end
|
303
|
-
|
304
|
-
def test_ordering
|
305
|
-
assert_equal([ 1, 2 ], Foo.first.bars.collect(&:id))
|
306
|
-
end
|
307
|
-
|
308
|
-
def test_reordering
|
309
|
-
assert_equal([ 2, 1 ], Foo.first.bars.reorder('bars.id DESC').collect(&:id))
|
295
|
+
assert_equal([1, 0, 2], values)
|
310
296
|
end
|
311
297
|
end
|
312
298
|
|
@@ -316,13 +302,13 @@ class PolymorphicAssociationsTest < ActiveRecordSpatialTestCase
|
|
316
302
|
|
317
303
|
Foo.class_eval do
|
318
304
|
has_many_spatially :zortables,
|
319
|
-
:
|
305
|
+
as: :zortable
|
320
306
|
end
|
321
307
|
|
322
308
|
Bar.class_eval do
|
323
309
|
has_many_spatially :zortables,
|
324
|
-
:
|
325
|
-
:
|
310
|
+
as: :zortable,
|
311
|
+
geom: :the_other_geom
|
326
312
|
end
|
327
313
|
end
|
328
314
|
|
@@ -334,7 +320,7 @@ class PolymorphicAssociationsTest < ActiveRecordSpatialTestCase
|
|
334
320
|
end
|
335
321
|
end
|
336
322
|
|
337
|
-
assert_equal([
|
323
|
+
assert_equal([1, 7], values)
|
338
324
|
end
|
339
325
|
|
340
326
|
def test_without_eager_loading_and_geom
|
@@ -345,29 +331,35 @@ class PolymorphicAssociationsTest < ActiveRecordSpatialTestCase
|
|
345
331
|
end
|
346
332
|
end
|
347
333
|
|
348
|
-
assert_equal([
|
334
|
+
assert_equal([6], values)
|
349
335
|
end
|
350
336
|
|
351
337
|
def test_with_eager_loading
|
352
338
|
values = nil
|
353
|
-
|
354
|
-
|
355
|
-
|
339
|
+
|
340
|
+
Foo.connection.unprepared_statement do
|
341
|
+
assert_queries(2) do
|
342
|
+
assert_sql(/SELECT "zortables"\.\*, array_to_string\(array_agg\("__spatial_ids_join__"."id"\), ','\) AS "__spatial_ids__" FROM "zortables" INNER JOIN "foos" AS "__spatial_ids_join__" ON \(ST_intersects\("__spatial_ids_join__"."the_geom", "zortables"."zortable_geom"\)\) WHERE "zortables"."zortable_type" = 'Foo' AND "__spatial_ids_join__"\."id" IN \(.+\) GROUP BY "zortables"\."id"/) do
|
343
|
+
values = Foo.includes(:zortables).first.zortables.collect(&:id).sort
|
344
|
+
end
|
356
345
|
end
|
357
346
|
end
|
358
347
|
|
359
|
-
assert_equal([
|
348
|
+
assert_equal([1, 7], values)
|
360
349
|
end
|
361
350
|
|
362
351
|
def test_with_eager_loading_and_geom
|
363
352
|
values = nil
|
364
|
-
|
365
|
-
|
366
|
-
|
353
|
+
|
354
|
+
Bar.connection.unprepared_statement do
|
355
|
+
assert_queries(2) do
|
356
|
+
assert_sql(/SELECT "zortables"\.\*, array_to_string\(array_agg\("__spatial_ids_join__"."id"\), ','\) AS "__spatial_ids__" FROM "zortables" INNER JOIN "bars" AS "__spatial_ids_join__" ON \(ST_intersects\(ST_SetSRID\("__spatial_ids_join__"."the_other_geom", #{ActiveRecordSpatial::UNKNOWN_SRID}\), "zortables"."zortable_geom"\)\) WHERE "zortables"."zortable_type" = 'Bar' AND "__spatial_ids_join__"\."id" IN \(.+\) GROUP BY "zortables"\."id"/) do
|
357
|
+
values = Bar.includes(:zortables).first.zortables.collect(&:id).sort
|
358
|
+
end
|
367
359
|
end
|
368
360
|
end
|
369
361
|
|
370
|
-
assert_equal([
|
362
|
+
assert_equal([6], values)
|
371
363
|
end
|
372
364
|
end
|
373
365
|
|
@@ -377,19 +369,19 @@ class PolymorphicAssociationsWithRelationshipsTest < ActiveRecordSpatialTestCase
|
|
377
369
|
end
|
378
370
|
|
379
371
|
{
|
380
|
-
:
|
381
|
-
:
|
382
|
-
:
|
383
|
-
:
|
384
|
-
:
|
385
|
-
:
|
386
|
-
:
|
387
|
-
:
|
388
|
-
:
|
389
|
-
:
|
390
|
-
:
|
391
|
-
:
|
392
|
-
:'3dintersects' => [
|
372
|
+
contains: [1],
|
373
|
+
containsproperly: [1],
|
374
|
+
covers: [1],
|
375
|
+
coveredby: [1, 7],
|
376
|
+
crosses: [],
|
377
|
+
disjoint: [2, 3],
|
378
|
+
equals: [1],
|
379
|
+
intersects: [1, 7],
|
380
|
+
orderingequals: [1],
|
381
|
+
overlaps: [],
|
382
|
+
touches: [],
|
383
|
+
within: [1, 7],
|
384
|
+
:'3dintersects' => [1, 7]
|
393
385
|
}.each do |relationship, ids|
|
394
386
|
define_method("test_#{relationship}") do
|
395
387
|
skip("ST_#{relationship} is unavailable") unless Foo.respond_to?("st_#{relationship}")
|
@@ -398,8 +390,8 @@ class PolymorphicAssociationsWithRelationshipsTest < ActiveRecordSpatialTestCase
|
|
398
390
|
|
399
391
|
Foo.class_eval do
|
400
392
|
has_many_spatially :zortables,
|
401
|
-
:
|
402
|
-
:
|
393
|
+
as: :zortable,
|
394
|
+
relationship: relationship
|
403
395
|
end
|
404
396
|
|
405
397
|
assert_equal(ids, Foo.first.zortables.collect(&:id).sort)
|
@@ -414,62 +406,49 @@ class ClassNameOptionTest < ActiveRecordSpatialTestCase
|
|
414
406
|
|
415
407
|
Foo.class_eval do
|
416
408
|
has_many_spatially :blops,
|
417
|
-
:
|
409
|
+
class_name: 'Bar'
|
418
410
|
end
|
419
411
|
end
|
420
412
|
|
421
413
|
def test_class_name
|
422
|
-
assert_equal([
|
423
|
-
assert_equal([
|
414
|
+
assert_equal([3], Foo.first.blops.collect(&:id))
|
415
|
+
assert_equal([3], Foo.includes(:blops).first.blops.collect(&:id))
|
424
416
|
end
|
425
417
|
end
|
426
418
|
|
427
|
-
class
|
419
|
+
class ScopesTest < ActiveRecordSpatialTestCase
|
428
420
|
def self.before_suite
|
429
421
|
load_models(:foo, :bar)
|
430
422
|
|
431
423
|
Foo.class_eval do
|
432
|
-
has_many_spatially :bars,
|
433
|
-
:
|
434
|
-
|
435
|
-
:bars => {
|
436
|
-
:id => 3
|
437
|
-
}
|
438
|
-
}
|
424
|
+
has_many_spatially :bars, -> {
|
425
|
+
where(bars: { id: 3 })
|
426
|
+
}, relationship: :disjoint
|
439
427
|
end
|
440
428
|
end
|
441
429
|
|
442
|
-
def
|
443
|
-
|
444
|
-
assert_equal([], Foo.includes(:bars).first.bars.collect(&:id))
|
445
|
-
end
|
446
|
-
end
|
447
|
-
|
448
|
-
class IncludeOptionTest < ActiveRecordSpatialTestCase
|
449
|
-
def self.before_suite
|
450
|
-
load_models(:blort, :foo, :bar)
|
430
|
+
def test_scopes_without_eager_loading
|
431
|
+
values = nil
|
451
432
|
|
452
|
-
Foo.
|
453
|
-
|
433
|
+
Foo.connection.unprepared_statement do
|
434
|
+
assert_sql(/SELECT "bars".* FROM "bars"\s+WHERE \(ST_disjoint\('#{REGEXP_WKB_HEX}'::geometry, "bars"."the_geom"\)\) AND "bars"."id" = 3/) do
|
435
|
+
values = Foo.first.bars.collect(&:id)
|
436
|
+
end
|
454
437
|
end
|
455
438
|
|
456
|
-
|
457
|
-
has_many_spatially :foos,
|
458
|
-
:include => :blorts
|
459
|
-
end
|
439
|
+
assert_equal([], values)
|
460
440
|
end
|
461
441
|
|
462
|
-
def
|
463
|
-
skip("Removed from AR 4") if ActiveRecord::VERSION::MAJOR >= 4
|
464
|
-
|
442
|
+
def test_scopes_with_eager_loading
|
465
443
|
values = nil
|
466
|
-
|
467
|
-
|
468
|
-
|
444
|
+
|
445
|
+
Foo.connection.unprepared_statement do
|
446
|
+
assert_sql(/SELECT "bars"\.\*, array_to_string\(array_agg\("__spatial_ids_join__"."id"\), ','\) AS "__spatial_ids__" FROM "bars" INNER JOIN "foos" AS "__spatial_ids_join__" ON \(ST_disjoint\("__spatial_ids_join__"."the_geom", "bars"."the_geom"\)\) WHERE "bars"."id" = 3 AND "__spatial_ids_join__"\."id" IN \(.+\) GROUP BY "bars"\."id"/) do
|
447
|
+
values = Foo.includes(:bars).first.bars.collect(&:id)
|
469
448
|
end
|
470
449
|
end
|
471
450
|
|
472
|
-
assert_equal([
|
451
|
+
assert_equal([], values)
|
473
452
|
end
|
474
453
|
end
|
475
454
|
|
@@ -479,9 +458,9 @@ class GeomWrapperTest < ActiveRecordSpatialTestCase
|
|
479
458
|
|
480
459
|
Foo.class_eval do
|
481
460
|
has_many_spatially :bars,
|
482
|
-
:
|
483
|
-
:
|
484
|
-
:
|
461
|
+
class_name: 'Bar',
|
462
|
+
geom: {
|
463
|
+
wrapper: :envelope
|
485
464
|
}
|
486
465
|
end
|
487
466
|
end
|
@@ -493,7 +472,7 @@ class GeomWrapperTest < ActiveRecordSpatialTestCase
|
|
493
472
|
values = Foo.first.bars.collect(&:id).sort
|
494
473
|
end
|
495
474
|
|
496
|
-
assert_equal([
|
475
|
+
assert_equal([3], values)
|
497
476
|
end
|
498
477
|
|
499
478
|
def test_with_eager_loading
|
@@ -503,7 +482,7 @@ class GeomWrapperTest < ActiveRecordSpatialTestCase
|
|
503
482
|
values = Foo.includes(:bars).first.bars.collect(&:id).sort
|
504
483
|
end
|
505
484
|
|
506
|
-
assert_equal([
|
485
|
+
assert_equal([3], values)
|
507
486
|
end
|
508
487
|
end
|
509
488
|
|
@@ -513,9 +492,9 @@ class ForeignGeomWrapperTest < ActiveRecordSpatialTestCase
|
|
513
492
|
|
514
493
|
Foo.class_eval do
|
515
494
|
has_many_spatially :bars,
|
516
|
-
:
|
517
|
-
:
|
518
|
-
:
|
495
|
+
class_name: 'Bar',
|
496
|
+
foreign_geom: {
|
497
|
+
wrapper: :envelope
|
519
498
|
}
|
520
499
|
end
|
521
500
|
end
|
@@ -527,7 +506,7 @@ class ForeignGeomWrapperTest < ActiveRecordSpatialTestCase
|
|
527
506
|
values = Foo.first.bars.collect(&:id).sort
|
528
507
|
end
|
529
508
|
|
530
|
-
assert_equal([
|
509
|
+
assert_equal([3], values)
|
531
510
|
end
|
532
511
|
|
533
512
|
def test_with_eager_loading
|
@@ -537,7 +516,7 @@ class ForeignGeomWrapperTest < ActiveRecordSpatialTestCase
|
|
537
516
|
values = Foo.includes(:bars).first.bars.collect(&:id).sort
|
538
517
|
end
|
539
518
|
|
540
|
-
assert_equal([
|
519
|
+
assert_equal([3], values)
|
541
520
|
end
|
542
521
|
end
|
543
522
|
|
@@ -547,12 +526,12 @@ class BothGeomWrapperTest < ActiveRecordSpatialTestCase
|
|
547
526
|
|
548
527
|
Foo.class_eval do
|
549
528
|
has_many_spatially :bars,
|
550
|
-
:
|
551
|
-
:
|
552
|
-
:
|
529
|
+
class_name: 'Bar',
|
530
|
+
geom: {
|
531
|
+
wrapper: :convexhull
|
553
532
|
},
|
554
|
-
:
|
555
|
-
:
|
533
|
+
foreign_geom: {
|
534
|
+
wrapper: :envelope
|
556
535
|
}
|
557
536
|
end
|
558
537
|
end
|
@@ -564,7 +543,7 @@ class BothGeomWrapperTest < ActiveRecordSpatialTestCase
|
|
564
543
|
values = Foo.first.bars.collect(&:id).sort
|
565
544
|
end
|
566
545
|
|
567
|
-
assert_equal([
|
546
|
+
assert_equal([3], values)
|
568
547
|
end
|
569
548
|
|
570
549
|
def test_with_eager_loading
|
@@ -574,7 +553,7 @@ class BothGeomWrapperTest < ActiveRecordSpatialTestCase
|
|
574
553
|
values = Foo.includes(:bars).first.bars.collect(&:id).sort
|
575
554
|
end
|
576
555
|
|
577
|
-
assert_equal([
|
556
|
+
assert_equal([3], values)
|
578
557
|
end
|
579
558
|
end
|
580
559
|
|
@@ -584,13 +563,13 @@ class BothGeomWrapperWithMixedSRIDsTest < ActiveRecordSpatialTestCase
|
|
584
563
|
|
585
564
|
Foo.class_eval do
|
586
565
|
has_many_spatially :bars,
|
587
|
-
:
|
588
|
-
:
|
589
|
-
:
|
566
|
+
class_name: 'Bar',
|
567
|
+
geom: {
|
568
|
+
wrapper: :convexhull
|
590
569
|
},
|
591
|
-
:
|
592
|
-
:
|
593
|
-
:
|
570
|
+
foreign_geom: {
|
571
|
+
wrapper: :centroid,
|
572
|
+
name: :the_other_geom
|
594
573
|
}
|
595
574
|
end
|
596
575
|
end
|
@@ -602,7 +581,7 @@ class BothGeomWrapperWithMixedSRIDsTest < ActiveRecordSpatialTestCase
|
|
602
581
|
values = Foo.first.bars.collect(&:id).sort
|
603
582
|
end
|
604
583
|
|
605
|
-
assert_equal([
|
584
|
+
assert_equal([3], values)
|
606
585
|
end
|
607
586
|
|
608
587
|
def test_with_eager_loading
|
@@ -612,7 +591,7 @@ class BothGeomWrapperWithMixedSRIDsTest < ActiveRecordSpatialTestCase
|
|
612
591
|
values = Foo.includes(:bars).first.bars.collect(&:id).sort
|
613
592
|
end
|
614
593
|
|
615
|
-
assert_equal([
|
594
|
+
assert_equal([3], values)
|
616
595
|
end
|
617
596
|
end
|
618
597
|
|
@@ -622,15 +601,15 @@ class BothGeomWrapperAndOptionsWithMixedSRIDsTest < ActiveRecordSpatialTestCase
|
|
622
601
|
|
623
602
|
Foo.class_eval do
|
624
603
|
has_many_spatially :bars,
|
625
|
-
:
|
626
|
-
:
|
627
|
-
:
|
604
|
+
class_name: 'Bar',
|
605
|
+
geom: {
|
606
|
+
wrapper: :convexhull
|
628
607
|
},
|
629
|
-
:
|
630
|
-
:
|
631
|
-
:
|
608
|
+
foreign_geom: {
|
609
|
+
wrapper: {
|
610
|
+
buffer: 100
|
632
611
|
},
|
633
|
-
:
|
612
|
+
name: :the_other_geom
|
634
613
|
}
|
635
614
|
end
|
636
615
|
end
|
@@ -642,7 +621,7 @@ class BothGeomWrapperAndOptionsWithMixedSRIDsTest < ActiveRecordSpatialTestCase
|
|
642
621
|
values = Foo.first.bars.collect(&:id).sort
|
643
622
|
end
|
644
623
|
|
645
|
-
assert_equal([
|
624
|
+
assert_equal([1, 2, 3], values)
|
646
625
|
end
|
647
626
|
|
648
627
|
def test_with_eager_loading
|
@@ -652,7 +631,7 @@ class BothGeomWrapperAndOptionsWithMixedSRIDsTest < ActiveRecordSpatialTestCase
|
|
652
631
|
values = Foo.includes(:bars).first.bars.collect(&:id).sort
|
653
632
|
end
|
654
633
|
|
655
|
-
assert_equal([
|
634
|
+
assert_equal([1, 2, 3], values)
|
656
635
|
end
|
657
636
|
|
658
637
|
class ScopeArgumentTest < ActiveRecordSpatialTestCase
|
@@ -663,7 +642,7 @@ class BothGeomWrapperAndOptionsWithMixedSRIDsTest < ActiveRecordSpatialTestCase
|
|
663
642
|
def test_foo
|
664
643
|
Foo.class_eval do
|
665
644
|
has_many_spatially :bars, proc {
|
666
|
-
|
645
|
+
order(:id)
|
667
646
|
}
|
668
647
|
end
|
669
648
|
|
@@ -671,6 +650,5 @@ class BothGeomWrapperAndOptionsWithMixedSRIDsTest < ActiveRecordSpatialTestCase
|
|
671
650
|
Foo.first.bars.to_a
|
672
651
|
end
|
673
652
|
end
|
674
|
-
end
|
653
|
+
end
|
675
654
|
end
|
676
|
-
|