activerecord-mysqlspatial-adapter 0.4.0 → 0.4.1
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.
- data/History.rdoc +5 -0
- data/README.rdoc +9 -7
- data/Version +1 -1
- data/lib/active_record/connection_adapters/mysqlspatial_adapter.rb +22 -22
- data/lib/active_record/connection_adapters/mysqlspatial_adapter/arel_tosql.rb +13 -13
- data/lib/active_record/connection_adapters/mysqlspatial_adapter/main_adapter.rb +51 -42
- data/lib/active_record/connection_adapters/mysqlspatial_adapter/spatial_column.rb +45 -35
- data/lib/active_record/connection_adapters/mysqlspatial_adapter/version.rb +15 -15
- data/test/tc_basic.rb +39 -39
- data/test/tc_spatial_queries.rb +27 -27
- metadata +38 -41
data/History.rdoc
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
=== 0.4.1 / 2012-02-22
|
2
|
+
|
3
|
+
* Some compatibility fixes for Rails 3.2. (Reported by Nicholas Zaillian and Ryan Williams with implementation help from Radek Paviensky.) The mysql gem issue remains, however, and I do not know of a workaround. Use activerecord-mysql2-adapter for now if you need Rails >= 3.1 support.
|
4
|
+
* Now requires rgeo-activerecord 0.4.3.
|
5
|
+
|
1
6
|
=== 0.4.0 / 2011-08-15
|
2
7
|
|
3
8
|
* Various fixes towards Rails 3.1 compatibility. However, this adapter is not yet actually Rails 3.1 compatible because of a bug in the mysql gem. Use activerecord-mysql2-adapter for now if you need Rails 3.1 support.
|
data/README.rdoc
CHANGED
@@ -94,10 +94,12 @@ write more complex queries in SQL.
|
|
94
94
|
|
95
95
|
== Installation And Configuration
|
96
96
|
|
97
|
-
IMPORTANT: This adapter is currently *not* compatible with Rails
|
98
|
-
This is due to an apparent bug in the mysql gem (as of
|
99
|
-
which does not appear to recognize MYSQL_TYPE_GEOMETRY in
|
100
|
-
protocol.
|
97
|
+
IMPORTANT: This adapter is currently *not* compatible with Rails version
|
98
|
+
3.1 and later. This is due to an apparent bug in the mysql gem (as of
|
99
|
+
version 2.8.1), which does not appear to recognize MYSQL_TYPE_GEOMETRY in
|
100
|
+
the binary protocol. I'm not aware of a workaround for this issue right
|
101
|
+
now. Please use mysql2 and activerecord-mysql2spatial-adapter if you are
|
102
|
+
using MySQL spatial and Rails 3.1 or later.
|
101
103
|
|
102
104
|
=== Installing The Adapter Gem
|
103
105
|
|
@@ -107,8 +109,8 @@ This adapter has the following requirements:
|
|
107
109
|
* MySQL server 5.0 or later required for spatial extensions.
|
108
110
|
* \ActiveRecord 3.0.3 or later. Earlier versions will not work.
|
109
111
|
* mysql gem 2.8 or later.
|
110
|
-
* rgeo gem 0.3.
|
111
|
-
* rgeo-activerecord gem 0.4.
|
112
|
+
* rgeo gem 0.3.4 or later.
|
113
|
+
* rgeo-activerecord gem 0.4.3 or later.
|
112
114
|
|
113
115
|
Install this adapter as a gem:
|
114
116
|
|
@@ -170,7 +172,7 @@ Contact the author at dazuma at gmail dot com.
|
|
170
172
|
The MysqlSpatial Adapter and its supporting libraries (including RGeo) are
|
171
173
|
written by Daniel Azuma (http://www.daniel-azuma.com).
|
172
174
|
|
173
|
-
Development
|
175
|
+
Development is supported by Pirq. (http://www.pirq.com).
|
174
176
|
|
175
177
|
This adapter implementation owes some debt to the spatial_adapter plugin
|
176
178
|
(http://github.com/fragility/spatial_adapter). Although we made a few
|
data/Version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.1
|
@@ -1,15 +1,15 @@
|
|
1
1
|
# -----------------------------------------------------------------------------
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# MysqlSpatial adapter for ActiveRecord
|
4
|
-
#
|
4
|
+
#
|
5
5
|
# -----------------------------------------------------------------------------
|
6
6
|
# Copyright 2010 Daniel Azuma
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# All rights reserved.
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# Redistribution and use in source and binary forms, with or without
|
11
11
|
# modification, are permitted provided that the following conditions are met:
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# * Redistributions of source code must retain the above copyright notice,
|
14
14
|
# this list of conditions and the following disclaimer.
|
15
15
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
@@ -18,7 +18,7 @@
|
|
18
18
|
# * Neither the name of the copyright holder, nor the names of any other
|
19
19
|
# contributors to this software, may be used to endorse or promote products
|
20
20
|
# derived from this software without specific prior written permission.
|
21
|
-
#
|
21
|
+
#
|
22
22
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
23
23
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
24
24
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
@@ -42,16 +42,16 @@ require 'active_record/connection_adapters/mysql_adapter'
|
|
42
42
|
# connection adapter into ActiveRecord.
|
43
43
|
|
44
44
|
module ActiveRecord
|
45
|
-
|
46
|
-
|
45
|
+
|
46
|
+
|
47
47
|
# ActiveRecord looks for the mysqlspatial_connection factory method in
|
48
48
|
# this class.
|
49
|
-
|
49
|
+
|
50
50
|
class Base
|
51
|
-
|
52
|
-
|
51
|
+
|
52
|
+
|
53
53
|
# Create a mysqlspatial connection adapter.
|
54
|
-
|
54
|
+
|
55
55
|
def self.mysqlspatial_connection(config_)
|
56
56
|
unless defined?(::Mysql)
|
57
57
|
begin
|
@@ -71,25 +71,25 @@ module ActiveRecord
|
|
71
71
|
options_ = [config_[:host], config_[:username] ? config_[:username].to_s : 'root', config_[:password].to_s, config_[:database], config_[:port], config_[:socket], default_flags_]
|
72
72
|
::ActiveRecord::ConnectionAdapters::MysqlSpatialAdapter::MainAdapter.new(mysql_, logger, options_, config_)
|
73
73
|
end
|
74
|
-
|
75
|
-
|
74
|
+
|
75
|
+
|
76
76
|
end
|
77
|
-
|
78
|
-
|
77
|
+
|
78
|
+
|
79
79
|
# All ActiveRecord adapters go in this namespace.
|
80
80
|
module ConnectionAdapters
|
81
|
-
|
81
|
+
|
82
82
|
# The MysqlSpatial adapter
|
83
83
|
module MysqlSpatialAdapter
|
84
|
-
|
84
|
+
|
85
85
|
# The name returned by the adapter_name method of this adapter.
|
86
86
|
ADAPTER_NAME = 'MysqlSpatial'.freeze
|
87
|
-
|
87
|
+
|
88
88
|
end
|
89
|
-
|
89
|
+
|
90
90
|
end
|
91
|
-
|
92
|
-
|
91
|
+
|
92
|
+
|
93
93
|
end
|
94
94
|
|
95
95
|
|
@@ -1,15 +1,15 @@
|
|
1
1
|
# -----------------------------------------------------------------------------
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# MysqlSpatial adapter for ActiveRecord
|
4
|
-
#
|
4
|
+
#
|
5
5
|
# -----------------------------------------------------------------------------
|
6
6
|
# Copyright 2010 Daniel Azuma
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# All rights reserved.
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# Redistribution and use in source and binary forms, with or without
|
11
11
|
# modification, are permitted provided that the following conditions are met:
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# * Redistributions of source code must retain the above copyright notice,
|
14
14
|
# this list of conditions and the following disclaimer.
|
15
15
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
@@ -18,7 +18,7 @@
|
|
18
18
|
# * Neither the name of the copyright holder, nor the names of any other
|
19
19
|
# contributors to this software, may be used to endorse or promote products
|
20
20
|
# derived from this software without specific prior written permission.
|
21
|
-
#
|
21
|
+
#
|
22
22
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
23
23
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
24
24
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
@@ -38,17 +38,17 @@
|
|
38
38
|
|
39
39
|
module Arel
|
40
40
|
module Visitors
|
41
|
-
|
41
|
+
|
42
42
|
class MySQLSpatial < MySQL
|
43
|
-
|
43
|
+
|
44
44
|
FUNC_MAP = {
|
45
45
|
'st_wkttosql' => 'GeomFromText',
|
46
46
|
'st_wkbtosql' => 'GeomFromWKB',
|
47
47
|
'st_length' => 'GLength',
|
48
48
|
}
|
49
|
-
|
49
|
+
|
50
50
|
include ::RGeo::ActiveRecord::SpatialToSql
|
51
|
-
|
51
|
+
|
52
52
|
def st_func(standard_name_)
|
53
53
|
if (name_ = FUNC_MAP[standard_name_.downcase])
|
54
54
|
name_
|
@@ -58,11 +58,11 @@ module Arel
|
|
58
58
|
standard_name_
|
59
59
|
end
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
VISITORS['mysqlspatial'] = ::Arel::Visitors::MySQLSpatial
|
65
|
-
|
65
|
+
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
@@ -1,15 +1,15 @@
|
|
1
1
|
# -----------------------------------------------------------------------------
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# MysqlSpatial adapter for ActiveRecord
|
4
|
-
#
|
4
|
+
#
|
5
5
|
# -----------------------------------------------------------------------------
|
6
6
|
# Copyright 2010 Daniel Azuma
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# All rights reserved.
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# Redistribution and use in source and binary forms, with or without
|
11
11
|
# modification, are permitted provided that the following conditions are met:
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# * Redistributions of source code must retain the above copyright notice,
|
14
14
|
# this list of conditions and the following disclaimer.
|
15
15
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
@@ -18,7 +18,7 @@
|
|
18
18
|
# * Neither the name of the copyright holder, nor the names of any other
|
19
19
|
# contributors to this software, may be used to endorse or promote products
|
20
20
|
# derived from this software without specific prior written permission.
|
21
|
-
#
|
21
|
+
#
|
22
22
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
23
23
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
24
24
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
@@ -37,38 +37,47 @@
|
|
37
37
|
# :stopdoc:
|
38
38
|
|
39
39
|
module ActiveRecord
|
40
|
-
|
40
|
+
|
41
41
|
module ConnectionAdapters
|
42
|
-
|
42
|
+
|
43
43
|
module MysqlSpatialAdapter
|
44
|
-
|
45
|
-
|
44
|
+
|
45
|
+
|
46
46
|
class MainAdapter < ConnectionAdapters::MysqlAdapter
|
47
|
-
|
48
|
-
|
47
|
+
|
48
|
+
|
49
49
|
NATIVE_DATABASE_TYPES = MysqlAdapter::NATIVE_DATABASE_TYPES.merge(:spatial => {:name => "geometry"})
|
50
|
-
|
51
|
-
|
50
|
+
|
51
|
+
|
52
|
+
def initialize(*args_)
|
53
|
+
super
|
54
|
+
# Rails 3.2 way of defining the visitor: do so in the constructor
|
55
|
+
if defined?(@visitor) && @visitor
|
56
|
+
@visitor = ::Arel::Visitors::MySQLSpatial.new(self)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
|
52
61
|
def set_rgeo_factory_settings(factory_settings_)
|
53
62
|
@rgeo_factory_settings = factory_settings_
|
54
63
|
end
|
55
|
-
|
56
|
-
|
64
|
+
|
65
|
+
|
57
66
|
def adapter_name
|
58
67
|
MysqlSpatialAdapter::ADAPTER_NAME
|
59
68
|
end
|
60
|
-
|
61
|
-
|
69
|
+
|
70
|
+
|
62
71
|
def spatial_column_constructor(name_)
|
63
72
|
::RGeo::ActiveRecord::DEFAULT_SPATIAL_COLUMN_CONSTRUCTORS[name_]
|
64
73
|
end
|
65
|
-
|
66
|
-
|
74
|
+
|
75
|
+
|
67
76
|
def native_database_types
|
68
77
|
NATIVE_DATABASE_TYPES
|
69
78
|
end
|
70
|
-
|
71
|
-
|
79
|
+
|
80
|
+
|
72
81
|
def quote(value_, column_=nil)
|
73
82
|
if ::RGeo::Feature::Geometry.check_type(value_)
|
74
83
|
"GeomFromWKB(0x#{::RGeo::WKRep::WKBGenerator.new(:hex_format => true).generate(value_)},#{value_.srid})"
|
@@ -76,8 +85,8 @@ module ActiveRecord
|
|
76
85
|
super
|
77
86
|
end
|
78
87
|
end
|
79
|
-
|
80
|
-
|
88
|
+
|
89
|
+
|
81
90
|
def substitute_at(column_, index_)
|
82
91
|
if column_.spatial?
|
83
92
|
::Arel.sql('GeomFromText(?,?)')
|
@@ -85,8 +94,8 @@ module ActiveRecord
|
|
85
94
|
super
|
86
95
|
end
|
87
96
|
end
|
88
|
-
|
89
|
-
|
97
|
+
|
98
|
+
|
90
99
|
def type_cast(value_, column_)
|
91
100
|
if column_.spatial? && ::RGeo::Feature::Geometry.check_type(value_)
|
92
101
|
::RGeo::WKRep::WKTGenerator.new.generate(value_)
|
@@ -94,8 +103,8 @@ module ActiveRecord
|
|
94
103
|
super
|
95
104
|
end
|
96
105
|
end
|
97
|
-
|
98
|
-
|
106
|
+
|
107
|
+
|
99
108
|
def exec_stmt(sql_, name_, binds_)
|
100
109
|
real_binds_ = []
|
101
110
|
binds_.each do |bind_|
|
@@ -108,8 +117,8 @@ module ActiveRecord
|
|
108
117
|
end
|
109
118
|
super(sql_, name_, real_binds_)
|
110
119
|
end
|
111
|
-
|
112
|
-
|
120
|
+
|
121
|
+
|
113
122
|
def type_to_sql(type_, limit_=nil, precision_=nil, scale_=nil)
|
114
123
|
if (info_ = spatial_column_constructor(type_.to_sym))
|
115
124
|
type_ = limit_[:type] || type_ if limit_.is_a?(::Hash)
|
@@ -118,8 +127,8 @@ module ActiveRecord
|
|
118
127
|
end
|
119
128
|
super(type_, limit_, precision_, scale_)
|
120
129
|
end
|
121
|
-
|
122
|
-
|
130
|
+
|
131
|
+
|
123
132
|
def add_index(table_name_, column_name_, options_={})
|
124
133
|
if options_[:spatial]
|
125
134
|
index_name_ = index_name(table_name_, :column => Array(column_name_))
|
@@ -131,8 +140,8 @@ module ActiveRecord
|
|
131
140
|
super
|
132
141
|
end
|
133
142
|
end
|
134
|
-
|
135
|
-
|
143
|
+
|
144
|
+
|
136
145
|
def columns(table_name_, name_=nil)
|
137
146
|
result_ = execute("SHOW FIELDS FROM #{quote_table_name(table_name_)}", :skip_logging)
|
138
147
|
columns_ = []
|
@@ -143,8 +152,8 @@ module ActiveRecord
|
|
143
152
|
result_.free
|
144
153
|
columns_
|
145
154
|
end
|
146
|
-
|
147
|
-
|
155
|
+
|
156
|
+
|
148
157
|
def indexes(table_name_, name_=nil)
|
149
158
|
indexes_ = []
|
150
159
|
current_index_ = nil
|
@@ -162,15 +171,15 @@ module ActiveRecord
|
|
162
171
|
result_.free
|
163
172
|
indexes_
|
164
173
|
end
|
165
|
-
|
166
|
-
|
174
|
+
|
175
|
+
|
167
176
|
end
|
168
|
-
|
169
|
-
|
177
|
+
|
178
|
+
|
170
179
|
end
|
171
|
-
|
180
|
+
|
172
181
|
end
|
173
|
-
|
182
|
+
|
174
183
|
end
|
175
184
|
|
176
185
|
# :startdoc:
|
@@ -1,15 +1,15 @@
|
|
1
1
|
# -----------------------------------------------------------------------------
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# MysqlSpatial adapter for ActiveRecord
|
4
|
-
#
|
4
|
+
#
|
5
5
|
# -----------------------------------------------------------------------------
|
6
6
|
# Copyright 2010 Daniel Azuma
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# All rights reserved.
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# Redistribution and use in source and binary forms, with or without
|
11
11
|
# modification, are permitted provided that the following conditions are met:
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# * Redistributions of source code must retain the above copyright notice,
|
14
14
|
# this list of conditions and the following disclaimer.
|
15
15
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
@@ -18,7 +18,7 @@
|
|
18
18
|
# * Neither the name of the copyright holder, nor the names of any other
|
19
19
|
# contributors to this software, may be used to endorse or promote products
|
20
20
|
# derived from this software without specific prior written permission.
|
21
|
-
#
|
21
|
+
#
|
22
22
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
23
23
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
24
24
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
@@ -37,15 +37,23 @@
|
|
37
37
|
# :stopdoc:
|
38
38
|
|
39
39
|
module ActiveRecord
|
40
|
-
|
40
|
+
|
41
41
|
module ConnectionAdapters
|
42
|
-
|
42
|
+
|
43
43
|
module MysqlSpatialAdapter
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
44
|
+
|
45
|
+
|
46
|
+
# ActiveRecord 3.2 uses ConnectionAdapters::MysqlAdapter::Column
|
47
|
+
# whereas 3.0 and 3.1 use ConnectionAdapters::MysqlColumn
|
48
|
+
column_base_class_ = defined?(ConnectionAdapters::MysqlAdapter::Column) ?
|
49
|
+
ConnectionAdapters::MysqlAdapter::Column : ConnectionAdapters::MysqlColumn
|
50
|
+
|
51
|
+
class SpatialColumn < column_base_class_
|
52
|
+
|
53
|
+
|
54
|
+
FACTORY_SETTINGS_CACHE = {}
|
55
|
+
|
56
|
+
|
49
57
|
def initialize(factory_settings_, table_name_, name_, default_, sql_type_=nil, null_=true)
|
50
58
|
@factory_settings = factory_settings_
|
51
59
|
@table_name = table_name_
|
@@ -54,22 +62,23 @@ module ActiveRecord
|
|
54
62
|
if type == :spatial
|
55
63
|
@limit = {:type => @geometric_type.type_name.underscore}
|
56
64
|
end
|
65
|
+
FACTORY_SETTINGS_CACHE[factory_settings_.object_id] = factory_settings_
|
57
66
|
end
|
58
|
-
|
59
|
-
|
67
|
+
|
68
|
+
|
60
69
|
attr_reader :geometric_type
|
61
|
-
|
62
|
-
|
70
|
+
|
71
|
+
|
63
72
|
def spatial?
|
64
73
|
type == :spatial
|
65
74
|
end
|
66
|
-
|
67
|
-
|
75
|
+
|
76
|
+
|
68
77
|
def klass
|
69
78
|
type == :spatial ? ::RGeo::Feature::Geometry : super
|
70
79
|
end
|
71
|
-
|
72
|
-
|
80
|
+
|
81
|
+
|
73
82
|
def type_cast(value_)
|
74
83
|
if type == :spatial
|
75
84
|
SpatialColumn.convert_to_geometry(value_, @factory_settings, @table_name, name)
|
@@ -77,25 +86,26 @@ module ActiveRecord
|
|
77
86
|
super
|
78
87
|
end
|
79
88
|
end
|
80
|
-
|
81
|
-
|
89
|
+
|
90
|
+
|
82
91
|
def type_cast_code(var_name_)
|
83
92
|
if type == :spatial
|
84
93
|
"::ActiveRecord::ConnectionAdapters::MysqlSpatialAdapter::SpatialColumn.convert_to_geometry("+
|
85
|
-
"#{var_name_},
|
94
|
+
"#{var_name_}, ::ActiveRecord::ConnectionAdapters::MysqlSpatialAdapter::SpatialColumn::"+
|
95
|
+
"FACTORY_SETTINGS_CACHE[#{@factory_settings.object_id}], #{@table_name.inspect}, #{name.inspect})"
|
86
96
|
else
|
87
97
|
super
|
88
98
|
end
|
89
99
|
end
|
90
|
-
|
91
|
-
|
100
|
+
|
101
|
+
|
92
102
|
private
|
93
|
-
|
103
|
+
|
94
104
|
def simplified_type(sql_type_)
|
95
105
|
sql_type_ =~ /geometry|point|linestring|polygon/i ? :spatial : super
|
96
106
|
end
|
97
|
-
|
98
|
-
|
107
|
+
|
108
|
+
|
99
109
|
def self.convert_to_geometry(input_, factory_settings_, table_name_, column_)
|
100
110
|
case input_
|
101
111
|
when ::RGeo::Feature::Geometry
|
@@ -122,15 +132,15 @@ module ActiveRecord
|
|
122
132
|
nil
|
123
133
|
end
|
124
134
|
end
|
125
|
-
|
126
|
-
|
135
|
+
|
136
|
+
|
127
137
|
end
|
128
|
-
|
129
|
-
|
138
|
+
|
139
|
+
|
130
140
|
end
|
131
|
-
|
141
|
+
|
132
142
|
end
|
133
|
-
|
143
|
+
|
134
144
|
end
|
135
145
|
|
136
146
|
# :startdoc:
|
@@ -1,15 +1,15 @@
|
|
1
1
|
# -----------------------------------------------------------------------------
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# MysqlSpatial adapter for ActiveRecord
|
4
|
-
#
|
4
|
+
#
|
5
5
|
# -----------------------------------------------------------------------------
|
6
6
|
# Copyright 2010 Daniel Azuma
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# All rights reserved.
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# Redistribution and use in source and binary forms, with or without
|
11
11
|
# modification, are permitted provided that the following conditions are met:
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# * Redistributions of source code must retain the above copyright notice,
|
14
14
|
# this list of conditions and the following disclaimer.
|
15
15
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
@@ -18,7 +18,7 @@
|
|
18
18
|
# * Neither the name of the copyright holder, nor the names of any other
|
19
19
|
# contributors to this software, may be used to endorse or promote products
|
20
20
|
# derived from this software without specific prior written permission.
|
21
|
-
#
|
21
|
+
#
|
22
22
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
23
23
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
24
24
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
@@ -41,22 +41,22 @@ end
|
|
41
41
|
|
42
42
|
|
43
43
|
module ActiveRecord
|
44
|
-
|
44
|
+
|
45
45
|
module ConnectionAdapters
|
46
|
-
|
46
|
+
|
47
47
|
module MysqlSpatialAdapter
|
48
|
-
|
49
|
-
|
48
|
+
|
49
|
+
|
50
50
|
# Current version of MysqlSpatialAdapter as a frozen string
|
51
51
|
VERSION_STRING = ::File.read(::File.dirname(__FILE__)+'/../../../../Version').strip.freeze
|
52
|
-
|
52
|
+
|
53
53
|
# Current version of MysqlSpatialAdapter as a Versionomy object, if the
|
54
54
|
# Versionomy gem is available; otherwise equal to VERSION_STRING.
|
55
55
|
VERSION = defined?(::Versionomy) ? ::Versionomy.parse(VERSION_STRING) : VERSION_STRING
|
56
|
-
|
57
|
-
|
56
|
+
|
57
|
+
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
end
|
data/test/tc_basic.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# -----------------------------------------------------------------------------
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Tests for the MysqlSpatial ActiveRecord adapter
|
4
|
-
#
|
4
|
+
#
|
5
5
|
# -----------------------------------------------------------------------------
|
6
6
|
# Copyright 2010 Daniel Azuma
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# All rights reserved.
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# Redistribution and use in source and binary forms, with or without
|
11
11
|
# modification, are permitted provided that the following conditions are met:
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# * Redistributions of source code must retain the above copyright notice,
|
14
14
|
# this list of conditions and the following disclaimer.
|
15
15
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
@@ -18,7 +18,7 @@
|
|
18
18
|
# * Neither the name of the copyright holder, nor the names of any other
|
19
19
|
# contributors to this software, may be used to endorse or promote products
|
20
20
|
# derived from this software without specific prior written permission.
|
21
|
-
#
|
21
|
+
#
|
22
22
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
23
23
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
24
24
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
@@ -41,15 +41,15 @@ module RGeo
|
|
41
41
|
module ActiveRecord # :nodoc:
|
42
42
|
module MysqlSpatialAdapter # :nodoc:
|
43
43
|
module Tests # :nodoc:
|
44
|
-
|
44
|
+
|
45
45
|
class TestBasic < ::Test::Unit::TestCase # :nodoc:
|
46
|
-
|
46
|
+
|
47
47
|
DATABASE_CONFIG_PATH = ::File.dirname(__FILE__)+'/database.yml'
|
48
48
|
include AdapterTestHelper
|
49
|
-
|
49
|
+
|
50
50
|
define_test_methods do
|
51
|
-
|
52
|
-
|
51
|
+
|
52
|
+
|
53
53
|
def populate_ar_class(content_)
|
54
54
|
klass_ = create_ar_class
|
55
55
|
case content_
|
@@ -60,13 +60,13 @@ module RGeo
|
|
60
60
|
end
|
61
61
|
klass_
|
62
62
|
end
|
63
|
-
|
64
|
-
|
63
|
+
|
64
|
+
|
65
65
|
def test_version
|
66
66
|
assert_not_nil(::ActiveRecord::ConnectionAdapters::MysqlSpatialAdapter::VERSION)
|
67
67
|
end
|
68
|
-
|
69
|
-
|
68
|
+
|
69
|
+
|
70
70
|
def test_create_simple_geometry
|
71
71
|
klass_ = create_ar_class
|
72
72
|
klass_.connection.create_table(:spatial_test) do |t_|
|
@@ -75,8 +75,8 @@ module RGeo
|
|
75
75
|
assert_equal(::RGeo::Feature::Geometry, klass_.columns.last.geometric_type)
|
76
76
|
assert(klass_.cached_attributes.include?('latlon'))
|
77
77
|
end
|
78
|
-
|
79
|
-
|
78
|
+
|
79
|
+
|
80
80
|
def test_create_point_geometry
|
81
81
|
klass_ = create_ar_class
|
82
82
|
klass_.connection.create_table(:spatial_test) do |t_|
|
@@ -85,8 +85,8 @@ module RGeo
|
|
85
85
|
assert_equal(::RGeo::Feature::Point, klass_.columns.last.geometric_type)
|
86
86
|
assert(klass_.cached_attributes.include?('latlon'))
|
87
87
|
end
|
88
|
-
|
89
|
-
|
88
|
+
|
89
|
+
|
90
90
|
def test_create_geometry_with_index
|
91
91
|
klass_ = create_ar_class
|
92
92
|
klass_.connection.create_table(:spatial_test, :options => 'ENGINE=MyISAM') do |t_|
|
@@ -97,8 +97,8 @@ module RGeo
|
|
97
97
|
end
|
98
98
|
assert(klass_.connection.indexes(:spatial_test).last.spatial)
|
99
99
|
end
|
100
|
-
|
101
|
-
|
100
|
+
|
101
|
+
|
102
102
|
def test_set_and_get_point
|
103
103
|
klass_ = populate_ar_class(:latlon_point)
|
104
104
|
obj_ = klass_.new
|
@@ -107,8 +107,8 @@ module RGeo
|
|
107
107
|
assert_equal(@factory.point(1, 2), obj_.latlon)
|
108
108
|
assert_equal(3785, obj_.latlon.srid)
|
109
109
|
end
|
110
|
-
|
111
|
-
|
110
|
+
|
111
|
+
|
112
112
|
def test_set_and_get_point_from_wkt
|
113
113
|
klass_ = populate_ar_class(:latlon_point)
|
114
114
|
obj_ = klass_.new
|
@@ -117,8 +117,8 @@ module RGeo
|
|
117
117
|
assert_equal(@factory.point(1, 2), obj_.latlon)
|
118
118
|
assert_equal(1000, obj_.latlon.srid)
|
119
119
|
end
|
120
|
-
|
121
|
-
|
120
|
+
|
121
|
+
|
122
122
|
def test_save_and_load_point
|
123
123
|
klass_ = populate_ar_class(:latlon_point)
|
124
124
|
obj_ = klass_.new
|
@@ -129,8 +129,8 @@ module RGeo
|
|
129
129
|
assert_equal(@factory.point(1, 2), obj2_.latlon)
|
130
130
|
assert_equal(3785, obj2_.latlon.srid)
|
131
131
|
end
|
132
|
-
|
133
|
-
|
132
|
+
|
133
|
+
|
134
134
|
def test_save_and_load_point_from_wkt
|
135
135
|
klass_ = populate_ar_class(:latlon_point)
|
136
136
|
obj_ = klass_.new
|
@@ -141,8 +141,8 @@ module RGeo
|
|
141
141
|
assert_equal(@factory.point(1, 2), obj2_.latlon)
|
142
142
|
assert_equal(1000, obj2_.latlon.srid)
|
143
143
|
end
|
144
|
-
|
145
|
-
|
144
|
+
|
145
|
+
|
146
146
|
def test_readme_example
|
147
147
|
klass_ = create_ar_class
|
148
148
|
klass_.connection.create_table(:spatial_test, :options => 'ENGINE=MyISAM') do |t_|
|
@@ -164,8 +164,8 @@ module RGeo
|
|
164
164
|
rec_.shape = loc_
|
165
165
|
assert_equal(true, ::RGeo::Geos.is_geos?(rec_.shape))
|
166
166
|
end
|
167
|
-
|
168
|
-
|
167
|
+
|
168
|
+
|
169
169
|
def test_create_simple_geometry_using_shortcut
|
170
170
|
klass_ = create_ar_class
|
171
171
|
klass_.connection.create_table(:spatial_test) do |t_|
|
@@ -174,8 +174,8 @@ module RGeo
|
|
174
174
|
assert_equal(::RGeo::Feature::Geometry, klass_.columns.last.geometric_type)
|
175
175
|
assert(klass_.cached_attributes.include?('latlon'))
|
176
176
|
end
|
177
|
-
|
178
|
-
|
177
|
+
|
178
|
+
|
179
179
|
def test_create_point_geometry_using_shortcut
|
180
180
|
klass_ = create_ar_class
|
181
181
|
klass_.connection.create_table(:spatial_test) do |t_|
|
@@ -184,8 +184,8 @@ module RGeo
|
|
184
184
|
assert_equal(::RGeo::Feature::Point, klass_.columns.last.geometric_type)
|
185
185
|
assert(klass_.cached_attributes.include?('latlon'))
|
186
186
|
end
|
187
|
-
|
188
|
-
|
187
|
+
|
188
|
+
|
189
189
|
def test_create_geometry_using_limit
|
190
190
|
klass_ = create_ar_class
|
191
191
|
klass_.connection.create_table(:spatial_test) do |t_|
|
@@ -194,12 +194,12 @@ module RGeo
|
|
194
194
|
assert_equal(::RGeo::Feature::LineString, klass_.columns.last.geometric_type)
|
195
195
|
assert(klass_.cached_attributes.include?('geom'))
|
196
196
|
end
|
197
|
-
|
198
|
-
|
197
|
+
|
198
|
+
|
199
199
|
end
|
200
|
-
|
200
|
+
|
201
201
|
end
|
202
|
-
|
202
|
+
|
203
203
|
end
|
204
204
|
end
|
205
205
|
end
|
data/test/tc_spatial_queries.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# -----------------------------------------------------------------------------
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Tests for the MysqlSpatial ActiveRecord adapter
|
4
|
-
#
|
4
|
+
#
|
5
5
|
# -----------------------------------------------------------------------------
|
6
6
|
# Copyright 2010 Daniel Azuma
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# All rights reserved.
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# Redistribution and use in source and binary forms, with or without
|
11
11
|
# modification, are permitted provided that the following conditions are met:
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# * Redistributions of source code must retain the above copyright notice,
|
14
14
|
# this list of conditions and the following disclaimer.
|
15
15
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
@@ -18,7 +18,7 @@
|
|
18
18
|
# * Neither the name of the copyright holder, nor the names of any other
|
19
19
|
# contributors to this software, may be used to endorse or promote products
|
20
20
|
# derived from this software without specific prior written permission.
|
21
|
-
#
|
21
|
+
#
|
22
22
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
23
23
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
24
24
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
@@ -41,15 +41,15 @@ module RGeo
|
|
41
41
|
module ActiveRecord # :nodoc:
|
42
42
|
module MysqlSpatialAdapter # :nodoc:
|
43
43
|
module Tests # :nodoc:
|
44
|
-
|
44
|
+
|
45
45
|
class TestSpatialQueries < ::Test::Unit::TestCase # :nodoc:
|
46
|
-
|
46
|
+
|
47
47
|
DATABASE_CONFIG_PATH = ::File.dirname(__FILE__)+'/database.yml'
|
48
48
|
include AdapterTestHelper
|
49
|
-
|
49
|
+
|
50
50
|
define_test_methods do
|
51
|
-
|
52
|
-
|
51
|
+
|
52
|
+
|
53
53
|
def populate_ar_class(content_)
|
54
54
|
klass_ = create_ar_class
|
55
55
|
case content_
|
@@ -64,8 +64,8 @@ module RGeo
|
|
64
64
|
end
|
65
65
|
klass_
|
66
66
|
end
|
67
|
-
|
68
|
-
|
67
|
+
|
68
|
+
|
69
69
|
def test_query_point
|
70
70
|
klass_ = populate_ar_class(:latlon_point)
|
71
71
|
obj_ = klass_.new
|
@@ -77,8 +77,8 @@ module RGeo
|
|
77
77
|
obj3_ = klass_.where(:latlon => @factory.point(2, 2)).first
|
78
78
|
assert_nil(obj3_)
|
79
79
|
end
|
80
|
-
|
81
|
-
|
80
|
+
|
81
|
+
|
82
82
|
def _test_query_point_wkt
|
83
83
|
klass_ = populate_ar_class(:latlon_point)
|
84
84
|
obj_ = klass_.new
|
@@ -90,11 +90,11 @@ module RGeo
|
|
90
90
|
obj3_ = klass_.where(:latlon => 'POINT(2 2)').first
|
91
91
|
assert_nil(obj3_)
|
92
92
|
end
|
93
|
-
|
94
|
-
|
93
|
+
|
94
|
+
|
95
95
|
if ::RGeo::ActiveRecord.spatial_expressions_supported?
|
96
|
-
|
97
|
-
|
96
|
+
|
97
|
+
|
98
98
|
def test_query_st_length
|
99
99
|
klass_ = populate_ar_class(:path_linestring)
|
100
100
|
obj_ = klass_.new
|
@@ -106,19 +106,19 @@ module RGeo
|
|
106
106
|
obj3_ = klass_.where(klass_.arel_table[:path].st_length.gt(3)).first
|
107
107
|
assert_nil(obj3_)
|
108
108
|
end
|
109
|
-
|
110
|
-
|
109
|
+
|
110
|
+
|
111
111
|
else
|
112
|
-
|
112
|
+
|
113
113
|
puts "WARNING: The current Arel does not support named functions. Spatial expression tests skipped."
|
114
|
-
|
114
|
+
|
115
115
|
end
|
116
|
-
|
117
|
-
|
116
|
+
|
117
|
+
|
118
118
|
end
|
119
|
-
|
119
|
+
|
120
120
|
end
|
121
|
-
|
121
|
+
|
122
122
|
end
|
123
123
|
end
|
124
124
|
end
|
metadata
CHANGED
@@ -1,49 +1,48 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-mysqlspatial-adapter
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.1
|
4
5
|
prerelease:
|
5
|
-
version: 0.4.0
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Daniel Azuma
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-02-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: rgeo-activerecord
|
17
|
-
|
18
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &2155892340 !ruby/object:Gem::Requirement
|
19
17
|
none: false
|
20
|
-
requirements:
|
18
|
+
requirements:
|
21
19
|
- - ~>
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.4.
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.4.3
|
24
22
|
type: :runtime
|
25
|
-
version_requirements: *id001
|
26
|
-
- !ruby/object:Gem::Dependency
|
27
|
-
name: mysql
|
28
23
|
prerelease: false
|
29
|
-
|
24
|
+
version_requirements: *2155892340
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: mysql
|
27
|
+
requirement: &2155891100 !ruby/object:Gem::Requirement
|
30
28
|
none: false
|
31
|
-
requirements:
|
32
|
-
- -
|
33
|
-
- !ruby/object:Gem::Version
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
34
32
|
version: 2.8.1
|
35
33
|
type: :runtime
|
36
|
-
|
37
|
-
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *2155891100
|
36
|
+
description: This is an ActiveRecord connection adapter for MySQL Spatial Extensions.
|
37
|
+
It is based on the stock MySQL adapter, but provides built-in support for spatial
|
38
|
+
columns. It uses the RGeo library to represent spatial data in Ruby.
|
38
39
|
email: dazuma@gmail.com
|
39
40
|
executables: []
|
40
|
-
|
41
41
|
extensions: []
|
42
|
-
|
43
|
-
extra_rdoc_files:
|
42
|
+
extra_rdoc_files:
|
44
43
|
- History.rdoc
|
45
44
|
- README.rdoc
|
46
|
-
files:
|
45
|
+
files:
|
47
46
|
- lib/active_record/connection_adapters/mysqlspatial_adapter/arel_tosql.rb
|
48
47
|
- lib/active_record/connection_adapters/mysqlspatial_adapter/main_adapter.rb
|
49
48
|
- lib/active_record/connection_adapters/mysqlspatial_adapter/spatial_column.rb
|
@@ -56,31 +55,29 @@ files:
|
|
56
55
|
- Version
|
57
56
|
homepage: http://virtuoso.rubyforge.org/activerecord-mysqlspatial-adapter
|
58
57
|
licenses: []
|
59
|
-
|
60
58
|
post_install_message:
|
61
59
|
rdoc_options: []
|
62
|
-
|
63
|
-
require_paths:
|
60
|
+
require_paths:
|
64
61
|
- lib
|
65
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
66
63
|
none: false
|
67
|
-
requirements:
|
68
|
-
- -
|
69
|
-
- !ruby/object:Gem::Version
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
70
67
|
version: 1.8.7
|
71
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
69
|
none: false
|
73
|
-
requirements:
|
74
|
-
- -
|
75
|
-
- !ruby/object:Gem::Version
|
70
|
+
requirements:
|
71
|
+
- - ! '>'
|
72
|
+
- !ruby/object:Gem::Version
|
76
73
|
version: 1.3.1
|
77
74
|
requirements: []
|
78
|
-
|
79
75
|
rubyforge_project: virtuoso
|
80
|
-
rubygems_version: 1.8.
|
76
|
+
rubygems_version: 1.8.17
|
81
77
|
signing_key:
|
82
78
|
specification_version: 3
|
83
|
-
summary: An ActiveRecord adapter for MySQL Spatial Extensions, based on RGeo and the
|
84
|
-
|
79
|
+
summary: An ActiveRecord adapter for MySQL Spatial Extensions, based on RGeo and the
|
80
|
+
mysql gem.
|
81
|
+
test_files:
|
85
82
|
- test/tc_basic.rb
|
86
83
|
- test/tc_spatial_queries.rb
|