activerecord-postgis-adapter 2.2.2 → 3.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  module ActiveRecord
2
2
  module ConnectionAdapters
3
3
  module PostGISAdapter
4
- VERSION = '2.2.2'.freeze
4
+ VERSION = '3.0.0.beta1'.freeze
5
5
  end
6
6
  end
7
7
  end
data/test/basic_test.rb CHANGED
@@ -1,182 +1,152 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class BasicTest < ActiveSupport::TestCase # :nodoc:
4
- DATABASE_CONFIG_PATH = ::File.dirname(__FILE__)+'/database.yml'
5
- OVERRIDE_DATABASE_CONFIG_PATH = ::File.dirname(__FILE__)+'/database_local.yml'
6
-
7
- include RGeo::ActiveRecord::AdapterTestHelper
8
-
9
- define_test_methods do
10
-
11
- def populate_ar_class(content)
12
- klass = create_ar_class
13
- case content
14
- when :mercator_point
15
- klass.connection.create_table(:spatial_test) do |t_|
16
- t_.column 'latlon', :point, :srid => 3785
17
- end
18
- when :latlon_point_geographic
19
- klass.connection.create_table(:spatial_test) do |t_|
20
- t_.column 'latlon', :point, :srid => 4326, :geographic => true
21
- end
22
- when :no_constraints
23
- klass.connection.create_table(:spatial_test) do |t_|
24
- t_.column 'geo', :geometry, :no_constraints => true
25
- end
26
- end
27
- klass
28
- end
29
4
 
30
- def test_version
31
- refute_nil ::ActiveRecord::ConnectionAdapters::PostGISAdapter::VERSION
32
- end
5
+ def test_version
6
+ refute_nil ActiveRecord::ConnectionAdapters::PostGISAdapter::VERSION
7
+ end
33
8
 
34
- def test_postgis_available
35
- connection = create_ar_class.connection
36
- assert_equal 'PostGIS', connection.adapter_name
37
- refute_nil connection.postgis_lib_version
38
- end
9
+ def test_postgis_available
10
+ assert_equal 'PostGIS', SpatialModel.connection.adapter_name
11
+ assert SpatialModel.connection.postgis_lib_version.start_with? '2.'
12
+ end
39
13
 
40
- def test_set_and_get_point
41
- klass = populate_ar_class(:mercator_point)
42
- obj = klass.new
43
- assert_nil obj.latlon
44
- obj.latlon = @factory.point(1.0, 2.0)
45
- assert_equal @factory.point(1.0, 2.0), obj.latlon
46
- assert_equal 3785, obj.latlon.srid
47
- end
14
+ def test_arel_visitor
15
+ visitor = Arel::Visitors::PostGIS.new(SpatialModel.connection)
16
+ node = RGeo::ActiveRecord::SpatialConstantNode.new('POINT (1.0 2.0)')
17
+ collector = Arel::Collectors::PlainString.new
18
+ visitor.accept(node, collector)
19
+ assert_equal "ST_GeomFromEWKT('POINT (1.0 2.0)')", collector.value
20
+ end
48
21
 
49
- def test_set_and_get_point_from_wkt
50
- klass = populate_ar_class(:mercator_point)
51
- obj = klass.new
52
- assert_nil obj.latlon
53
- obj.latlon = 'POINT(1 2)'
54
- assert_equal @factory.point(1.0, 2.0), obj.latlon
55
- assert_equal 3785, obj.latlon.srid
56
- end
22
+ def test_set_and_get_point
23
+ create_model
24
+ obj = SpatialModel.new
25
+ assert_nil obj.latlon
26
+ obj.latlon = factory.point(1.0, 2.0)
27
+ assert_equal factory.point(1.0, 2.0), obj.latlon
28
+ assert_equal 3785, obj.latlon.srid
29
+ end
57
30
 
58
- def test_save_and_load_point
59
- klass = populate_ar_class(:mercator_point)
60
- obj = klass.new
61
- obj.latlon = @factory.point(1.0, 2.0)
62
- obj.save!
63
- id = obj.id
64
- obj2 = klass.find(id)
65
- assert_equal @factory.point(1.0, 2.0), obj2.latlon
66
- assert_equal 3785, obj2.latlon.srid
67
- assert_equal true, ::RGeo::Geos.is_geos?(obj2.latlon)
68
- end
31
+ def test_set_and_get_point_from_wkt
32
+ create_model
33
+ obj = SpatialModel.new
34
+ assert_nil obj.latlon
35
+ obj.latlon = 'POINT(1 2)'
36
+ assert_equal factory.point(1.0, 2.0), obj.latlon
37
+ assert_equal 3785, obj.latlon.srid
38
+ end
69
39
 
