activerecord-postgis-adapter 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,136 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # PostGIS adapter for ActiveRecord
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+ # Copyright 2010 Daniel Azuma
7
+ #
8
+ # All rights reserved.
9
+ #
10
+ # Redistribution and use in source and binary forms, with or without
11
+ # modification, are permitted provided that the following conditions are met:
12
+ #
13
+ # * Redistributions of source code must retain the above copyright notice,
14
+ # this list of conditions and the following disclaimer.
15
+ # * Redistributions in binary form must reproduce the above copyright notice,
16
+ # this list of conditions and the following disclaimer in the documentation
17
+ # and/or other materials provided with the distribution.
18
+ # * Neither the name of the copyright holder, nor the names of any other
19
+ # contributors to this software, may be used to endorse or promote products
20
+ # derived from this software without specific prior written permission.
21
+ #
22
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+ # -----------------------------------------------------------------------------
34
+ ;
35
+
36
+
37
+ # :stopdoc:
38
+
39
+ module ActiveRecord
40
+
41
+ module ConnectionAdapters
42
+
43
+ module PostGISAdapter
44
+
45
+
46
+ class SpatialTableDefinition < ConnectionAdapters::TableDefinition
47
+
48
+ def column(name_, type_, options_={})
49
+ if (info_ = @base.spatial_column_constructor(type_.to_sym))
50
+ options_[:type] ||= info_[:type] || type_
51
+ type_ = :spatial
52
+ end
53
+ super(name_, type_, options_)
54
+ if type_ == :spatial
55
+ col_ = self[name_]
56
+ col_.extend(SpatialColumnDefinitionMethods) unless col_.respond_to?(:geographic?)
57
+ options_.merge!(col_.limit) if col_.limit.is_a?(::Hash)
58
+ col_.set_spatial_type(options_[:type])
59
+ col_.set_geographic(options_[:geographic])
60
+ col_.set_srid((options_[:srid] || 4326).to_i)
61
+ col_.set_has_z(options_[:has_z])
62
+ col_.set_has_m(options_[:has_m])
63
+ end
64
+ self
65
+ end
66
+
67
+ def to_sql
68
+ @columns.find_all{ |c_| !c_.respond_to?(:geographic?) || c_.geographic? }.map{ |c_| c_.to_sql } * ', '
69
+ end
70
+
71
+ def non_geographic_spatial_columns
72
+ @columns.find_all{ |c_| c_.respond_to?(:geographic?) && !c_.geographic? }
73
+ end
74
+
75
+ end
76
+
77
+
78
+ module SpatialColumnDefinitionMethods
79
+
80
+ def spatial_type
81
+ defined?(@spatial_type) && @spatial_type
82
+ end
83
+
84
+ def geographic?
85
+ defined?(@geographic) && @geographic
86
+ end
87
+
88
+ def srid
89
+ defined?(@srid) ? @srid : 4326
90
+ end
91
+
92
+ def has_z?
93
+ defined?(@has_z) && @has_z
94
+ end
95
+
96
+ def has_m?
97
+ defined?(@has_m) && @has_m
98
+ end
99
+
100
+ def set_geographic(value_)
101
+ @geographic = value_ ? true : false
102
+ end
103
+
104
+ def set_spatial_type(value_)
105
+ @spatial_type = value_.to_s
106
+ end
107
+
108
+ def set_srid(value_)
109
+ @srid = value_
110
+ end
111
+
112
+ def set_has_z(value_)
113
+ @has_z = value_ ? true : false
114
+ end
115
+
116
+ def set_has_m(value_)
117
+ @has_m = value_ ? true : false
118
+ end
119
+
120
+ def sql_type
121
+ type_ = spatial_type.upcase.gsub('_', '')
122
+ type_ << 'Z' if has_z?
123
+ type_ << 'M' if has_m?
124
+ "GEOGRAPHY(#{type_},#{srid})"
125
+ end
126
+
127
+ end
128
+
129
+
130
+ end
131
+
132
+ end
133
+
134
+ end
135
+
136
+ # :startdoc:
@@ -0,0 +1,62 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # PostGIS adapter for ActiveRecord
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+ # Copyright 2010 Daniel Azuma
7
+ #
8
+ # All rights reserved.
9
+ #
10
+ # Redistribution and use in source and binary forms, with or without
11
+ # modification, are permitted provided that the following conditions are met:
12
+ #
13
+ # * Redistributions of source code must retain the above copyright notice,
14
+ # this list of conditions and the following disclaimer.
15
+ # * Redistributions in binary form must reproduce the above copyright notice,
16
+ # this list of conditions and the following disclaimer in the documentation
17
+ # and/or other materials provided with the distribution.
18
+ # * Neither the name of the copyright holder, nor the names of any other
19
+ # contributors to this software, may be used to endorse or promote products
20
+ # derived from this software without specific prior written permission.
21
+ #
22
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+ # -----------------------------------------------------------------------------
34
+ ;
35
+
36
+
37
+ begin
38
+ require 'versionomy'
39
+ rescue ::LoadError
40
+ end
41
+
42
+
43
+ module ActiveRecord
44
+
45
+ module ConnectionAdapters
46
+
47
+ module PostGISAdapter
48
+
49
+
50
+ # Current version of PostGISAdapter as a frozen string
51
+ VERSION_STRING = ::File.read(::File.dirname(__FILE__)+'/../../../../Version').strip.freeze
52
+
53
+ # Current version of PostGISAdapter as a Versionomy object, if the
54
+ # Versionomy gem is available; otherwise equal to VERSION_STRING.
55
+ VERSION = defined?(::Versionomy) ? ::Versionomy.parse(VERSION_STRING) : VERSION_STRING
56
+
57
+
58
+ end
59
+
60
+ end
61
+
62
+ end
@@ -34,25 +34,6 @@
34
34
  ;
