rgeo-activerecord 0.3.4 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,9 @@
1
+ === 0.4.0 / 2011-08-15
2
+
3
+ * Several compatibility fixes for Rails 3.1.
4
+ * Revamped factory setter mechanism with a system that should be more robust.
5
+ * Some general code cleanup.
6
+
1
7
  === 0.3.4 / 2011-05-23
2
8
 
3
9
  * Uses the mixin feature of RGeo 0.3 to add an as_json method to all geometry objects. This should allow ActiveRecord's JSON serialization to function for models with geometry fields. (Reported by thenetduck and tonyc on github.)
@@ -23,8 +23,9 @@ need to interact directly with this library.
23
23
  RGeo::ActiveRecord has the following requirements:
24
24
 
25
25
  * Ruby 1.8.7 or later. Ruby 1.9.2 or later preferred.
26
- * \RGeo 0.3.0 or later.
26
+ * \RGeo 0.3.2 or later.
27
27
  * \ActiveRecord 3.0.3 or later. Earlier versions will not work.
28
+ Appears to be compatible with Rails 3.1rc5.
28
29
  * \Arel 2.0.6 or later. Earlier versions will not work.
29
30
 
30
31
  Generally, \ActiveRecord adapters which depend on this module should be
@@ -58,6 +59,8 @@ Contributions are welcome. Fork the project on Github.
58
59
 
59
60
  Report bugs on Github issues at http://github.org/dazuma/rgeo-activerecord/issues
60
61
 
62
+ Support available on the rgeo-users google group at http://groups.google.com/group/rgeo-users
63
+
61
64
  Contact the author at dazuma at gmail dot com.
62
65
 
63
66
  === Acknowledgments
data/Version CHANGED
@@ -1 +1 @@
1
- 0.3.4
1
+ 0.4.0
@@ -106,7 +106,7 @@ module RGeo
106
106
  # cartesian factory) and @geographic_factory (a spherical factory)
107
107
 
108
108
  def setup
109
- @factory = ::RGeo::Cartesian.preferred_factory(:srid => 4326)
109
+ @factory = ::RGeo::Cartesian.preferred_factory(:srid => 3785)
110
110
  @geographic_factory = ::RGeo::Geographic.spherical_factory(:srid => 4326)
111
111
  cleanup_tables
112
112
  end
@@ -129,6 +129,15 @@ module RGeo
129
129
  if klass_.connection.tables.include?('spatial_test')
130
130
  klass_.connection.drop_table(:spatial_test)
131
131
  end
132
+ # Clear any RGeo factory settings.
133
+ klass_.connection_pool.rgeo_factory_settings.clear!
134
+ # Rails 3.1 does more aggressive caching than 3.0 did; need to
135
+ # clear those because the next test might assume different data.
136
+ if klass_.connection_pool.respond_to?(:clear_cache!)
137
+ klass_.connection_pool.clear_cache!
138
+ klass_.connection.clear_query_cache
139
+ klass_.connection.clear_cache!
140
+ end
132
141
  end
133
142
 
134
143
 
@@ -37,41 +37,128 @@
37
37
  require 'active_record'
38
38
 
39
39
 
40
- module ActiveRecord
40
+ module RGeo
41
41
 
42
-
43
- # RGeo extends ActiveRecord::Base to include the following new class
44
- # attributes. These attributes are inherited by subclasses, and can
45
- # be overridden in subclasses.
46
- #
47
- # === ActiveRecord::Base::rgeo_factory_generator
48
- #
49
- # The value of this attribute is a RGeo::Feature::FactoryGenerator
50
- # that is used to generate the proper factory when loading geometry
51
- # objects from the database. For example, if the data being loaded
52
- # has M but not Z coordinates, and an embedded SRID, then this
53
- # FactoryGenerator is called with the appropriate configuration to
54
- # obtain a factory with those properties. This factory is the one
55
- # associated with the actual geometry properties of the ActiveRecord
56
- # object. The result of this generator can be overridden by setting
57
- # an explicit factory for a given class and column using the
58
- # column_rgeo_factory method.
59
-
60
- class Base
42
+ module ActiveRecord
43
+
61
44
 