70
- def test_save_and_load_geographic_point
71
- klass = populate_ar_class(:latlon_point_geographic)
72
- obj = klass.new
73
- obj.latlon = @factory.point(1.0, 2.0)
74
- obj.save!
75
- id = obj.id
76
- obj2 = klass.find(id)
77
- assert_equal @geographic_factory.point(1.0, 2.0), obj2.latlon
78
- assert_equal 4326, obj2.latlon.srid
79
- assert_equal false, ::RGeo::Geos.is_geos?(obj2.latlon)
80
- end
40
+ def test_save_and_load_point
41
+ create_model
42
+ obj = SpatialModel.new
43
+ obj.latlon = factory.point(1.0, 2.0)
44
+ obj.save!
45
+ id = obj.id
46
+ obj2 = SpatialModel.find(id)
47
+ assert_equal factory.point(1.0, 2.0), obj2.latlon
48
+ assert_equal 3785, obj2.latlon.srid
49
+ # assert_equal true, RGeo::Geos.is_geos?(obj2.latlon)
50
+ end
81
51
 
82
- def test_save_and_load_point_from_wkt
83
- klass = populate_ar_class(:mercator_point)
84
- obj = klass.new
85
- obj.latlon = 'POINT(1 2)'
86
- obj.save!
87
- id = obj.id
88
- obj2 = klass.find(id)
89
- assert_equal @factory.point(1.0, 2.0), obj2.latlon
90
- assert_equal 3785, obj2.latlon.srid
91
- end
52
+ def test_save_and_load_geographic_point
53
+ create_model
54
+ obj = SpatialModel.new
55
+ obj.latlon_geo = geographic_factory.point(1.0, 2.0)
56
+ obj.save!
57
+ id = obj.id
58
+ obj2 = SpatialModel.find(id)
59
+ assert_equal geographic_factory.point(1.0, 2.0), obj2.latlon_geo
60
+ assert_equal 4326, obj2.latlon_geo.srid
61
+ # assert_equal false, RGeo::Geos.is_geos?(obj2.latlon_geo)
62
+ end
92
63
 
93
- def test_set_point_bad_wkt
94
- klass = populate_ar_class(:mercator_point)
95
- obj = klass.create(:latlon => 'POINT (x)')
96
- assert_nil obj.latlon
97
- end
64
+ def test_save_and_load_point_from_wkt
65
+ create_model
66
+ obj = SpatialModel.new
67
+ obj.latlon = 'POINT(1 2)'
68
+ obj.save!
69
+ id = obj.id
70
+ obj2 = SpatialModel.find(id)
71
+ assert_equal factory.point(1.0, 2.0), obj2.latlon
72
+ assert_equal 3785, obj2.latlon.srid
73
+ end
98
74
 
99
- def test_set_point_wkt_wrong_type
100
- klass = populate_ar_class(:mercator_point)
101
- assert_raises(::ActiveRecord::StatementInvalid) do
102
- klass.create(:latlon => 'LINESTRING(1 2, 3 4, 5 6)')
103
- end
104
- end
75
+ def test_set_point_bad_wkt
76
+ create_model
77
+ obj = SpatialModel.create(latlon: 'POINT (x)')
78
+ assert_nil obj.latlon
79
+ end
105
80
 
106
- def test_custom_factory
107
- klass = create_ar_class
108
- klass.connection.create_table(:spatial_test) do |t|
109
- t.point(:latlon, :srid => 4326)
110
- end
111
- factory = ::RGeo::Geographic.simple_mercator_factory
112
- klass.class_eval do
113
- set_rgeo_factory_for_column(:latlon, factory)
114
- end
115
- rec_ = klass.new
116
- rec_.latlon = 'POINT(-122 47)'
117
- assert_equal factory, rec_.latlon.factory
118
- rec_.save!
119
- assert_equal factory, rec_.latlon.factory
120
- rec2_ = klass.find(rec_.id)
121
- assert_equal factory, rec2_.latlon.factory
81
+ def test_set_point_wkt_wrong_type
82
+ create_model
83
+ assert_raises(ActiveRecord::StatementInvalid) do
84
+ SpatialModel.create(latlon: 'LINESTRING(1 2, 3 4, 5 6)')
122
85
  end
86
+ end
123
87
 
124
- def test_readme_example
125
- klass = create_ar_class
126
- klass.connection.create_table(:spatial_test) do |t_|
127
- t_.column(:shape, :geometry)
128
- t_.line_string(:path, :srid => 3785)
129
- t_.point(:latlon, :geographic => true)
130
- end
131
- klass.connection.change_table(:spatial_test) do |t_|
132
- t_.index(:latlon, :spatial => true)
133
- end
134
- klass.class_eval do
135
- self.rgeo_factory_generator = ::RGeo::Geos.method(:factory)
136
- set_rgeo_factory_for_column(:latlon, ::RGeo::Geographic.spherical_factory)
137
- end
138
- rec_ = klass.new
139
- rec_.latlon = 'POINT(-122 47)'
140
- loc_ = rec_.latlon
141
- assert_equal 47, loc_.latitude
142
- rec_.shape = loc_
143
- assert_equal true, ::RGeo::Geos.is_geos?(rec_.shape)
88
+ def test_custom_factory
89
+ klass = SpatialModel
90
+ klass.connection.create_table(:spatial_test, force: true) do |t|
91
+ t.st_point(:latlon, srid: 4326)
144
92
  end