35
35
 
36
36
 
37
- require 'rails/railtie'
37
+ puts "WARNING: rgeo/active_record/postgis_adapter/railtie is deprecated. Please use active_record/connection_adapters/postgis_adapter/railtie."
38
38
 
39
-
40
- module RGeo
41
-
42
- module ActiveRecord
43
-
44
- module PostgisAdapter
45
-
46
- class Railtie < ::Rails::Railtie
47
-
48
- rake_tasks do
49
- load "rgeo/active_record/postgis_adapter/databases.rake"
50
- end
51
-
52
- end
53
-
54
- end
55
-
56
- end
57
-
58
- end
39
+ require 'active_record/connection_adapters/postgis_adapter/railtie'
data/test/tc_basic.rb CHANGED
@@ -66,6 +66,11 @@ module RGeo
66
66
  end
67
67
 
68
68
 
69
+ def test_version
70
+ assert_not_nil(::ActiveRecord::ConnectionAdapters::PostGISAdapter::VERSION)
71
+ end
72
+
73
+
69
74
  def test_postgis_available
70
75
  connection_ = create_ar_class.connection
71
76
  assert_equal('PostGIS', connection_.adapter_name)
@@ -73,57 +78,6 @@ module RGeo
73
78
  end
74
79
 
75
80
 