45
+ # The default factory generator for ActiveRecord::Base.
62
46
 
63
- class_attribute :rgeo_factory_generator, :instance_writer => false
64
- self.rgeo_factory_generator = nil
47
+ DEFAULT_FACTORY_GENERATOR = ::Proc.new do |config_|
48
+ if config_.delete(:geographic)
49
+ ::RGeo::Geographic.spherical_factory(config_)
50
+ else
51
+ ::RGeo::Cartesian.preferred_factory(config_)
52
+ end
53
+ end
65
54
 
66
55
 
67
- class << self
56
+ # An object that manages the RGeo factories for a ConnectionPool.
57
+
58
+ class RGeoFactorySettings
59
+
60
+ def initialize # :nodoc:
61
+ @factory_generators = {}
62
+ @column_factories = {}
63
+ end
64
+
65
+
66
+ # Get the default factory generator for the given table
67
+
68
+ def get_factory_generator(table_name_)
69
+ @factory_generators[table_name_.to_s] || ::RGeo::ActiveRecord::DEFAULT_FACTORY_GENERATOR
70
+ end
71
+
72
+
73
+ # Set the default factory generator for the given table
74
+
75
+ def set_factory_generator(table_name_, gen_)
76
+ @factory_generators[table_name_.to_s] = gen_
77
+ end
78
+
79
+
80
+ # Get the factory or factory generator for the given table name
81
+ # and column name.
82
+
83
+ def get_column_factory(table_name_, column_name_, params_=nil)
84
+ table_name_ = table_name_.to_s
85
+ column_name_ = column_name_.to_s
86
+ result_ = (@column_factories[table_name_] ||= {})[column_name_] ||
87
+ @factory_generators[table_name_] || ::RGeo::ActiveRecord::DEFAULT_FACTORY_GENERATOR
88
+ if params_ && !result_.kind_of?(::RGeo::Feature::Factory::Instance)
89
+ result_ = result_.call(params_)
90
+ end
91
+ result_
92
+ end
93
+
94
+
95
+ # Set the factory or factory generator for the given table name
96
+ # and column name.
97
+
98
+ def set_column_factory(table_name_, column_name_, factory_)
99
+ (@column_factories[table_name_.to_s] ||= {})[column_name_.to_s] = factory_
100
+ end
101
+
102
+
103
+ # Clear settings for the given table name, or for all tables
104
+
105
+ def clear!(table_name_=nil)
106
+ if table_name_
107
+ table_name_ = table_name_.to_s
108
+ @factory_generators.delete(table_name_)
109
+ @column_factories.delete(table_name_)
110
+ else
111
+ @factory_generators.clear
112
+ @column_factories.clear
113
+ end
114
+ end
115
+
116
+
117
+ end
118
+
119
+
120
+ # Additional class methods on ::ActiveRecord::Base that provide
121
+ # a way to control the RGeo factory used for ActiveRecord objects.
122
+
123
+ module ActiveRecordBaseFactorySettings
124
+
125
+
126
+ # Return the RGeoFactorySettings object associated with this
127
+ # class's connection.
128
+
129
+ def rgeo_factory_settings
130
+ connection_pool.rgeo_factory_settings
131
+ end
132
+
133
+
134
+ # The value of this attribute is a RGeo::Feature::FactoryGenerator
135
+ # that is used to generate the proper factory when loading geometry
136
+ # objects from the database. For example, if the data being loaded
137
+ # has M but not Z coordinates, and an embedded SRID, then this
138
+ # FactoryGenerator is called with the appropriate configuration to
139
+ # obtain a factory with those properties. This factory is the one
140
+ # associated with the actual geometry properties of the ActiveRecord
141
+ # object. The result of this generator can be overridden by setting
142
+ # an explicit factory for a given class and column using the
143
+ # column_rgeo_factory method.
144
+
145
+ def rgeo_factory_generator
146
+ rgeo_factory_settings.get_factory_generator(table_name)
147
+ end
148
+
149
+
150
+ # Set the rgeo_factory_generator attribute
151
+
152
+ def rgeo_factory_generator=(gen_)
153
+ rgeo_factory_settings.set_factory_generator(table_name, gen_)
154
+ end
68
155
 