145
-
146
- # no_constraints no longer supported in PostGIS 2.0
147
- def _test_save_and_load_no_constraints
148
- klass = populate_ar_class(:no_constraints)
149
- factory1_ = ::RGeo::Cartesian.preferred_factory(:srid => 3785)
150
- factory2_ = ::RGeo::Cartesian.preferred_factory(:srid => 2000)
151
- obj = klass.new
152
- obj.geo = factory1_.point(1.0, 2.0)
153
- obj.save!
154
- id = obj.id
155
- obj2 = klass.find(id)
156
- assert_equal factory1_.point(1.0, 2.0), obj2.geo
157
- assert_equal 3785, obj2.geo.srid
158
- obj2.geo = factory2_.point(3.0, 4.0)
159
- obj2.save!
160
- obj3 = klass.find(id)
161
- assert_equal factory2_.point(3.0, 4.0), obj3.geo
162
- assert_equal 2000, obj3.geo.srid
93
+ factory = RGeo::Geographic.simple_mercator_factory
94
+ klass.class_eval do
95
+ set_rgeo_factory_for_column(:latlon, factory)
163
96
  end
97
+ assert_equal factory, klass.rgeo_factory_for_column(:latlon)
98
+ object = klass.new
99
+ assert_equal factory, object.class.rgeo_factory_for_column(:latlon)
100
+ end
164
101
 
165
- def test_point_to_json
166
- klass = populate_ar_class(:mercator_point)
167
- obj = klass.new
168
- assert_match(/"latlon":null/, obj.to_json)
169
- obj.latlon = @factory.point(1.0, 2.0)
170
- assert_match(/"latlon":"POINT\s\(1\.0\s2\.0\)"/, obj.to_json)
102
+ def test_readme_example
103
+ klass = SpatialModel
104
+ klass.connection.create_table(:spatial_models, force: true) do |t|
105
+ t.column(:shape, :geometry)
106
+ t.line_string(:path, srid: 3785)
107
+ t.st_point(:latlon, geographic: true)
171
108
  end
172
-
173
- def test_custom_column
174
- klass = populate_ar_class(:mercator_point)
175
- rec = klass.new
176
- rec.latlon = 'POINT(0 0)'
177
- rec.save
178
- refute_nil klass.select("CURRENT_TIMESTAMP as ts").first.ts
109
+ klass.reset_column_information
110
+ assert_includes klass.columns.map(&:name), "shape"
111
+ klass.connection.change_table(:spatial_models) do |t|
112
+ t.index(:latlon, using: :gist)
113
+ end
114
+ klass.class_eval do
115
+ self.rgeo_factory_generator = RGeo::Geos.method(:factory)
116
+ set_rgeo_factory_for_column(:latlon, RGeo::Geographic.spherical_factory)
179
117
  end
118
+ object = klass.new
119
+ object.latlon = 'POINT(-122 47)'
120
+ point = object.latlon
121
+ assert_equal 47, point.latitude
122
+ object.shape = point
123
+ # assert_equal true, RGeo::Geos.is_geos?(object.shape)
124
+ end
125
+
126
+ def test_point_to_json
127
+ create_model
128
+ obj = SpatialModel.new
129
+ assert_match(/"latlon":null/, obj.to_json)
130
+ obj.latlon = factory.point(1.0, 2.0)
131
+ assert_match(/"latlon":"POINT\s\(1\.0\s2\.0\)"/, obj.to_json)
132
+ end
133
+
134
+ def test_custom_column
135
+ create_model
136
+ rec = SpatialModel.new
137
+ rec.latlon = 'POINT(0 0)'
138
+ rec.save
139
+ refute_nil SpatialModel.select("CURRENT_TIMESTAMP as ts").first.ts
140
+ end
141
+
142
+ private
180
143
 
144
+ def create_model
145
+ SpatialModel.connection.create_table(:spatial_models, force: true) do |t|
146
+ t.column 'latlon', :st_point, srid: 3785
147
+ t.column 'latlon_geo', :st_point, srid: 4326, geographic: true
148
+ end
149
+ SpatialModel.reset_column_information
181
150
  end
182
151
  end
152
+
data/test/ddl_test.rb CHANGED
@@ -1,303 +1,287 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class DDLTest < ActiveSupport::TestCase # :nodoc:
4
- DATABASE_CONFIG_PATH = ::File.dirname(__FILE__) + '/database.yml'
5
- OVERRIDE_DATABASE_CONFIG_PATH = ::File.dirname(__FILE__) + '/database_local.yml'
4
+ def test_spatial_column_options
5
+ [
6
+ :geography,
7
+ :geometry,
8
+ :geometry_collection,
9
+ :line_string,
10
+ :multi_line_string,
11
+ :multi_point,
12
+ :multi_polygon,
13
+ :st_point,
14
+ :st_polygon,
15
+ ].each do |type|
16
+ assert ActiveRecord::ConnectionAdapters::PostGISAdapter::MainAdapter.spatial_column_options(type), type
17
+ end
18
+ end
6
19
 
