mongoid_geo 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.textile CHANGED
@@ -27,8 +27,8 @@ h3. Create geo-spatial index
27
27
 
28
28
  <pre>
29
29
  class Person
30
- field :locations, :type => Array
31
- index [[ :locations, Mongo::GEO2D ]], :min => -180, :max => 180
30
+ field :location, :type => Array
31
+ index [[ :location, Mongo::GEO2D ]], :min => -180, :max => 180
32
32
  end
33
33
 
34
34
  # to ensure indexes are created, either:
@@ -47,9 +47,9 @@ The following briefly demonstrates all the features that Mongoid Geo currently p
47
47
 
48
48
  h2. Geo index
49
49
 
50
- Old/Manual way: @index [[ :locations, Mongo::GEO2D ]], :min => -180, :max => 180@
50
+ Old/Manual way: @index [[ :location, Mongo::GEO2D ]], :min => -180, :max => 180@
51
51
 
52
- Using new _geo_index_ class method : @geo_index :locations@
52
+ Using new _geo_index_ class method : @geo_index :location@
53
53
 
54
54
  h2. Special geo-array attribute writer
55
55
 
@@ -71,17 +71,27 @@ With the new @:geo@ option supplied by _mongoid-geo_ :
71
71
 
72
72
  <pre>
73
73
  class Person
74
- field :locations, :type => Array, :geo => true
74
+ field :location, :type => Array, :geo => true
75
75
 
76
- geo_index :locations
76
+ geo_index :location
77
77
  end
78
78
 
79
79
  p = Person.new
80
- # set via String or Strings
81
- p.locations = "45.1, -3.4"
82
- p.locations = "45.1", "-3.4"
83
80
 
84
- assert([45.1, -3.4], p.locations)
81
+ # A Geo array can now be set via String or Strings, Hash or Object, here a few examples...
82
+ # Please see geo_fields_spec.rb for more options!
83
+
84
+ p.location = "45.1, -3.4"
85
+ p.location = "45.1", "-3.4"
86
+ p.location = {:lat => 45.1, :lng => -3.4}
87
+ p.location = [{:lat => 45.1, :lng => -3.4}]
88
+ p.location = {:latitude => 45.1, :longitude => -3.4}
89
+
90
+ my_location = Location.new :latitude => 45.1, :longitude => -3.4
91
+ p.location = my_location
92
+
93
+ # for each of the above, the following holds
94
+ assert([45.1, -3.4], p.location)
85
95
  </pre>
86
96
 
87
97
 
@@ -90,7 +100,7 @@ h2. Mongoid Geo extra inclusions
90
100
  Find addresses near a point using spherical distance calculation
91
101
 
92
102
  <pre>
93
- Address.nearSphere(:locations => [ 72, -44 ])
103
+ Address.nearSphere(:location => [ 72, -44 ])
94
104
  </pre>
95
105
 
96
106
 
@@ -99,8 +109,8 @@ h2. Mongoid Geo extra inflections
99
109
  h3. nearSphere
100
110
 
101
111
  <pre>
102
- base.where(:locations.nearSphere => [ 72, -44 ])
103
- # => :locations => { "$nearSphere" : [ 72, -44 ] }
112
+ base.where(:location.nearSphere => [ 72, -44 ])
113
+ # => :location => { "$nearSphere" : [ 72, -44 ] }
104
114
  </pre>
105
115
 
106
116
  h3. nearMax
@@ -108,13 +118,13 @@ h3. nearMax
108
118
  Find points near a given point within a maximum distance
109
119
 
110
120
  <pre>
111
- base.where(:locations.nearMax => [[ 72, -44 ], 5])
121
+ base.where(:location.nearMax => [[ 72, -44 ], 5])
112
122
  # => { $near: [50, 40] , $maxDistance: 3 }
113
123
 
114
- base.where(:locations.nearMax(:sphere) => [[ 72, -44 ], 5])
124
+ base.where(:location.nearMax(:sphere) => [[ 72, -44 ], 5])
115
125
  # => { $nearSphere: [50, 40] , $maxDistanceSphere: 3 }
116
126
 
117
- base.where(:locations.nearMax(:sphere, :flat) => [[ 72, -44 ], 5])
127
+ base.where(:location.nearMax(:sphere, :flat) => [[ 72, -44 ], 5])
118
128
  # => { $nearSphere: [50, 40] , $maxDistance: 3 }
