spatial_adapter 0.3.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +20 -1
- data/VERSION +1 -1
- data/lib/spatial_adapter/{raw_geom_info.rb → common/raw_geom_info.rb} +0 -0
- data/lib/spatial_adapter/{schema_definitions.rb → common/schema_definitions.rb} +0 -0
- data/lib/spatial_adapter/{schema_dumper.rb → common/schema_dumper.rb} +0 -0
- data/lib/spatial_adapter/{spatial_column.rb → common/spatial_column.rb} +0 -0
- data/lib/spatial_adapter/{table_definition.rb → common/table_definition.rb} +0 -0
- data/lib/spatial_adapter/{adapters/mysql.rb → mysql.rb} +1 -0
- data/lib/spatial_adapter/{adapters/postgis.rb → postgresql.rb} +29 -23
- data/lib/spatial_adapter.rb +17 -8
- data/rails/init.rb +16 -1
- data/spec/mysql/connection_adapter_spec.rb +1 -0
- data/spec/mysql/migration_spec.rb +1 -0
- data/spec/mysql/models_spec.rb +1 -0
- data/spec/mysql/schema_dumper_spec.rb +1 -0
- data/spec/{postgis → postgresql}/connection_adapter_spec.rb +25 -3
- data/spec/{postgis → postgresql}/migration_spec.rb +1 -0
- data/spec/{postgis → postgresql}/models_spec.rb +1 -0
- data/spec/{postgis → postgresql}/schema_dumper_spec.rb +1 -0
- data/spec/spec_helper.rb +2 -1
- metadata +39 -24
data/README.rdoc
CHANGED
@@ -28,7 +28,7 @@ dependencies as well.
|
|
28
28
|
|
29
29
|
gem install spatial_adapter
|
30
30
|
|
31
|
-
In
|
31
|
+
In a Rails app, you can add a gem dependency in environment.rb:
|
32
32
|
|
33
33
|
config.gem "spatial_adapter"
|
34
34
|
|
@@ -40,6 +40,25 @@ script/plugin install git://github.com/fragility/spatial_adapter.git
|
|
40
40
|
|
41
41
|
You need to have Git installed first.
|
42
42
|
|
43
|
+
== Configuration
|
44
|
+
|
45
|
+
Choose the database type for which you would like to use spatial_adapter, and
|
46
|
+
load each with
|
47
|
+
|
48
|
+
require 'spatial_adapter/[database]'
|
49
|
+
|
50
|
+
where [database] should be replaced with one of the following:
|
51
|
+
|
52
|
+
- postgresql
|
53
|
+
- mysql
|
54
|
+
|
55
|
+
For example to use the PostgreSQL spatial adapter:
|
56
|
+
|
57
|
+
require 'spatial_adapter/postgresql'
|
58
|
+
|
59
|
+
In a Rails app, spatial_adapter will automatically load the adapter for the database
|
60
|
+
specified in your database.yml configuration.
|
61
|
+
|
43
62
|
== Operations
|
44
63
|
|
45
64
|
Geometric columns in your ActiveRecord models now appear just like any other
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
1.0.0
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'spatial_adapter'
|
1
2
|
require 'active_record/connection_adapters/postgresql_adapter'
|
2
3
|
|
3
4
|
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
@@ -145,28 +146,28 @@ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
|
145
146
|
end
|
146
147
|
|
147
148
|
# Returns the list of all indexes for a table.
|
149
|
+
#
|
148
150
|
# This is a full replacement for the ActiveRecord method and as a result
|
149
|
-
# has a higher probability of breaking in future releases
|
151
|
+
# has a higher probability of breaking in future releases.
|
150
152
|
def indexes(table_name, name = nil)
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
OR d.indkey[8]=a.attnum OR d.indkey[9]=a.attnum )
|
167
|
-
ORDER BY i.relname
|
153
|
+
schemas = schema_search_path.split(/,/).map { |p| quote(p) }.join(',')
|
154
|
+
|
155
|
+
# Changed from upstread: link to pg_am to grab the index type (e.g. "gist")
|
156
|
+
result = query(<<-SQL, name)
|
157
|
+
SELECT distinct i.relname, d.indisunique, d.indkey, t.oid, am.amname
|
158
|
+
FROM pg_class t, pg_class i, pg_index d, pg_attribute a, pg_am am
|
159
|
+
WHERE i.relkind = 'i'
|
160
|
+
AND d.indexrelid = i.oid
|
161
|
+
AND d.indisprimary = 'f'
|
162
|
+
AND t.oid = d.indrelid
|
163
|
+
AND t.relname = '#{table_name}'
|
164
|
+
AND i.relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname IN (#{schemas}) )
|
165
|
+
AND i.relam = am.oid
|
166
|
+
AND a.attrelid = t.oid
|
167
|
+
ORDER BY i.relname
|
168
168
|
SQL
|
169
169
|
|
170
|
+
|
170
171
|
indexes = []
|
171
172
|
|
172
173
|
indexes = result.map do |row|
|
@@ -174,16 +175,21 @@ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
|
174
175
|
unique = row[1] == 't'
|
175
176
|
indkey = row[2].split(" ")
|
176
177
|
oid = row[3]
|
177
|
-
|
178
|
+
indtype = row[4]
|
178
179
|
|
179
|
-
|
180
|
-
|
181
|
-
|
180
|
+
# Changed from upstream: need to get the column types to test for spatial indexes
|
181
|
+
columns = query(<<-SQL, "Columns for index #{row[0]} on #{table_name}").inject({}) {|attlist, r| attlist[r[1]] = [r[0], r[2]]; attlist}
|
182
|
+
SELECT a.attname, a.attnum, t.typname
|
183
|
+
FROM pg_attribute a, pg_type t
|
182
184
|
WHERE a.attrelid = #{oid}
|
183
185
|
AND a.attnum IN (#{indkey.join(",")})
|
186
|
+
AND a.atttypid = t.oid
|
184
187
|
SQL
|
185
188
|
|
186
|
-
|
189
|
+
# Only GiST indexes on spatial columns denote a spatial index
|
190
|
+
spatial = indtype == 'gist' && columns.size == 1 && (columns.values.first[1] == 'geometry' || columns.values.first[1] == 'geography')
|
191
|
+
|
192
|
+
column_names = indkey.map {|attnum| columns[attnum] ? columns[attnum][0] : nil }
|
187
193
|
ActiveRecord::ConnectionAdapters::IndexDefinition.new(table_name, index_name, unique, column_names, spatial)
|
188
194
|
end
|
189
195
|
|
data/lib/spatial_adapter.rb
CHANGED
@@ -1,10 +1,21 @@
|
|
1
|
+
# This file should typically not be directly require'd into your project. You
|
2
|
+
# should require the database-specific adapter you desire, e.g.
|
3
|
+
#
|
4
|
+
# require 'spatial_adapter/postgresql'
|
5
|
+
#
|
6
|
+
# Why is this file here?
|
7
|
+
#
|
8
|
+
# Mostly to keep Rails happy when using config.gem to specify dependencies.
|
9
|
+
# The Rails init code (rails/init.rb) will then load the adapter that matches
|
10
|
+
# your database.yml configuration.
|
11
|
+
|
1
12
|
require 'geo_ruby'
|
2
13
|
require 'active_record'
|
3
14
|
|
4
15
|
include GeoRuby::SimpleFeatures
|
5
16
|
|
6
17
|
module SpatialAdapter
|
7
|
-
#Translation of geometric data types
|
18
|
+
# Translation of geometric data types
|
8
19
|
def geometry_data_types
|
9
20
|
{
|
10
21
|
:point => { :name => "POINT" },
|
@@ -19,10 +30,8 @@ module SpatialAdapter
|
|
19
30
|
end
|
20
31
|
end
|
21
32
|
|
22
|
-
require 'spatial_adapter/raw_geom_info'
|
23
|
-
require 'spatial_adapter/spatial_column'
|
24
|
-
require 'spatial_adapter/schema_definitions'
|
25
|
-
require 'spatial_adapter/schema_dumper'
|
26
|
-
require 'spatial_adapter/table_definition'
|
27
|
-
require 'spatial_adapter/adapters/postgis'
|
28
|
-
require 'spatial_adapter/adapters/mysql'
|
33
|
+
require 'spatial_adapter/common/raw_geom_info'
|
34
|
+
require 'spatial_adapter/common/spatial_column'
|
35
|
+
require 'spatial_adapter/common/schema_definitions'
|
36
|
+
require 'spatial_adapter/common/schema_dumper'
|
37
|
+
require 'spatial_adapter/common/table_definition'
|
data/rails/init.rb
CHANGED
@@ -1 +1,16 @@
|
|
1
|
-
|
1
|
+
# Rails initialization
|
2
|
+
#
|
3
|
+
# This will load the adapter for the currently used database configuration, if
|
4
|
+
# it exists.
|
5
|
+
|
6
|
+
module SpatialAdapter
|
7
|
+
class NotCompatibleError < ::StandardError
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
begin
|
12
|
+
adapter = ActiveRecord::Base.configurations[RAILS_ENV]['adapter']
|
13
|
+
require "spatial_adapter/#{adapter}"
|
14
|
+
rescue LoadError
|
15
|
+
raise SpatialAdapter::NotCompatibleError.new("spatial_adapter does not currently support the #{adapter} database.")
|
16
|
+
end
|
data/spec/mysql/models_spec.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
require 'spatial_adapter/postgresql'
|
2
4
|
require 'db/postgis_raw'
|
3
5
|
require 'models/common'
|
4
6
|
|
@@ -165,7 +167,7 @@ describe "Modified PostgreSQLAdapter" do
|
|
165
167
|
|
166
168
|
describe "#indexes" do
|
167
169
|
before :each do
|
168
|
-
@indexes = @connection.indexes('point_models'
|
170
|
+
@indexes = @connection.indexes('point_models')
|
169
171
|
end
|
170
172
|
|
171
173
|
it "should return an IndexDefinition for each index on the table" do
|
@@ -180,13 +182,33 @@ describe "Modified PostgreSQLAdapter" do
|
|
180
182
|
@indexes.select{|i| i.name == 'index_point_models_on_extra'}.first.columns.should == ['extra', 'more_extra']
|
181
183
|
end
|
182
184
|
|
183
|
-
it "should be marked as spatial if a
|
185
|
+
it "should be marked as spatial if a GiST index on a geometry column" do
|
184
186
|
@indexes.select{|i| i.name == 'index_point_models_on_geom'}.first.spatial.should == true
|
185
187
|
end
|
186
188
|
|
187
|
-
it "should
|
189
|
+
it "should be marked as spatial if a GiST index on a geography column" do
|
190
|
+
@indexes = @connection.indexes('geography_point_models')
|
191
|
+
@indexes.select{|i| i.name == 'index_geography_point_models_on_geom'}.first.spatial.should == true
|
192
|
+
end
|
193
|
+
|
194
|
+
it "should not be marked as spatial if not a GiST index" do
|
188
195
|
@indexes.select{|i| i.name == 'index_point_models_on_extra'}.first.spatial.should == false
|
189
196
|
end
|
197
|
+
|
198
|
+
it "should not be marked as spatial if a GiST index on a non-geometry column" do
|
199
|
+
@connection.execute(<<-SQL)
|
200
|
+
create table non_spatial_models
|
201
|
+
(
|
202
|
+
id serial primary key,
|
203
|
+
location point,
|
204
|
+
extra varchar(255)
|
205
|
+
);
|
206
|
+
create index index_non_spatial_models_on_location on non_spatial_models using gist (box(location, location));
|
207
|
+
SQL
|
208
|
+
@indexes = @connection.indexes('non_spatial_models')
|
209
|
+
@indexes.select{|i| i.name == 'index_non_spatial_models_on_location'}.first.spatial.should == false
|
210
|
+
@connection.execute 'drop table non_spatial_models'
|
211
|
+
end
|
190
212
|
end
|
191
213
|
|
192
214
|
describe "#add_index" do
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spatial_adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
version: 1.0.0
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Pete Deffendol
|
@@ -9,29 +14,37 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-
|
17
|
+
date: 2010-04-19 00:00:00 -06:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: activerecord
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - ">="
|
22
26
|
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 2
|
29
|
+
- 2
|
30
|
+
- 2
|
23
31
|
version: 2.2.2
|
24
|
-
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
25
34
|
- !ruby/object:Gem::Dependency
|
26
35
|
name: GeoRuby
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
38
|
requirements:
|
31
39
|
- - ">="
|
32
40
|
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 1
|
43
|
+
- 3
|
44
|
+
- 0
|
33
45
|
version: 1.3.0
|
34
|
-
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
35
48
|
description: Provides enhancements to ActiveRecord to handle spatial datatypes in PostgreSQL and MySQL.
|
36
49
|
email: pete@fragility.us
|
37
50
|
executables: []
|
@@ -45,13 +58,13 @@ files:
|
|
45
58
|
- README.rdoc
|
46
59
|
- VERSION
|
47
60
|
- lib/spatial_adapter.rb
|
48
|
-
- lib/spatial_adapter/
|
49
|
-
- lib/spatial_adapter/
|
50
|
-
- lib/spatial_adapter/
|
51
|
-
- lib/spatial_adapter/
|
52
|
-
- lib/spatial_adapter/
|
53
|
-
- lib/spatial_adapter/
|
54
|
-
- lib/spatial_adapter/
|
61
|
+
- lib/spatial_adapter/common/raw_geom_info.rb
|
62
|
+
- lib/spatial_adapter/common/schema_definitions.rb
|
63
|
+
- lib/spatial_adapter/common/schema_dumper.rb
|
64
|
+
- lib/spatial_adapter/common/spatial_column.rb
|
65
|
+
- lib/spatial_adapter/common/table_definition.rb
|
66
|
+
- lib/spatial_adapter/mysql.rb
|
67
|
+
- lib/spatial_adapter/postgresql.rb
|
55
68
|
- rails/init.rb
|
56
69
|
has_rdoc: true
|
57
70
|
homepage: http://github.com/fragility/spatial_adapter
|
@@ -66,18 +79,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
66
79
|
requirements:
|
67
80
|
- - ">="
|
68
81
|
- !ruby/object:Gem::Version
|
82
|
+
segments:
|
83
|
+
- 0
|
69
84
|
version: "0"
|
70
|
-
version:
|
71
85
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
87
|
- - ">="
|
74
88
|
- !ruby/object:Gem::Version
|
89
|
+
segments:
|
90
|
+
- 0
|
75
91
|
version: "0"
|
76
|
-
version:
|
77
92
|
requirements: []
|
78
93
|
|
79
94
|
rubyforge_project:
|
80
|
-
rubygems_version: 1.3.
|
95
|
+
rubygems_version: 1.3.6
|
81
96
|
signing_key:
|
82
97
|
specification_version: 3
|
83
98
|
summary: Spatial Adapter for ActiveRecord
|
@@ -89,9 +104,9 @@ test_files:
|
|
89
104
|
- spec/mysql/migration_spec.rb
|
90
105
|
- spec/mysql/models_spec.rb
|
91
106
|
- spec/mysql/schema_dumper_spec.rb
|
92
|
-
- spec/
|
93
|
-
- spec/
|
94
|
-
- spec/
|
95
|
-
- spec/
|
107
|
+
- spec/postgresql/connection_adapter_spec.rb
|
108
|
+
- spec/postgresql/migration_spec.rb
|
109
|
+
- spec/postgresql/models_spec.rb
|
110
|
+
- spec/postgresql/schema_dumper_spec.rb
|
96
111
|
- spec/spec_helper.rb
|
97
112
|
- spec/README.txt
|