7
- include RGeo::ActiveRecord::AdapterTestHelper
20
+ def test_type_to_sql
21
+ adapter = SpatialModel.connection
22
+ assert_equal "geometry(point,4326)", adapter.type_to_sql(:geometry, "point,4326")
23
+ end
8
24
 
9
- define_test_methods do
10
- def test_create_simple_geometry
11
- klass = create_ar_class
12
- klass.connection.create_table(:spatial_test) do |t|
13
- t.column 'latlon', :geometry
14
- end
15
- assert_equal(1, klass.connection.select_value(geometry_column_count_query).to_i)
16
- col = klass.columns.last
17
- assert_equal(::RGeo::Feature::Geometry, col.geometric_type)
18
- assert_equal(true, col.has_spatial_constraints?)
19
- assert_equal(false, col.geographic?)
20
- assert_equal(0, col.srid)
21
- assert(klass.cached_attributes.include?('latlon'))
22
- klass.connection.drop_table(:spatial_test)
23
- assert_equal(0, klass.connection.select_value(geometry_column_count_query).to_i)
25
+ def test_create_simple_geometry
26
+ klass.connection.create_table(:spatial_models, force: true) do |t|
27
+ t.column 'latlon', :geometry
24
28
  end
29
+ klass.reset_column_information
30
+ assert_equal 1, count_geometry_columns
31
+ col = klass.columns.last
32
+ assert_equal RGeo::Feature::Geometry, col.geometric_type
33
+ assert_equal true, col.has_spatial_constraints?
34
+ assert_equal false, col.geographic?
35
+ assert_equal 0, col.srid
36
+ klass.connection.drop_table(:spatial_models)
37
+ assert_equal 0, count_geometry_columns
38
+ end
25
39
 
26
- def test_create_simple_geography
27
- klass = create_ar_class
28
- klass.connection.create_table(:spatial_test) do |t|
29
- t.column 'latlon', :geometry, :geographic => true
30
- end
31
- col = klass.columns.last
32
- assert_equal(::RGeo::Feature::Geometry, col.geometric_type)
33
- assert_equal(true, col.has_spatial_constraints?)
34
- assert_equal(true, col.geographic?)
35
- assert_equal(4326, col.srid)
36
- assert(klass.cached_attributes.include?('latlon'))
37
- assert_equal(0, klass.connection.select_value(geometry_column_count_query).to_i)
40
+ def test_create_simple_geography
41
+ klass.connection.create_table(:spatial_models, force: true) do |t|
42
+ t.column 'latlon', :geometry, geographic: true
38
43
  end
44
+ klass.reset_column_information
45
+ col = klass.columns.last
46
+ assert_equal RGeo::Feature::Geometry, col.geometric_type
47
+ assert_equal true, col.has_spatial_constraints?
48
+ assert_equal true, col.geographic?
49
+ assert_equal 4326, col.srid
50
+ assert_equal 0, count_geometry_columns
51
+ end
39
52
 
40
- def test_create_point_geometry
41
- klass = create_ar_class
42
- klass.connection.create_table(:spatial_test) do |t|
43
- t.column 'latlon', :point
44
- end
45
- assert_equal(::RGeo::Feature::Point, klass.columns.last.geometric_type)
46
- assert(klass.cached_attributes.include?('latlon'))
53
+ def test_create_point_geometry
54
+ klass.connection.create_table(:spatial_models, force: true) do |t|
55
+ t.column 'latlon', :st_point
47
56
  end
57
+ klass.reset_column_information
58
+ assert_equal RGeo::Feature::Point, klass.columns.last.geometric_type
59
+ end
48
60
 
49
- def test_create_geometry_with_index
50
- klass = create_ar_class
51
- klass.connection.create_table(:spatial_test) do |t|
52
- t.column 'latlon', :geometry
53
- end
54
- klass.connection.change_table(:spatial_test) do |t|
55
- t.index([:latlon], :spatial => true)
56
- end
57
- assert(klass.connection.indexes(:spatial_test).last.spatial)
61
+ def test_create_geometry_with_index
62
+ klass.connection.create_table(:spatial_models, force: true) do |t|
63
+ t.column 'latlon', :geometry
58
64
  end
59
-
60
- def test_add_geometry_column
61
- klass = create_ar_class
62
- klass.connection.create_table(:spatial_test) do |t|
63
- t.column('latlon', :geometry)
64
- end
65
- klass.connection.change_table(:spatial_test) do |t|
66
- t.column('geom2', :point, :srid => 4326)
67
- t.column('name', :string)
68
- end
69
- assert_equal(2, klass.connection.select_value(geometry_column_count_query).to_i)
70
- cols_ = klass.columns
71
- assert_equal(::RGeo::Feature::Geometry, cols_[-3].geometric_type)
72
- assert_equal(0, cols_[-3].srid)
73
- assert_equal(true, cols_[-3].has_spatial_constraints?)
74
- assert_equal(::RGeo::Feature::Point, cols_[-2].geometric_type)
75
- assert_equal(4326, cols_[-2].srid)
76
- assert_equal(false, cols_[-2].geographic?)
77
- assert_equal(true, cols_[-2].has_spatial_constraints?)
78
- assert_nil(cols_[-1].geometric_type)
79
- assert_equal(false, cols_[-1].has_spatial_constraints?)
65
+ klass.connection.change_table(:spatial_models) do |t|
66
+ t.index([:latlon], using: :gist)
80
67
  end