76
- def test_create_simple_geometry
77
- klass_ = create_ar_class
78
- klass_.connection.create_table(:spatial_test) do |t_|
79
- t_.column 'latlon', :geometry
80
- end
81
- assert_equal(1, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
82
- col_ = klass_.columns.last
83
- assert_equal(::RGeo::Feature::Geometry, col_.geometric_type)
84
- assert_equal(false, col_.geographic?)
85
- assert_equal(4326, col_.srid)
86
- assert(klass_.cached_attributes.include?('latlon'))
87
- klass_.connection.drop_table(:spatial_test)
88
- assert_equal(0, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
89
- end
90
-
91
-
92
- def test_create_simple_geography
93
- klass_ = create_ar_class
94
- klass_.connection.create_table(:spatial_test) do |t_|
95
- t_.column 'latlon', :geometry, :geographic => true
96
- end
97
- col_ = klass_.columns.last
98
- assert_equal(::RGeo::Feature::Geometry, col_.geometric_type)
99
- assert_equal(true, col_.geographic?)
100
- assert_equal(4326, col_.srid)
101
- assert(klass_.cached_attributes.include?('latlon'))
102
- assert_equal(0, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
103
- end
104
-
105
-
106
- def test_create_point_geometry
107
- klass_ = create_ar_class
108
- klass_.connection.create_table(:spatial_test) do |t_|
109
- t_.column 'latlon', :point
110
- end
111
- assert_equal(::RGeo::Feature::Point, klass_.columns.last.geometric_type)
112
- assert(klass_.cached_attributes.include?('latlon'))
113
- end
114
-
115
-
116
- def test_create_geometry_with_index
117
- klass_ = create_ar_class
118
- klass_.connection.create_table(:spatial_test) do |t_|
119
- t_.column 'latlon', :geometry
120
- end
121
- klass_.connection.change_table(:spatial_test) do |t_|
122
- t_.index([:latlon], :spatial => true)
123
- end
124
- end
125
-
126
-
127
81
  def test_set_and_get_point
128
82
  klass_ = populate_ar_class(:latlon_point)
129
83
  obj_ = klass_.new
@@ -182,91 +136,12 @@ module RGeo
182
136
  end
183
137
 
184
138
 
185
- def test_add_geometry_column
186
- klass_ = create_ar_class
187
- klass_.connection.create_table(:spatial_test) do |t_|
188
- t_.column('latlon', :geometry)
189
- end
190
- klass_.connection.change_table(:spatial_test) do |t_|
191
- t_.column('geom2', :point, :srid => 4326)
192
- t_.column('name', :string)
193
- end
194
- assert_equal(2, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
195
- cols_ = klass_.columns
196
- assert_equal(::RGeo::Feature::Geometry, cols_[-3].geometric_type)
197
- assert_equal(4326, cols_[-3].srid)
198
- assert_equal(::RGeo::Feature::Point, cols_[-2].geometric_type)
199
- assert_equal(4326, cols_[-2].srid)
200
- assert_equal(false, cols_[-2].geographic?)
201
- assert_nil(cols_[-1].geometric_type)
202
- end
203
-
204
-
205
- def test_add_geography_column
206
- klass_ = create_ar_class
207
- klass_.connection.create_table(:spatial_test) do |t_|
208
- t_.column('latlon', :geometry)
209
- end
210
- klass_.connection.change_table(:spatial_test) do |t_|
211
- t_.column('geom2', :point, :srid => 4326, :geographic => true)
212
- t_.column('name', :string)
213
- end
214
- assert_equal(1, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
215
- cols_ = klass_.columns
216
- assert_equal(::RGeo::Feature::Geometry, cols_[-3].geometric_type)
217
- assert_equal(4326, cols_[-3].srid)
218
- assert_equal(::RGeo::Feature::Point, cols_[-2].geometric_type)
219
- assert_equal(4326, cols_[-2].srid)
220
- assert_equal(true, cols_[-2].geographic?)
221
- assert_nil(cols_[-1].geometric_type)
222
- end
223
-
224
-
225
- def test_drop_geometry_column
226
- klass_ = create_ar_class
227
- klass_.connection.create_table(:spatial_test) do |t_|
228
- t_.column('latlon', :geometry)
229
- t_.column('geom2', :point, :srid => 4326)
230
- end
231
- klass_.connection.change_table(:spatial_test) do |t_|
232
- t_.remove('geom2')
233
- end
234
- assert_equal(1, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
235
- cols_ = klass_.columns
236
- assert_equal(::RGeo::Feature::Geometry, cols_[-1].geometric_type)
237
- assert_equal('latlon', cols_[-1].name)
238
- assert_equal(4326, cols_[-1].srid)
239
- assert_equal(false, cols_[-1].geographic?)
240
- end
241
-
242
-
243
- def test_drop_geography_column
244
- klass_ = create_ar_class
245
- klass_.connection.create_table(:spatial_test) do |t_|
246
- t_.column('latlon', :geometry)
247
- t_.column('geom2', :point, :srid => 4326, :geographic => true)
248
- t_.column('geom3', :point, :srid => 4326)
249
- end
250
- klass_.connection.change_table(:spatial_test) do |t_|
251
- t_.remove('geom2')
252
- end
253
- assert_equal(2, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
254
- cols_ = klass_.columns
255
- assert_equal(::RGeo::Feature::Point, cols_[-1].geometric_type)
256
- assert_equal('geom3', cols_[-1].name)
257
- assert_equal(false, cols_[-1].geographic?)
258
- assert_equal(::RGeo::Feature::Geometry, cols_[-2].geometric_type)
259
- assert_equal('latlon', cols_[-2].name)
260
- assert_equal(false, cols_[-2].geographic?)
261
- end
262
-
263
-
264
139
  def test_readme_example
265
140
  klass_ = create_ar_class
266
141
  klass_.connection.create_table(:spatial_test) do |t_|
267
- t_.column(:latlon, :point)
268
- t_.line_string(:path)
269
- t_.geometry(:shape)
142
+ t_.column(:shape, :geometry)
143
+ t_.line_string(:path, :srid => 3785)
144
+ t_.point(:latlon, :geographic => true)
270
145
  end
271
146
  klass_.connection.change_table(:spatial_test) do |t_|
272
147
  t_.index(:latlon, :spatial => true)
@@ -284,32 +159,6 @@ module RGeo
284
159
  end
285
160
 
286
161
 
287
- def test_query_point
288
- klass_ = populate_ar_class(:latlon_point)
289
- obj_ = klass_.new
290
- obj_.latlon = @factory.point(1, 2)
291
- obj_.save!
292
- id_ = obj_.id
293
- obj2_ = klass_.where(:latlon => @factory.multi_point([@factory.point(1, 2)])).first
294
- assert_equal(id_, obj2_.id)
295
- obj3_ = klass_.where(:latlon => @factory.point(2, 2)).first
296
- assert_nil(obj3_)
297
- end
298
-
299
-
300
- def test_query_point_wkt
301
- klass_ = populate_ar_class(:latlon_point)
302
- obj_ = klass_.new
303
- obj_.latlon = @factory.point(1, 2)
304
- obj_.save!
305
- id_ = obj_.id
306
- obj2_ = klass_.where(:latlon => 'SRID=4326;POINT(1 2)').first
307
- assert_equal(id_, obj2_.id)
308
- obj3_ = klass_.where(:latlon => 'SRID=4326;POINT(2 2)').first
309
- assert_nil(obj3_)
310
- end
311
-
312
-
313
162
  end
314
163
 
315
164
  end
data/test/tc_ddl.rb ADDED
@@ -0,0 +1,270 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Tests for the PostGIS ActiveRecord adapter
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+ # Copyright 2010 Daniel Azuma
7
+ #
8
+ # All rights reserved.
9
+ #
10
+ # Redistribution and use in source and binary forms, with or without
11
+ # modification, are permitted provided that the following conditions are met:
12
+ #
13
+ # * Redistributions of source code must retain the above copyright notice,
14
+ # this list of conditions and the following disclaimer.
15
+ # * Redistributions in binary form must reproduce the above copyright notice,
16
+ # this list of conditions and the following disclaimer in the documentation
17
+ # and/or other materials provided with the distribution.
18
+ # * Neither the name of the copyright holder, nor the names of any other
19
+ # contributors to this software, may be used to endorse or promote products
20
+ # derived from this software without specific prior written permission.
21
+ #
22
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+ # -----------------------------------------------------------------------------
34
+ ;
35
+
36
+ require 'test/unit'
37
+ require 'rgeo/active_record/adapter_test_helper'
38
+
39
+
40
+ module RGeo
41
+ module ActiveRecord # :nodoc:
42
+ module PostGISAdapter # :nodoc:
43
+ module Tests # :nodoc:
44
+
45
+ class TestDDL < ::Test::Unit::TestCase # :nodoc:
46
+
47
+ DATABASE_CONFIG_PATH = ::File.dirname(__FILE__)+'/database.yml'
48
+ include AdapterTestHelper
49
+
50
+ define_test_methods do
51
+
52
+
53
+ def test_create_simple_geometry
54
+ klass_ = create_ar_class
55
+ klass_.connection.create_table(:spatial_test) do |t_|
56
+ t_.column 'latlon', :geometry
57
+ end
58
+ assert_equal(1, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
59
+ col_ = klass_.columns.last
60
+ assert_equal(::RGeo::Feature::Geometry, col_.geometric_type)
61
+ assert_equal(false, col_.geographic?)
62
+ assert_equal(4326, col_.srid)
63
+ assert(klass_.cached_attributes.include?('latlon'))
64
+ klass_.connection.drop_table(:spatial_test)
65
+ assert_equal(0, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
66
+ end
67
+
68
+
69
+ def test_create_simple_geography
70
+ klass_ = create_ar_class
71
+ klass_.connection.create_table(:spatial_test) do |t_|
72
+ t_.column 'latlon', :geometry, :geographic => true
73
+ end
74
+ col_ = klass_.columns.last
75
+ assert_equal(::RGeo::Feature::Geometry, col_.geometric_type)
76
+ assert_equal(true, col_.geographic?)
77
+ assert_equal(4326, col_.srid)
78
+ assert(klass_.cached_attributes.include?('latlon'))
79
+ assert_equal(0, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
80
+ end
81
+
82
+
83
+ def test_create_point_geometry
84
+ klass_ = create_ar_class
85
+ klass_.connection.create_table(:spatial_test) do |t_|
86
+ t_.column 'latlon', :point
87
+ end
88
+ assert_equal(::RGeo::Feature::Point, klass_.columns.last.geometric_type)
89
+ assert(klass_.cached_attributes.include?('latlon'))
90
+ end
91
+
92
+
93
+ def test_create_geometry_with_index
94
+ klass_ = create_ar_class
95
+ klass_.connection.create_table(:spatial_test) do |t_|
96
+ t_.column 'latlon', :geometry
97
+ end
98
+ klass_.connection.change_table(:spatial_test) do |t_|
99
+ t_.index([:latlon], :spatial => true)
100
+ end
101
+ assert(klass_.connection.indexes(:spatial_test).last.spatial)
102
+ end
103
+
104
+
105
+ def test_add_geometry_column
106
+ klass_ = create_ar_class
107
+ klass_.connection.create_table(:spatial_test) do |t_|
108
+ t_.column('latlon', :geometry)
109
+ end
110
+ klass_.connection.change_table(:spatial_test) do |t_|
111
+ t_.column('geom2', :point, :srid => 4326)
112
+ t_.column('name', :string)
113
+ end
114
+ assert_equal(2, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
115
+ cols_ = klass_.columns
116
+ assert_equal(::RGeo::Feature::Geometry, cols_[-3].geometric_type)
117
+ assert_equal(4326, cols_[-3].srid)
118
+ assert_equal(::RGeo::Feature::Point, cols_[-2].geometric_type)
119
+ assert_equal(4326, cols_[-2].srid)
120
+ assert_equal(false, cols_[-2].geographic?)
121
+ assert_nil(cols_[-1].geometric_type)
122
+ end
123
+
124
+
125
+ def test_add_geography_column
126
+ klass_ = create_ar_class
127
+ klass_.connection.create_table(:spatial_test) do |t_|
128
+ t_.column('latlon', :geometry)
129
+ end
130
+ klass_.connection.change_table(:spatial_test) do |t_|
131
+ t_.column('geom2', :point, :srid => 4326, :geographic => true)
132
+ t_.column('name', :string)
133
+ end
134
+ assert_equal(1, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
135
+ cols_ = klass_.columns
136
+ assert_equal(::RGeo::Feature::Geometry, cols_[-3].geometric_type)
137
+ assert_equal(4326, cols_[-3].srid)
138
+ assert_equal(::RGeo::Feature::Point, cols_[-2].geometric_type)
139
+ assert_equal(4326, cols_[-2].srid)
140
+ assert_equal(true, cols_[-2].geographic?)
141
+ assert_nil(cols_[-1].geometric_type)
142
+ end
143
+
144
+
145
+ def test_drop_geometry_column
146
+ klass_ = create_ar_class
147
+ klass_.connection.create_table(:spatial_test) do |t_|
148
+ t_.column('latlon', :geometry)
149
+ t_.column('geom2', :point, :srid => 4326)
150
+ end
151
+ klass_.connection.change_table(:spatial_test) do |t_|
152
+ t_.remove('geom2')
153
+ end
154
+ assert_equal(1, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
155
+ cols_ = klass_.columns
156
+ assert_equal(::RGeo::Feature::Geometry, cols_[-1].geometric_type)
157
+ assert_equal('latlon', cols_[-1].name)
158
+ assert_equal(4326, cols_[-1].srid)
159
+ assert_equal(false, cols_[-1].geographic?)
160
+ end
161
+
162
+
163
+ def test_drop_geography_column
164
+ klass_ = create_ar_class
165
+ klass_.connection.create_table(:spatial_test) do |t_|
166
+ t_.column('latlon', :geometry)
167
+ t_.column('geom2', :point, :srid => 4326, :geographic => true)
168
+ t_.column('geom3', :point, :srid => 4326)
169
+ end
170
+ klass_.connection.change_table(:spatial_test) do |t_|
171
+ t_.remove('geom2')
172
+ end
173
+ assert_equal(2, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
174
+ cols_ = klass_.columns
175
+ assert_equal(::RGeo::Feature::Point, cols_[-1].geometric_type)
176
+ assert_equal('geom3', cols_[-1].name)
177
+ assert_equal(false, cols_[-1].geographic?)
178
+ assert_equal(::RGeo::Feature::Geometry, cols_[-2].geometric_type)
179
+ assert_equal('latlon', cols_[-2].name)
180
+ assert_equal(false, cols_[-2].geographic?)
181
+ end
182
+
183
+
184
+ def test_create_simple_geometry_using_shortcut
185
+ klass_ = create_ar_class
186
+ klass_.connection.create_table(:spatial_test) do |t_|
187
+ t_.geometry 'latlon'
188
+ end
189
+ assert_equal(1, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
190
+ col_ = klass_.columns.last
191
+ assert_equal(::RGeo::Feature::Geometry, col_.geometric_type)
192
+ assert_equal(false, col_.geographic?)
193
+ assert_equal(4326, col_.srid)
194
+ assert(klass_.cached_attributes.include?('latlon'))
195
+ klass_.connection.drop_table(:spatial_test)
196
+ assert_equal(0, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
197
+ end
198
+
199
+
200
+ def test_create_simple_geography_using_shortcut
201
+ klass_ = create_ar_class
202
+ klass_.connection.create_table(:spatial_test) do |t_|
203
+ # t_.method_missing(:geometry, 'latlon', :geographic => true)
204
+ t_.geometry 'latlon', :geographic => true
205
+ end
206
+ col_ = klass_.columns.last
207
+ assert_equal(::RGeo::Feature::Geometry, col_.geometric_type)
208
+ assert_equal(true, col_.geographic?)
209
+ assert_equal(4326, col_.srid)
210
+ assert(klass_.cached_attributes.include?('latlon'))
211
+ assert_equal(0, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
212
+ end
213
+
214
+
215
+ def test_create_point_geometry_using_shortcut
216
+ klass_ = create_ar_class
217
+ klass_.connection.create_table(:spatial_test) do |t_|
218
+ t_.point 'latlon'
219
+ end
220
+ assert_equal(::RGeo::Feature::Point, klass_.columns.last.geometric_type)
221
+ assert(klass_.cached_attributes.include?('latlon'))
222
+ end
223
+
224
+
225
+ def test_create_geometry_with_options
226
+ klass_ = create_ar_class
227
+ klass_.connection.create_table(:spatial_test) do |t_|
228
+ t_.column 'region', :polygon, :has_m => true, :srid => 3785
229
+ end
230
+ assert_equal(1, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
231
+ col_ = klass_.columns.last
232
+ assert_equal(::RGeo::Feature::Polygon, col_.geometric_type)
233
+ assert_equal(false, col_.geographic?)
234
+ assert_equal(false, col_.has_z?)
235
+ assert_equal(true, col_.has_m?)
236
+ assert_equal(3785, col_.srid)
237
+ assert_equal({:has_m => true, :type => 'polygon', :srid => 3785}, col_.limit)
238
+ assert(klass_.cached_attributes.include?('region'))
239
+ klass_.connection.drop_table(:spatial_test)
240
+ assert_equal(0, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
241
+ end
242
+
243
+
244
+ def test_create_geometry_using_limit
245
+ klass_ = create_ar_class
246
+ klass_.connection.create_table(:spatial_test) do |t_|
247
+ t_.spatial 'region', :limit => {:has_m => true, :srid => 3785, :type => :polygon}
248
+ end
249
+ assert_equal(1, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
250
+ col_ = klass_.columns.last
251
+ assert_equal(::RGeo::Feature::Polygon, col_.geometric_type)
252
+ assert_equal(false, col_.geographic?)
253
+ assert_equal(false, col_.has_z)
254
+ assert_equal(true, col_.has_m)
255
+ assert_equal(3785, col_.srid)
256
+ assert_equal({:has_m => true, :type => 'polygon', :srid => 3785}, col_.limit)
257
+ assert(klass_.cached_attributes.include?('region'))
258
+ klass_.connection.drop_table(:spatial_test)
259
+ assert_equal(0, klass_.connection.select_value("SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'").to_i)
260
+ end
261
+
262
+
263
+ end
264
+
265
+ end
266
+
267
+ end
268
+ end
269
+ end
270
+ end