69
156
 
70
157
  # This is a convenient way to set the rgeo_factory_generator by
71
158
  # passing a block.
72
159
 
73
160
  def to_generate_rgeo_factory(&block_)
74
- self.rgeo_factory_generator = block_
161
+ rgeo_factory_settings.set_factory_generator(table_name, block_)
75
162
  end
76
163
 
77
164
 
@@ -79,9 +166,8 @@ module ActiveRecord
79
166
  # column name. This setting, if present, overrides the result of the
80
167
  # rgeo_factory_generator.
81
168
 
82
- def set_rgeo_factory_for_column(column_, factory_)
83
- @rgeo_factory_for_column = {} unless defined?(@rgeo_factory_for_column)
84
- @rgeo_factory_for_column[column_.to_sym] = factory_
169
+ def set_rgeo_factory_for_column(column_name_, factory_)
170
+ rgeo_factory_settings.set_column_factory(table_name, column_name_, factory_)
85
171
  end
86
172
 
87
173
 
@@ -94,18 +180,42 @@ module ActiveRecord
94
180
  # rgeo_factory_generator for this class.
95
181
 
96
182
  def rgeo_factory_for_column(column_, params_=nil)
97
- @rgeo_factory_for_column = {} unless defined?(@rgeo_factory_for_column)
98
- result_ = @rgeo_factory_for_column[column_.to_sym] || rgeo_factory_generator || ::RGeo::ActiveRecord::DEFAULT_FACTORY_GENERATOR
99
- if params_ && !result_.kind_of?(::RGeo::Feature::Factory::Instance)
100
- result_ = result_.call(params_)
183
+ rgeo_factory_settings.get_column_factory(table_name, column_name_, params_)
184
+ end
185
+
186
+
187
+ end
188
+
189
+ ::ActiveRecord::Base.extend(ActiveRecordBaseFactorySettings)
190
+
191
+
192
+ # :stopdoc:
193
+
194
+
195
+ # Patch for connection pool to track geo factories per table name
196
+
197
+ ::ActiveRecord::ConnectionAdapters::ConnectionPool.class_eval do
198
+
199
+ def rgeo_factory_settings
200
+ @_rgeo_factory_settings ||= RGeoFactorySettings.new
201
+ end
202
+
203
+ private
204
+ alias_method :new_connection_without_rgeo_modification, :new_connection
205
+ def new_connection
206
+ result_ = new_connection_without_rgeo_modification
207
+ if result_.respond_to?(:set_rgeo_factory_settings)
208
+ result_.set_rgeo_factory_settings(rgeo_factory_settings)
101
209
  end
102
210
  result_
103
211
  end
104
212
 
105
-
106
213
  end
107
214
 
215
+
216
+ # :startdoc:
217
+
218
+
108
219
  end
109
220
 
110
-
111
221
  end
@@ -1,6 +1,6 @@
1
1
  # -----------------------------------------------------------------------------
2
2
  #
3
- # Mysqlgeo adapter for ActiveRecord
3
+ # Various Arel hacks to support spatial queries
4
4
  #
5
5
  # -----------------------------------------------------------------------------
6
6
  # Copyright 2010 Daniel Azuma
@@ -72,30 +72,6 @@ module RGeo
72
72
  end
73
73
 
74
74
 
75
- # Returns a true value if the given node is of spatial type-- that
76
- # is, if it is a spatial literal or a reference to a spatial
77
- # attribute.
78
-
79
- def node_has_spatial_type?(node_)
80
- case node_
81
- when ::Arel::Attribute
82
- @connection.instance_variable_set(:@_getting_columns, true)
83
- begin
84
- col_ = node_.column
85
- col_ && col_.respond_to?(:spatial?) && col_.spatial? ? true : false
86
- ensure
87
- @connection.instance_variable_set(:@_getting_columns, false)
88
- end
89
- when ::RGeo::ActiveRecord::SpatialNamedFunction
90
- node_.spatial_result?
91
- when ::RGeo::ActiveRecord::SpatialConstantNode, ::RGeo::Feature::Instance
92
- true
93
- else
94
- false
95
- end
96
- end
97
-
98
-
99
75
  # Generates SQL for a spatial node.