68
+ klass.reset_column_information
69
+ assert_equal :gist, klass.connection.indexes(:spatial_models).last.using
70
+ end
81
71
 
82
- def test_add_geometry_column_null_false
83
- klass = create_ar_class
84
- klass.connection.create_table(:spatial_test) do |t|
85
- t.column('latlon_null', :geometry, null: false)
86
- t.column('latlon', :geometry)
87
- end
88
- null_false_column = klass.columns[1]
89
- null_true_column = klass.columns[2]
90
-
91
- refute(null_false_column.null, 'Column should be null: false')
92
- assert(null_true_column.null, 'Column should be null: true')
72
+ def test_add_geometry_column
73
+ klass.connection.create_table(:spatial_models, force: true) do |t|
74
+ t.column('latlon', :geometry)
93
75
  end
94
-
95
- def test_add_geography_column
96
- klass = create_ar_class
97
- klass.connection.create_table(:spatial_test) do |t|
98
- t.column('latlon', :geometry)
99
- end
100
- klass.connection.change_table(:spatial_test) do |t|
101
- t.column('geom2', :point, :srid => 4326, :geographic => true)
102
- t.column('name', :string)
103
- end
104
- assert_equal(1, klass.connection.select_value(geometry_column_count_query).to_i)
105
- cols_ = klass.columns
106
- assert_equal(::RGeo::Feature::Geometry, cols_[-3].geometric_type)
107
- assert_equal(0, cols_[-3].srid)
108
- assert_equal(true, cols_[-3].has_spatial_constraints?)
109
- assert_equal(::RGeo::Feature::Point, cols_[-2].geometric_type)
110
- assert_equal(4326, cols_[-2].srid)
111
- assert_equal(true, cols_[-2].geographic?)
112
- assert_equal(true, cols_[-2].has_spatial_constraints?)
113
- assert_nil(cols_[-1].geometric_type)
114
- assert_equal(false, cols_[-1].has_spatial_constraints?)
76
+ klass.connection.change_table(:spatial_models) do |t|
77
+ t.column('geom2', :st_point, srid: 4326)
78
+ t.column('name', :string)
115
79
  end
80
+ klass.reset_column_information
81
+ assert_equal 2, count_geometry_columns
82
+ columns = klass.columns
83
+ assert_equal RGeo::Feature::Geometry, columns[-3].geometric_type
84
+ assert_equal 0, columns[-3].srid
85
+ assert_equal true, columns[-3].has_spatial_constraints?
86
+ assert_equal RGeo::Feature::Point, columns[-2].geometric_type
87
+ assert_equal 4326, columns[-2].srid
88
+ assert_equal false, columns[-2].geographic?
89
+ assert_equal true, columns[-2].has_spatial_constraints?
90
+ assert_nil columns[-1].geometric_type
91
+ assert_equal false, columns[-1].has_spatial_constraints?
92
+ end
116
93
 
117
- def test_drop_geometry_column
118
- klass = create_ar_class
119
- klass.connection.create_table(:spatial_test) do |t|
120
- t.column('latlon', :geometry)
121
- t.column('geom2', :point, :srid => 4326)
122
- end
123
- klass.connection.change_table(:spatial_test) do |t|
124
- t.remove('geom2')
125
- end
126
- assert_equal(1, klass.connection.select_value(geometry_column_count_query).to_i)
127
- cols_ = klass.columns
128
- assert_equal(::RGeo::Feature::Geometry, cols_[-1].geometric_type)
129
- assert_equal('latlon', cols_[-1].name)
130
- assert_equal(0, cols_[-1].srid)
131
- assert_equal(false, cols_[-1].geographic?)
94
+ def test_add_geometry_column_null_false
95
+ klass.connection.create_table(:spatial_models, force: true) do |t|
96
+ t.column('latlon_null', :geometry, null: false)
97
+ t.column('latlon', :geometry)
132
98
  end
99
+ klass.reset_column_information
100
+ null_false_column = klass.columns[1]
101
+ null_true_column = klass.columns[2]
102
+
103
+ refute null_false_column.null, 'Column should be null: false'
104
+ assert null_true_column.null, 'Column should be null: true'
105
+ end
133
106
 