119
129
  </pre>
120
130
 
@@ -124,7 +134,7 @@ You can also use a Hash to define the nearMax
124
134
  places.where(:location.nearMax => {:point => [ 72, -44 ], :distance => 5})
125
135
  </pre>
126
136
 
127
- Or use an Object (which must have the methods #point and #distance that return the point and max distance from that point)
137
+ Or use an Object (which must have the methods @#point@ and @#distance@ that return the point and max distance from that point)
128
138
 
129
139
  <pre>
130
140
  near_max_ = (Struct.new :point, :distance).new
@@ -134,7 +144,7 @@ Or use an Object (which must have the methods #point and #distance that return t
134
144
  places.where(:location.nearMax => near_max)
135
145
  </pre>
136
146
 
137
- Note: For the points, you can also use a hash or an object with the methods/keys, either :lat, lng or :latitude, :longitude
147
+ Note: For the points, you can also use a hash or an object with the methods/keys, either @:lat, :lng@ or @:latitude, :longitude@
138
148
 
139
149
  Example:
140
150
 
@@ -153,10 +163,10 @@ h3. withinBox
153
163
 
154
164
  <pre>
155
165
  box = [[50, 40], [30,55]]
156
- base.where(:locations.withinBox => box)
166
+ base.where(:location.withinBox => box)
157
167
  # => locations: {"$within" : {"$box" : [[50, 40], [30,55]]}
158
168
 
159
- base.where(:locations.withinBox(:sphere) => box)
169
+ base.where(:location.withinBox(:sphere) => box)
160
170
  # => locations: {"$within" : {"$boxSphere" : [[50, 40], [30,55]]}
161
171
  </pre>
162
172
 
@@ -170,7 +180,7 @@ You can also use a Hash to define the box
170
180
  places.where(:location.withinBox => {:lower_left => {:lat => 50, :lng => 40}, :upper_right => [30,55] } )
171
181
  </pre>
172
182
 
173
- Or use an Object (which must have the methods #lower_left and #upper_right that return the points of the bounding box)
183
+ Or use an object (which must have the methods @#lower_left@ and @#upper_right@ that return the points of the bounding box)
174
184
 
175
185
  <pre>
176
186
  box = (Struct.new :lower_left, :upper_right).new
@@ -193,13 +203,13 @@ h3. withinCenter
193
203
  # => places: {"$within" : {"$centerSphere" : [[50, 40], 4]}
194
204
  </pre>
195
205
 
196
- You can also use a Hash to define the circle
206
+ You can also use a hash to define the circle, with @:center@ and @:radius@ keys
197
207
 
198
208
  <pre>
199
209
  places.where(:location.withinCenter => {:center => [50, 40], :radius => 4})
200
210
  </pre>
201
211
 
202
- Or use an Object (which must have the methods #lower_left and #upper_right that return the points of the bounding box)
212
+ Or use an object (which must have the methods #lower_left and #upper_right that return the points of the bounding box)
203
213
 
204
214
  <pre>
205
215
  circle = (Struct.new :center, :radius).new
@@ -21,11 +21,11 @@ module Mongoid #:nodoc:
21
21
  def make_hash v
22
22
  if operator =~ /box/
23
23
  v = extract_box(v) if !v.kind_of?(Array)
24
- v = [to_points(v.first), to_points(v.last)]
24
+ v = [to_point(v.first), to_point(v.last)]
25
25
  end
26
26
 
27
27
  v = extract_circle(v) if !v.kind_of?(Array) && operator =~ /center/
28
- {"$#{outer_op}" => {"$#{operator}" => to_points(v) } }
28
+ {"$#{outer_op}" => {"$#{operator}" => v } }
29
29
  end
30
30
 
31
31
  def hash
@@ -42,11 +42,9 @@ module Mongoid #:nodoc:
42
42
  end
43
43
 
44
44
  protected
45
-
46
- def to_points v
47
- v.extend(Mongoid::Geo::Point).to_points
48
- end
49
-
45
+
46
+ include Mongoid::Geo::PointConversion
47
+
50
48
  def extract_circle(v)
51
49
  case v
52
50
  when Hash
@@ -20,7 +20,7 @@ module Mongoid #:nodoc:
20
20
 
21
21
  def make_hash v
22
22
  v = extract_nearMax(v) if !v.kind_of?(Array) && op_b =~ /max/i
23
- {"$#{op_a}" => to_points(v.first), "$#{op_b}" => to_points(v.last) }
23
+ {"$#{op_a}" => to_point(v.first), "$#{op_b}" => to_point(v.last) }
24
24
  end
25
25
 
26
26
  def hash
@@ -37,12 +37,9 @@ module Mongoid #:nodoc:
37
37
  end
38
38
 
39
39
  protected
40
-
41
- def to_points v
42
- return v if v.kind_of? Fixnum
43
- v.extend(Mongoid::Geo::Point).to_points
44
- end
45
40
 
41
+ include Mongoid::Geo::PointConversion
42
+
46
43
  def extract_nearMax(v)
47
44
  case v
48
45
  when Hash
@@ -8,11 +8,15 @@ module Mongoid #:nodoc
8
8
  define_method("#{meth}=") do |value|
9
9
  if options[:type] == Array && options[:geo]
10
10
  value = case value
11
- when String then value.split(",").map(&:to_f)
12
- when Array then value.map(&:to_f)
13
- else value
11
+ when String
12
+ value.split(",").map(&:to_f)
13
+ when Array
14
+ value.compact.extend(Mongoid::Geo::Point).to_points
15
+ else
16
+ !value.nil? ? value.extend(Mongoid::Geo::Point).to_point : value
14
17
  end
15
18
  end
19
+ value = value[0..1] if !value.nil?
16
20
  write_attribute(name, value)
17
21
  end
18
22
  define_method("#{meth}?") do
@@ -2,17 +2,42 @@ module Mongoid::Geo
2
2
  module Point
3
3
  # convert hash or object to [x, y] of floats
4
4
  def to_points
5
+ v = self.kind_of?(Array) ? self.map {|p| p.kind_of?(Fixnum) ? p.to_f : p.extend(Mongoid::Geo::Point).to_point } : self
6
+ v.flatten
7
+ end
8
+
9
+ def to_point
5
10
  case self
6
11
  when Hash
7
12
  return [self[:lat], self[:lng]] if self[:lat]
8
13
  return [self[:latitude], self[:longitude]] if self[:latitude]
9
14
  raise "Hash must contain either :lat, :lng or :latitude, :longitude keys to be converted to a geo point"
15
+ when nil
16
+ nil
17
+ when Array
18
+ self.map(&:to_f)
10
19
  else
11
20
  return [self.lat, self.lng] if self.respond_to? :lat
12
21
  return [self.latitude, self.longitude] if self.respond_to? :latitude
13
- self
22
+ self.to_f
14
23
  # raise 'Object must contain either #lat, #lng or #latitude, #longitude methods to be converted to a geo point'
15
24
  end
16
25
  end
17
26
  end
18
27
  end
28
+
29
+ module Mongoid::Geo
30
+ module PointConversion
31
+ protected
32
+
33
+ def to_point v
34
+ return v if v.kind_of? Fixnum
35
+ v.extend(Mongoid::Geo::Point).to_point
36
+ end
37
+
38
+ def to_points v
39
+ return v if v.kind_of? Fixnum
40
+ v.extend(Mongoid::Geo::Point).to_points
41
+ end
42
+ end
43
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid_geo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  prerelease: !!null
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,12 @@ authors:
9
9
  autorequire: !!null
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-02-05 00:00:00.000000000 +01:00
12
+ date: 2011-02-06 00:00:00.000000000 +01:00
13
13
  default_executable: !!null
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec
17
- requirement: &2156985600 !ruby/object:Gem::Requirement
17
+ requirement: &2156349680 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *2156985600
25
+ version_requirements: *2156349680
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: mongoid
28
- requirement: &2156984940 !ruby/object:Gem::Requirement
28
+ requirement: &2156349140 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 2.0.0.rc.6
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *2156984940
36
+ version_requirements: *2156349140
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: bson_ext
39
- requirement: &2156984320 !ruby/object:Gem::Requirement
39
+ requirement: &2156348440 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,7 +44,7 @@ dependencies:
44
44
  version: 1.1.6
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *2156984320
47
+ version_requirements: *2156348440
48
48
  description: Geo spatial extension on Mongoid 2, to add more geo-spatial capabilities
49
49
  email:
50
50
  - kmandrup@gmail.com