100
76
  # The node must be a string (in which case it is treated as WKT),
101
77
  # an RGeo feature, or a spatial attribute.
@@ -112,71 +88,52 @@ module RGeo
112
88
  end
113
89
 
114
90
 
115
- def _check_equality_for_rgeo(node_, negate_) # :nodoc:
116
- left_ = node_.left
117
- right_ = node_.right
118
- if !@connection.instance_variable_get(:@_getting_columns) && !right_.nil? && (node_has_spatial_type?(left_) || node_has_spatial_type?(right_))
119
- "#{negate_ ? 'NOT ' : ''}#{st_func('ST_Equals')}(#{visit_in_spatial_context(left_)}, #{visit_in_spatial_context(right_)})"
120
- else
121
- false
122
- end
123
- end
124
-
125
-
126
- # Override equality nodes to use the ST_Equals function if at least
127
- # one of the operands is a spatial node.
128
-
129
- def visit_Arel_Nodes_Equality(node_)
130
- _check_equality_for_rgeo(node_, false) || super
131
- end
132
-
133
-
134
- # Override equality nodes to use the ST_Equals function if at least
135
- # one of the operands is a spatial node.
136
-
137
- def visit_Arel_Nodes_NotEqual(node_)
138
- _check_equality_for_rgeo(node_, true) || super
139
- end
140
-
141
91
  end
142
92
 
143
93
 
144
- end
145
-
146
- end
147
-
148
-
149
- # :stopdoc:
150
-
151
-
152
- # This node wraps an RGeo feature and gives it spatial expression
153
- # constructors.
154
-
155
- module RGeo
156
- module ActiveRecord
94
+ # This node wraps an RGeo feature and gives it spatial expression
95
+ # constructors.
157
96
 
158
97
  class SpatialConstantNode
159
98
 
160
99
  include ::RGeo::ActiveRecord::SpatialExpressions
161
100
 
101
+
102
+ # The delegate should be the RGeo feature.
103
+
162
104
  def initialize(delegate_)
163
105
  @delegate = delegate_
164
106
  end
165
107
 
108
+
109
+ # Return the RGeo feature
110
+
166
111
  attr_reader :delegate
167
112
 
113
+
168
114
  end
169
115
 
170
- end
171
- end
172
-
173
-
174
- # Make sure the standard Arel visitors can handle RGeo feature objects
175
- # by default.
176
-
177
- module Arel
178
- module Visitors
179
- class Visitor
116
+
117
+ # :stopdoc:
118
+
119
+
120
+ # Hack Arel Attributes dispatcher to recognize geometry columns.
121
+ # This is deprecated but necessary to support legacy Arel versions.
122
+
123
+ if ::Arel::Attributes.method_defined?(:for)
124
+ module ArelAttributesLegacyClassMethods
125
+ def for(column_)
126
+ column_.type == :spatial ? Attribute : super
127
+ end
128
+ end
129
+ ::Arel::Attributes.extend(ArelAttributesLegacyClassMethods)
130
+ end
131
+
132
+
133
+ # Make sure the standard Arel visitors can handle RGeo feature objects
134
+ # by default.
135
+
136
+ ::Arel::Visitors::Visitor.class_eval do
180
137
  def visit_RGeo_ActiveRecord_SpatialConstantNode(node_)
181
138
  if respond_to?(:visit_in_spatial_context)
182
139
  visit_in_spatial_context(node_.delegate)
@@ -185,66 +142,69 @@ module Arel
185
142
  end
186
143
  end
187
144
  end
188
- class Dot
145
+ ::Arel::Visitors::Dot.class_eval do
189
146
  alias :visit_RGeo_Feature_Instance :visit_String
190
147
  end
191
- class DepthFirst
148
+ ::Arel::Visitors::DepthFirst.class_eval do
192
149
  alias :visit_RGeo_Feature_Instance :terminal
193
150
  end
194
- class ToSql
151
+ ::Arel::Visitors::ToSql.class_eval do
195
152
  alias :visit_RGeo_Feature_Instance :visit_String
196
153
  end