134
- def test_drop_geography_column
135
- klass = create_ar_class
136
- klass.connection.create_table(:spatial_test) do |t|
137
- t.column('latlon', :geometry)
138
- t.column('geom2', :point, :srid => 4326, :geographic => true)
139
- t.column('geom3', :point, :srid => 4326)
140
- end
141
- klass.connection.change_table(:spatial_test) do |t|
142
- t.remove('geom2')
143
- end
144
- assert_equal(2, klass.connection.select_value(geometry_column_count_query).to_i)
145
- cols_ = klass.columns
146
- assert_equal(::RGeo::Feature::Point, cols_[-1].geometric_type)
147
- assert_equal('geom3', cols_[-1].name)
148
- assert_equal(false, cols_[-1].geographic?)
149
- assert_equal(::RGeo::Feature::Geometry, cols_[-2].geometric_type)
150
- assert_equal('latlon', cols_[-2].name)
151
- assert_equal(false, cols_[-2].geographic?)
107
+ def test_add_geography_column
108
+ klass.connection.create_table(:spatial_models, force: true) do |t|
109
+ t.column('latlon', :geometry)
152
110
  end
111
+ klass.connection.change_table(:spatial_models) do |t|
112
+ t.column('geom2', :st_point, srid: 4326, geographic: true)
113
+ t.column('name', :string)
114
+ end
115
+ klass.reset_column_information
116
+ assert_equal 1, count_geometry_columns
117
+ cols_ = klass.columns
118
+ assert_equal RGeo::Feature::Geometry, cols_[-3].geometric_type
119
+ assert_equal 0, cols_[-3].srid
120
+ assert_equal true, cols_[-3].has_spatial_constraints?
121
+ assert_equal RGeo::Feature::Point, cols_[-2].geometric_type
122
+ assert_equal 4326, cols_[-2].srid
123
+ assert_equal true, cols_[-2].geographic?
124
+ assert_equal true, cols_[-2].has_spatial_constraints?
125
+ assert_nil cols_[-1].geometric_type
126
+ assert_equal false, cols_[-1].has_spatial_constraints?
127
+ end
153
128
 
154
- def test_create_simple_geometry_using_shortcut
155
- klass = create_ar_class
156
- klass.connection.create_table(:spatial_test) do |t|
157
- t.geometry 'latlon'
158
- end
159
- assert_equal(1, klass.connection.select_value(geometry_column_count_query).to_i)
160
- col = klass.columns.last
161
- assert_equal(::RGeo::Feature::Geometry, col.geometric_type)
162
- assert_equal(false, col.geographic?)
163
- assert_equal(0, col.srid)
164
- assert(klass.cached_attributes.include?('latlon'))
165
- klass.connection.drop_table(:spatial_test)
166
- assert_equal(0, klass.connection.select_value(geometry_column_count_query).to_i)
129
+ def test_drop_geometry_column
130
+ klass.connection.create_table(:spatial_models, force: true) do |t|
131
+ t.column('latlon', :geometry)
132
+ t.column('geom2', :st_point, srid: 4326)
167
133
  end
134
+ klass.connection.change_table(:spatial_models) do |t|
135
+ t.remove('geom2')
136
+ end
137
+ klass.reset_column_information
138
+ assert_equal 1, count_geometry_columns
139
+ cols_ = klass.columns
140
+ assert_equal RGeo::Feature::Geometry, cols_[-1].geometric_type
141
+ assert_equal 'latlon', cols_[-1].name
142
+ assert_equal 0, cols_[-1].srid
143
+ assert_equal false, cols_[-1].geographic?
144
+ end
168
145
 
169
- def test_create_simple_geography_using_shortcut
170
- klass = create_ar_class
171
- klass.connection.create_table(:spatial_test) do |t|
172
- t.geometry 'latlon', :geographic => true
173
- end
174
- col = klass.columns.last
175
- assert_equal(::RGeo::Feature::Geometry, col.geometric_type)
176
- assert_equal(true, col.geographic?)
177
- assert_equal(4326, col.srid)
178
- assert(klass.cached_attributes.include?('latlon'))
179
- assert_equal(0, klass.connection.select_value(geometry_column_count_query).to_i)
146
+ def test_drop_geography_column
147
+ klass.connection.create_table(:spatial_models, force: true) do |t|
148
+ t.column('latlon', :geometry)
149
+ t.column('geom2', :st_point, srid: 4326, geographic: true)
150
+ t.column('geom3', :st_point, srid: 4326)
180
151
  end
152
+ klass.connection.change_table(:spatial_models) do |t|
153
+ t.remove('geom2')
154
+ end
155
+ klass.reset_column_information
156
+ assert_equal 2, count_geometry_columns
157
+ columns = klass.columns
158
+ assert_equal RGeo::Feature::Point, columns[-1].geometric_type
159
+ assert_equal 'geom3', columns[-1].name
160
+ assert_equal false, columns[-1].geographic?
161
+ assert_equal RGeo::Feature::Geometry, columns[-2].geometric_type
162
+ assert_equal 'latlon', columns[-2].name
163
+ assert_equal false, columns[-2].geographic?
164
+ end
181
165
 
182
- def test_create_point_geometry_using_shortcut
183
- klass = create_ar_class
184
- klass.connection.create_table(:spatial_test) do |t|
185
- t.point 'latlon'
186
- end
187
- assert_equal(::RGeo::Feature::Point, klass.columns.last.geometric_type)
188
- assert(klass.cached_attributes.include?('latlon'))
166
+ def test_create_simple_geometry_using_shortcut
167
+ klass.connection.create_table(:spatial_models, force: true) do |t|
168
+ t.geometry 'latlon'
189
169
  end