197
- end
198
- end
199
-
200
-
201
- # Add tools to build spatial structures in the AST.
202
- # This stuff requires Arel 2.1 or later.
203
-
204
- if defined?(::Arel::Nodes::NamedFunction)
205
-
206
- # Allow chaining of predications from named functions
207
- # (Hack because Arel doesn't do this but should.)
208
- ::Arel::Nodes::NamedFunction.class_eval do
209
- include ::Arel::Predications unless include?(::Arel::Predications)
210
- end
211
-
212
- # Allow chaining of spatial expressions from attributes
213
- ::Arel::Attribute.class_eval do
214
- include ::RGeo::ActiveRecord::SpatialExpressions
215
- end
216
-
217
-
218
- # A NamedFunction subclass that keeps track of the spatial-ness of
219
- # the arguments and return values, so that it can provide context to
220
- # visitors that want to interpret syntax differently when dealing with
221
- # spatial elements.
222
-
223
- class ::RGeo::ActiveRecord::SpatialNamedFunction < ::Arel::Nodes::NamedFunction
224
154
 
225
- include ::RGeo::ActiveRecord::SpatialExpressions
226
155
 
227
- def initialize(name_, expr_, spatial_flags_=[], aliaz_=nil)
228
- super(name_, expr_, aliaz_)
229
- @spatial_flags = spatial_flags_
230
- end
156
+ # Add tools to build spatial structures in the AST.
157
+ # This stuff requires Arel 2.1 or later.
231
158
 
232
- def spatial_result?
233
- @spatial_flags.first
159
+ if defined?(::Arel::Nodes::NamedFunction)
160
+
161
+ # Allow chaining of predications from named functions
162
+ # (Some older versions of Arel didn't do this.)
163
+ ::Arel::Nodes::NamedFunction.class_eval do
164
+ include ::Arel::Predications unless include?(::Arel::Predications)
165
+ end
166
+
167
+ # Allow chaining of spatial expressions from attributes
168
+ ::Arel::Attribute.class_eval do
169
+ include ::RGeo::ActiveRecord::SpatialExpressions
170
+ end
171
+
172
+
173
+ # A NamedFunction subclass that keeps track of the spatial-ness of
174
+ # the arguments and return values, so that it can provide context to
175
+ # visitors that want to interpret syntax differently when dealing with
176
+ # spatial elements.
177
+
178
+ class SpatialNamedFunction < ::Arel::Nodes::NamedFunction
179
+
180
+ include ::RGeo::ActiveRecord::SpatialExpressions
181
+
182
+ def initialize(name_, expr_, spatial_flags_=[], aliaz_=nil)
183
+ super(name_, expr_, aliaz_)
184
+ @spatial_flags = spatial_flags_
185
+ end
186
+
187
+ def spatial_result?
188
+ @spatial_flags.first
189
+ end
190
+
191
+ def spatial_argument?(index_)
192
+ @spatial_flags[index_+1]
193
+ end
194
+
195
+ end
196
+
197
+ else
198
+
199
+ # A dummy SpatialNamedFunction for pre-2.1 versions of Arel.
200
+ class SpatialNamedFunction; end
201
+
234
202
  end
235
203
 
236
- def spatial_argument?(index_)
237
- @spatial_flags[index_+1]
238
- end
204
+
205
+ # :startdoc:
206
+
239
207
 
240
208
  end
241
209
 
242
- else
243
-
244
- # A dummy SpatialNamedFunction for pre-2.1 versions of Arel.
245
- class ::RGeo::ActiveRecord::SpatialNamedFunction; end
246
-
247
210
  end
248
-
249
-
250
- # :startdoc:
@@ -34,6 +34,11 @@
34
34
  ;
35
35
 
36
36
 
37
+ require 'active_record'
38
+
39
+ ::ActiveRecord::ConnectionAdapters::AbstractAdapter
40
+
41
+
37
42
  module RGeo
38
43
 
39
44
  module ActiveRecord
@@ -43,29 +48,18 @@ module RGeo
43
48
  # databases. Individual adapters may add to or override this list.
44
49
 