170
+ klass.reset_column_information
171
+ assert_equal 1, count_geometry_columns
172
+ col = klass.columns.last
173
+ assert_equal RGeo::Feature::Geometry, col.geometric_type
174
+ assert_equal false, col.geographic?
175
+ assert_equal 0, col.srid
176
+ klass.connection.drop_table(:spatial_models)
177
+ assert_equal 0, count_geometry_columns
178
+ end
190
179
 
191
- def test_create_geometry_with_options
192
- klass = create_ar_class
193
- klass.connection.create_table(:spatial_test) do |t|
194
- t.column 'region', :polygon, :has_m => true, :srid => 3785
195
- end
196
- assert_equal(1, klass.connection.select_value(geometry_column_count_query).to_i)
197
- col = klass.columns.last
198
- assert_equal(::RGeo::Feature::Polygon, col.geometric_type)
199
- assert_equal(false, col.geographic?)
200
- assert_equal(false, col.has_z?)
201
- assert_equal(true, col.has_m?)
202
- assert_equal(3785, col.srid)
203
- assert_equal({:has_m => true, :type => 'polygon', :srid => 3785}, col.limit)
204
- assert(klass.cached_attributes.include?('region'))
205
- klass.connection.drop_table(:spatial_test)
206
- assert_equal(0, klass.connection.select_value(geometry_column_count_query).to_i)
180
+ def test_create_simple_geography_using_shortcut
181
+ klass.connection.create_table(:spatial_models, force: true) do |t|
182
+ t.geometry 'latlon', geographic: true
207
183
  end
184
+ klass.reset_column_information
185
+ col = klass.columns.last
186
+ assert_equal RGeo::Feature::Geometry, col.geometric_type
187
+ assert_equal true, col.geographic?
188
+ assert_equal 4326, col.srid
189
+ assert_equal 0, count_geometry_columns
190
+ end
208
191
 
209
- def test_create_geometry_using_limit
210
- klass = create_ar_class
211
- klass.connection.create_table(:spatial_test) do |t|
212
- t.spatial 'region', :limit => {:has_m => true, :srid => 3785, :type => :polygon}
213
- end
214
- assert_equal(1, klass.connection.select_value(geometry_column_count_query).to_i)
215
- col = klass.columns.last
216
- assert_equal(::RGeo::Feature::Polygon, col.geometric_type)
217
- assert_equal(false, col.geographic?)
218
- assert_equal(false, col.has_z)
219
- assert_equal(true, col.has_m)
220
- assert_equal(3785, col.srid)
221
- assert_equal({:has_m => true, :type => 'polygon', :srid => 3785}, col.limit)
222
- assert(klass.cached_attributes.include?('region'))
223
- klass.connection.drop_table(:spatial_test)
224
- assert_equal(0, klass.connection.select_value(geometry_column_count_query).to_i)
192
+ def test_create_point_geometry_using_shortcut
193
+ klass.connection.create_table(:spatial_models, force: true) do |t|
194
+ t.st_point 'latlon'
225
195
  end
196
+ klass.reset_column_information
197
+ assert_equal RGeo::Feature::Point, klass.columns.last.geometric_type
198
+ end
226
199
 
227
- def test_caches_spatial_column_info
228
- klass = create_ar_class
229
- klass.connection.create_table(:spatial_test, force: true) do |t|
230
- t.point 'latlon'
231
- t.point 'other'
232
- end
233
- ::ActiveRecord::ConnectionAdapters::PostGISAdapter::SpatialColumnInfo.any_instance.expects(:all).once.returns({})
234
- klass.columns
235
- klass.columns
200
+ def test_create_geometry_with_options
201
+ klass.connection.create_table(:spatial_models, force: true) do |t|
202
+ t.column 'region', :st_polygon, has_m: true, srid: 3785
236
203
  end
204
+ klass.reset_column_information
205
+ assert_equal 1, count_geometry_columns
206
+ col = klass.columns.last
207
+ assert_equal RGeo::Feature::Polygon, col.geometric_type
208
+ assert_equal false, col.geographic?
209
+ assert_equal false, col.has_z?
210
+ assert_equal true, col.has_m?
211
+ assert_equal 3785, col.srid
212
+ assert_equal({ has_m: true, type: 'polygon', srid: 3785 }, col.limit)
213
+ klass.connection.drop_table(:spatial_models)
214
+ assert_equal 0, count_geometry_columns
215
+ end
237
216
 
238
- def test_no_query_spatial_column_info
239
- klass = create_ar_class
240
- klass.connection.create_table(:spatial_test, force: true) do |t|
241
- t.string 'name'
242
- end
243
- # `all` queries column info from the database - it should not be called when klass.columns is called
244
- ::ActiveRecord::ConnectionAdapters::PostGISAdapter::SpatialColumnInfo.any_instance.expects(:all).never
245
- # first column is id, second is name
246
- refute klass.columns[1].spatial?
247
- assert_nil klass.columns[1].has_z
217
+ def test_no_query_spatial_column_info
218
+ klass.connection.create_table(:spatial_models, force: true) do |t|
219
+ t.string 'name'
248
220
  end
221
+ klass.reset_column_information
222
+ # `all` queries column info from the database - it should not be called when klass.columns is called
223
+ ActiveRecord::ConnectionAdapters::PostGISAdapter::SpatialColumnInfo.any_instance.expects(:all).never
224
+ # first column is id, second is name
225
+ refute klass.columns[1].spatial?
226
+ assert_nil klass.columns[1].has_z
227
+ end
249
228
 
250
- # Ensure that null contraints info is getting captured like the
251
- # normal adapter.
252
- def test_null_constraints
253
- klass_ = create_ar_class
254
- klass_.connection.create_table(:spatial_test) do |t_|
255
- t_.column 'nulls_allowed', :string, :null => true
256
- t_.column 'nulls_disallowed', :string, :null => false
257
- end
258
- assert_equal(true, klass_.columns[-2].null)
259
- assert_equal(false, klass_.columns[-1].null)
229
+ # Ensure that null contraints info is getting captured like the
230
+ # normal adapter.
231
+ def test_null_constraints
232
+ klass.connection.create_table(:spatial_models, force: true) do |t|
233
+ t.column 'nulls_allowed', :string, null: true
234
+ t.column 'nulls_disallowed', :string, null: false
260
235
  end
236
+ klass.reset_column_information
237
+ assert_equal true, klass.columns[-2].null
238
+ assert_equal false, klass.columns[-1].null
239
+ end
261
240
 
262
- # Ensure that default value info is getting captured like the
263
- # normal adapter.
264
- def test_column_defaults
265
- klass_ = create_ar_class
266
- klass_.connection.create_table(:spatial_test) do |t_|
267
- t_.column 'sample_integer_neg_default', :integer, :default => -1
268
- end
269
- assert_equal(-1, klass_.columns.last.default)
241
+ # Ensure column default value works like the Postgres adapter.
242
+ def test_column_defaults
243
+ klass.connection.create_table(:spatial_models, force: true) do |t|
244
+ t.column 'sample_integer', :integer, default: -1
270
245
  end
246
+ klass.reset_column_information
247
+ assert_equal "-1", klass.columns.last.default
248
+ assert_equal -1, klass.new.sample_integer
249
+ end
271
250
 
272
- # Ensure that column type info is getting captured like the
273
- # normal adapter.
274
- def test_column_types
275
- klass_ = create_ar_class
276
- klass_.connection.create_table(:spatial_test) do |t_|
277
- t_.column 'sample_integer', :integer
278
- t_.column 'sample_string', :string
279
- t_.column 'latlon', :point
280
- end
281
- assert_equal(:integer, klass_.columns[-3].type)
282
- assert_equal(:string, klass_.columns[-2].type)
283
- assert_equal(:spatial, klass_.columns[-1].type)
251
+ def test_column_types
252
+ klass.connection.create_table(:spatial_models, force: true) do |t|
253
+ t.column 'sample_integer', :integer
254
+ t.column 'sample_string', :string
255
+ t.column 'latlon', :st_point
284
256
  end
257
+ klass.reset_column_information
258
+ assert_equal :integer, klass.columns[-3].type
259
+ assert_equal :string, klass.columns[-2].type
260
+ assert_equal :geometry, klass.columns[-1].type
261
+ end
285
262
 
286
- def test_array_columns
287
- klass_ = create_ar_class
288
- klass_.connection.create_table(:spatial_test) do |t_|
289
- t_.column 'sample_array', :string, :array => true
290
- t_.column 'sample_non_array', :string
291
- end
292
- assert_equal(true, klass_.columns[-2].array)
293
- assert_equal(false, klass_.columns[-1].array)
263
+ def test_array_columns
264
+ klass.connection.create_table(:spatial_models, force: true) do |t|
265
+ t.column 'sample_array', :string, array: true
266
+ t.column 'sample_non_array', :string
294
267
  end
268
+ klass.reset_column_information
269
+ assert_equal true, klass.columns[-2].array
270
+ assert_equal false, klass.columns[-1].array
271
+ end
295
272
 
296
- private
273
+ private
297
274
 
298
- def geometry_column_count_query
299
- "SELECT COUNT(*) FROM geometry_columns WHERE f_table_name='spatial_test'"
300
- end
275
+ def klass
276
+ SpatialModel
277
+ end
278
+
279
+ def count_geometry_columns
280
+ klass.connection.select_value(geo_column_sql("geometry_columns", klass.table_name)).to_i
281
+ end
282
+
283
+ def geo_column_sql(postgis_view, table_name)
284
+ "SELECT COUNT(*) FROM #{ postgis_view } WHERE f_table_name='#{ table_name }'"
301
285
  end
302
286
 
303
287
  end