45
50
  DEFAULT_SPATIAL_COLUMN_CONSTRUCTORS = {
46
- :spatial => {:type => 'geometry'},
47
- :geometry => {},
48
- :point => {},
49
- :line_string => {},
50
- :polygon => {},
51
- :geometry_collection => {},
52
- :multi_line_string => {},
53
- :multi_point => {},
54
- :multi_polygon => {},
51
+ :spatial => {:type => 'geometry'}.freeze,
52
+ :geometry => {}.freeze,
53
+ :point => {}.freeze,
54
+ :line_string => {}.freeze,
55
+ :polygon => {}.freeze,
56
+ :geometry_collection => {}.freeze,
57
+ :multi_line_string => {}.freeze,
58
+ :multi_point => {}.freeze,
59
+ :multi_polygon => {}.freeze,
55
60
  }.freeze
56
61
 
57
62
 
58
- # The default factory generator for ActiveRecord::Base.
59
-
60
- DEFAULT_FACTORY_GENERATOR = ::Proc.new do |config_|
61
- if config_.delete(:geographic)
62
- ::RGeo::Geographic.spherical_factory(config_)
63
- else
64
- ::RGeo::Cartesian.preferred_factory(config_)
65
- end
66
- end
67
-
68
-
69
63
  # Index definition struct with a spatial flag field.
70
64
 
71
65
  class SpatialIndexDefinition < ::Struct.new(:table, :name, :unique, :columns, :lengths, :spatial)
@@ -89,46 +83,12 @@ module RGeo
89
83
  end
90
84
 
91
85
 
92
- end
93
-
94
- end
95
-
96
-
97
- # :stopdoc:
98
-
99
-
100
- # Make sure a few things are autoloaded before we modify them.
101
- ::Arel::Attributes
102
- ::ActiveRecord::ConnectionAdapters::AbstractAdapter
103
- ::ActiveRecord::ConnectionAdapters::TableDefinition
104
- ::ActiveRecord::ConnectionAdapters::Table
105
- ::ActiveRecord::Base
106
- ::ActiveRecord::SchemaDumper
107
-
108
-
109
- # Hack Arel Attributes dispatcher to recognize geometry columns.
110
- # This is deprecated but necessary to support legacy Arel versions.
111
-
112
- module Arel
113
- module Attributes
114
- class << self
115
- if method_defined?(:for)
116
- alias_method :for_without_rgeo_modification, :for
117
- def for(column_)
118
- column_.type == :spatial ? Attribute : for_without_rgeo_modification(column_)
119
- end
120
- end
121
- end
122
- end
123
- end
124
-
125
-
126
- # Provide methods for each geometric subtype during table definitions.
127
-
128
- module ActiveRecord
129
- module ConnectionAdapters
130
- class TableDefinition
131
-
86
+ # :stopdoc:
87
+
88
+
89
+ # Provide methods for each geometric subtype during table definitions.
90
+
91
+ ::ActiveRecord::ConnectionAdapters::TableDefinition.class_eval do
132
92
  alias_method :method_missing_without_rgeo_modification, :method_missing
133
93
  def method_missing(method_name_, *args_, &block_)
134
94
  if @base.respond_to?(:spatial_column_constructor) && (info_ = @base.spatial_column_constructor(method_name_))
@@ -142,18 +102,12 @@ module ActiveRecord
142
102
  method_missing_without_rgeo_modification(method_name_, *args_, &block_)
143
103
  end
144
104
  end
145
-
146
105
  end
147
- end
148
- end
149
-
150
-
151
- # Provide methods for each geometric subtype during table changes.
152
-
153
- module ActiveRecord
154
- module ConnectionAdapters
155
- class Table
156
-
106
+
107
+
108
+ # Provide methods for each geometric subtype during table changes.
109
+
110
+ ::ActiveRecord::ConnectionAdapters::Table.class_eval do
157
111
  alias_method :method_missing_without_rgeo_modification, :method_missing
158
112
  def method_missing(method_name_, *args_, &block_)
159
113
  if @base.respond_to?(:spatial_column_constructor) && (info_ = @base.spatial_column_constructor(method_name_))
@@ -167,62 +121,43 @@ module ActiveRecord
167
121
  method_missing_without_rgeo_modification(method_name_, *args_, &block_)
168
122
  end
169
123
  end
170
-
171
124
  end
172
- end
173
- end
174
-
175
-
176
- # When creating column objects, cause the enclosing ActiveRecord class
177
- # to be set on any column that recognizes it. This is commonly used by
178
- # spatial column subclasses.
179
-
180
- module ActiveRecord
181
- class Base
182
- class << self
183
- alias_method :columns_without_rgeo_modification, :columns
184
- def columns
185
- unless defined?(@columns) && @columns
186
- columns_without_rgeo_modification.each do |column_|
187
- column_.set_ar_class(self) if column_.respond_to?(:set_ar_class)
125
+
126
+
127
+ # Hack schema dumper to output spatial index flag
128
+
129
+ ::ActiveRecord::SchemaDumper.class_eval do
130
+ private
131
+ def indexes(table_, stream_)
132
+ if (indexes_ = @connection.indexes(table_)).any?
133
+ add_index_statements_ = indexes_.map do |index_|
134
+ statement_parts_ = [
135
+ ('add_index ' + index_.table.inspect),
136
+ index_.columns.inspect,
137
+ (':name => ' + index_.name.inspect),
138
+ ]
139
+ statement_parts_ << ':unique => true' if index_.unique
140
+ statement_parts_ << ':spatial => true' if index_.respond_to?(:spatial) && index_.spatial
141
+ index_lengths_ = (index_.lengths || []).compact
142
+ statement_parts_ << (':length => ' + ::Hash[*index_.columns.zip(index_.lengths).flatten].inspect) unless index_lengths_.empty?
143
+ ' ' + statement_parts_.join(', ')
188
144
  end
145
+ stream_.puts add_index_statements_.sort.join("\n")
146
+ stream_.puts
189
147
  end
190
- @columns
191
- end
192
- end
193
- end
194
- end
195
-
196
-
197
- # Hack schema dumper to output spatial index flag
198
-
199
- module ActiveRecord
200
- class SchemaDumper
201
- private
202
- def indexes(table_, stream_)
203
- if (indexes_ = @connection.indexes(table_)).any?
204
- add_index_statements_ = indexes_.map do |index_|
205
- statement_parts_ = [ ('add_index ' + index_.table.inspect) ]
206
- statement_parts_ << index_.columns.inspect
207
- statement_parts_ << (':name => ' + index_.name.inspect)
208
- statement_parts_ << ':unique => true' if index_.unique
209
- statement_parts_ << ':spatial => true' if index_.respond_to?(:spatial) && index_.spatial
210
- index_lengths_ = index_.lengths.compact if index_.lengths.is_a?(::Array)
211
- statement_parts_ << (':length => ' + ::Hash[*index_.columns.zip(index_.lengths).flatten].inspect) if index_lengths_.present?
212
- ' ' + statement_parts_.join(', ')
213
- end
214
- stream_.puts add_index_statements_.sort.join("\n")
215
- stream_.puts
216
148
  end
217
149
  end
150
+
151
+
152
+ # Tell ActiveRecord to cache spatial attribute values so they don't get
153
+ # re-parsed on every access.
154
+
155
+ ::ActiveRecord::Base.attribute_types_cached_by_default << :spatial
156
+
157
+
158
+ # :startdoc:
159
+
160
+
218
161
  end
162
+
219
163
  end
220
-
221
-
222
- # Tell ActiveRecord to cache spatial attribute values so they don't get
223
- # re-parsed on every access.
224
-
225
- ::ActiveRecord::Base.attribute_types_cached_by_default << :spatial
226
-
227
-
228
- # :startdoc:
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rgeo-activerecord
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.3.4
5
+ version: 0.4.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Daniel Azuma
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-23 00:00:00 Z
13
+ date: 2011-08-15 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rgeo
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 0.3.0
23
+ version: 0.3.2
24
24
  type: :runtime
25
25
  version_requirements: *id001
26
26
  - !ruby/object:Gem::Dependency
@@ -91,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
91
91
  requirements: []
92
92
 
93
93
  rubyforge_project: virtuoso
94
- rubygems_version: 1.8.2
94
+ rubygems_version: 1.8.7
95
95
  signing_key:
96
96
  specification_version: 3
97
97
  summary: An RGeo module providing spatial extensions to ActiveRecord.