mongoid_spacial 0.2.3 → 0.2.4
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/VERSION +1 -1
- data/lib/mongoid_spacial/contexts/mongo.rb +12 -9
- data/lib/mongoid_spacial/criterion/near_spacial.rb +21 -18
- data/lib/mongoid_spacial/criterion/within_spacial.rb +15 -13
- data/lib/mongoid_spacial/spacial/core_ext.rb +7 -7
- data/lib/mongoid_spacial/spacial/document.rb +2 -2
- data/mongoid_spacial.gemspec +2 -2
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.4
|
@@ -37,7 +37,7 @@ module Mongoid #:nodoc:
|
|
37
37
|
|
38
38
|
# set default opts
|
39
39
|
opts[:skip] ||= 0
|
40
|
-
|
40
|
+
|
41
41
|
if unit = Mongoid::Spacial.earth_radius[opts[:unit]]
|
42
42
|
opts[:unit] = (opts[:spherical]) ? unit : unit * Mongoid::Spacial::RAD_PER_DEG
|
43
43
|
end
|
@@ -47,13 +47,14 @@ module Mongoid #:nodoc:
|
|
47
47
|
end
|
48
48
|
|
49
49
|
opts[:distance_multiplier] = opts[:unit] if opts[:unit].kind_of?(Numeric)
|
50
|
-
|
50
|
+
|
51
51
|
# setup paging.
|
52
52
|
if opts.has_key?(:page)
|
53
53
|
opts[:page] ||= 1
|
54
54
|
opts[:paginator] ||= Mongoid::Spacial.paginator()
|
55
55
|
|
56
|
-
|
56
|
+
if opts[:per_page].blank?
|
57
|
+
opts[:per_page] = case opts[:paginator]
|
57
58
|
when :will_paginate
|
58
59
|
@document.per_page
|
59
60
|
when :kaminari
|
@@ -61,6 +62,8 @@ module Mongoid #:nodoc:
|
|
61
62
|
else
|
62
63
|
Mongoid::Spacial.default_per_page
|
63
64
|
end
|
65
|
+
end
|
66
|
+
|
64
67
|
end
|
65
68
|
opts[:query] = create_geo_near_query(center,opts)
|
66
69
|
results = klass.db.command(opts[:query])
|
@@ -78,11 +81,11 @@ module Mongoid #:nodoc:
|
|
78
81
|
|
79
82
|
# create limit and use skip
|
80
83
|
if opts[:num]
|
81
|
-
query['num'] = opts[:skip] + opts[:num].to_i
|
84
|
+
query['num'] = opts[:skip].to_i + opts[:num].to_i
|
82
85
|
elsif opts[:limit]
|
83
|
-
query['num'] = opts[:skip] + opts[:limit]
|
86
|
+
query['num'] = opts[:skip].to_i + opts[:limit].to_i
|
84
87
|
elsif opts[:page]
|
85
|
-
query['num'] = opts[:skip] +(opts[:page] * opts[:per_page])
|
88
|
+
query['num'] = opts[:skip].to_i + (opts[:page].to_i * opts[:per_page].to_i)
|
86
89
|
end
|
87
90
|
|
88
91
|
# allow the use of complex werieis
|
@@ -93,8 +96,8 @@ module Mongoid #:nodoc:
|
|
93
96
|
end
|
94
97
|
|
95
98
|
if opts[:max_distance]
|
96
|
-
query['maxDistance'] = opts[:max_distance]
|
97
|
-
query['maxDistance'] = query['maxDistance']/opts[:unit] if opts[:unit]
|
99
|
+
query['maxDistance'] = opts[:max_distance].to_f
|
100
|
+
query['maxDistance'] = query['maxDistance']/opts[:unit].to_f if opts[:unit]
|
98
101
|
end
|
99
102
|
|
100
103
|
if klass.db.connection.server_version >= '1.7'
|
@@ -102,7 +105,7 @@ module Mongoid #:nodoc:
|
|
102
105
|
|
103
106
|
# mongodb < 1.7 returns degrees but with earth flat. in Mongodb 1.7 you can set sphere and let mongodb calculate the distance in Miles or KM
|
104
107
|
# for mongodb < 1.7 we need to run Haversine first before calculating degrees to Km or Miles. See below.
|
105
|
-
query['distanceMultiplier'] = opts[:distance_multiplier] if opts[:distance_multiplier]
|
108
|
+
query['distanceMultiplier'] = opts[:distance_multiplier].to_f if opts[:distance_multiplier]
|
106
109
|
end
|
107
110
|
query
|
108
111
|
end
|
@@ -5,38 +5,41 @@ module Mongoid #:nodoc:
|
|
5
5
|
# NearSpecial criterion is used when performing #near with symbols to get
|
6
6
|
# get a shorthand syntax for where clauses.
|
7
7
|
#
|
8
|
-
# @example
|
8
|
+
# @example Coninputersion of a simple to complex criterion.
|
9
9
|
# { :field => { "$nearSphere" => => [20,30]}, '$maxDistance' => 5 }
|
10
10
|
# becomes:
|
11
11
|
# { :field.near(:sphere) => {:point => [20,30], :max => 5, :unit => :km} }
|
12
12
|
class NearSpacial < Complex
|
13
13
|
|
14
|
-
#
|
14
|
+
# Coninputert input to query for near or nearSphere
|
15
15
|
#
|
16
16
|
# @example
|
17
17
|
# near = NearSpacial.new(:key => :field, :operator => "near")
|
18
|
-
# near.to_mongo_query({:point => [:50,50], :
|
18
|
+
# near.to_mongo_query({:point => [:50,50], :max => 5, :unit => :km}) => { '$near : [50,50]' , '$maxDistance' : 5 }
|
19
19
|
#
|
20
|
-
# @param [Hash,Array]
|
21
|
-
def to_mongo_query(
|
22
|
-
if
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
20
|
+
# @param [Hash,Array] input input to coninputer to query
|
21
|
+
def to_mongo_query(input)
|
22
|
+
if input.kind_of?(Hash)
|
23
|
+
raise ':point required to make valid query' unless input[:point]
|
24
|
+
input[:point] = input[:point].to_lng_lat if input[:point].respond_to?(:to_lng_lat)
|
25
|
+
query = {"$#{operator}" => input[:point] }
|
26
|
+
if input[:max]
|
27
|
+
query['$maxDistance'] = input[:max].to_f
|
28
|
+
|
29
|
+
if unit = Mongoid::Spacial.earth_radius[input[:unit]]
|
27
30
|
unit *= Mongoid::Spacial::RAD_PER_DEG unless operator =~ /sphere/i
|
28
|
-
|
29
|
-
else
|
30
|
-
query['$maxDistance'] = v[:max]
|
31
|
+
input[:unit] = unit
|
31
32
|
end
|
33
|
+
|
34
|
+
query['$maxDistance'] = query['$maxDistance']/input[:unit].to_f if input[:unit]
|
32
35
|
end
|
33
36
|
query
|
34
|
-
elsif
|
35
|
-
if
|
36
|
-
{"$#{operator}" =>
|
37
|
+
elsif input.kind_of? Array
|
38
|
+
if input.first.kind_of? Numeric
|
39
|
+
{"$#{operator}" => input }
|
37
40
|
else
|
38
|
-
|
39
|
-
{"$#{operator}" =>
|
41
|
+
input[0] = input[0].to_lng_lat if input[0].respond_to?(:to_lng_lat)
|
42
|
+
{"$#{operator}" => input[0], '$maxDistance' => input[1] }
|
40
43
|
end
|
41
44
|
end
|
42
45
|
end
|
@@ -28,20 +28,22 @@ module Mongoid #:nodoc:
|
|
28
28
|
end
|
29
29
|
elsif ['center','centerSphere'].index(@operator)
|
30
30
|
|
31
|
-
if input.kind_of?
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
input =
|
40
|
-
else
|
41
|
-
input = input[:point]
|
31
|
+
if input.kind_of?(Hash) || input.kind_of?(ActiveSupport::OrderedHash)
|
32
|
+
raise ':point required to make valid query' unless input[:point]
|
33
|
+
input[:point] = input[:point].to_lng_lat if input[:point].respond_to?(:to_lng_lat)
|
34
|
+
if input[:max]
|
35
|
+
input[:max] = input[:max].to_f
|
36
|
+
|
37
|
+
if unit = Mongoid::Spacial.earth_radius[input[:unit]]
|
38
|
+
unit *= Mongoid::Spacial::RAD_PER_DEG unless operator =~ /sphere/i
|
39
|
+
input[:unit] = unit
|
42
40
|
end
|
43
|
-
|
44
|
-
input = input.
|
41
|
+
|
42
|
+
input[:max] = input[:max]/input[:unit].to_f if input[:unit]
|
43
|
+
|
44
|
+
input = [input[:point],input[:max]]
|
45
|
+
else
|
46
|
+
input = input[:point]
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
@@ -2,7 +2,7 @@ class Array
|
|
2
2
|
def to_lng_lat
|
3
3
|
self[0..1].map(&:to_f)
|
4
4
|
end
|
5
|
-
end
|
5
|
+
end
|
6
6
|
|
7
7
|
class Hash
|
8
8
|
def to_lng_lat
|
@@ -12,16 +12,16 @@ class Hash
|
|
12
12
|
|
13
13
|
def to_lat
|
14
14
|
v = (Mongoid::Spacial.lat_symbols & self.keys).first
|
15
|
-
return self[v] if !v.nil? && self[v]
|
15
|
+
return self[v].to_f if !v.nil? && self[v]
|
16
16
|
raise "Hash must contain #{Mongoid::Spacial.lat_symbols.inspect} if ruby version is less than 1.9" if RUBY_VERSION.to_f < 1.9
|
17
|
-
raise "Hash cannot contain #{Mongoid::Spacial.lng_symbols.inspect} as the second item if there is no #{Mongoid::Spacial.lat_symbols.inspect}" if Mongoid::Spacial.lng_symbols.index(self.keys[1])
|
18
|
-
self.values[1]
|
17
|
+
raise "Hash cannot contain #{Mongoid::Spacial.lng_symbols.inspect} as the second item if there is no #{Mongoid::Spacial.lat_symbols.inspect}" if Mongoid::Spacial.lng_symbols.index(self.keys[1])
|
18
|
+
self.values[1].to_f
|
19
19
|
end
|
20
20
|
|
21
21
|
def to_lng
|
22
22
|
v = (Mongoid::Spacial.lng_symbols & self.keys).first
|
23
|
-
return self[v] if !v.nil? && self[v]
|
23
|
+
return self[v].to_f if !v.nil? && self[v]
|
24
24
|
raise "Hash cannot contain #{Mongoid::Spacial.lat_symbols.inspect} as the first item if there is no #{Mongoid::Spacial.lng_symbols.inspect}" if Mongoid::Spacial.lat_symbols.index(self.keys[0])
|
25
|
-
self.values[0]
|
25
|
+
self.values[0].to_f
|
26
26
|
end
|
27
|
-
end
|
27
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Mongoid
|
2
2
|
module Spacial
|
3
|
-
module Document
|
3
|
+
module Document
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
included do
|
@@ -22,7 +22,7 @@ module Mongoid
|
|
22
22
|
|
23
23
|
module InstanceMethods #:nodoc:
|
24
24
|
def distance_from(key,p2, unit = nil, formula = nil)
|
25
|
-
p1 =
|
25
|
+
p1 = self.send(key)
|
26
26
|
Mongoid::Spacial.distance(p1, p2, unit, formula = nil)
|
27
27
|
end
|
28
28
|
end
|
data/mongoid_spacial.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{mongoid_spacial}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = [%q{Ryan Ong}]
|
12
|
-
s.date = %q{2011-06-
|
12
|
+
s.date = %q{2011-06-28}
|
13
13
|
s.description = %q{A Mongoid Extention that simplifies and adds support for MongoDB Geo Spacial Calculations.}
|
14
14
|
s.email = %q{ryanong@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: mongoid_spacial
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.2.
|
5
|
+
version: 0.2.4
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Ryan Ong
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-06-
|
13
|
+
date: 2011-06-28 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: mongoid
|
@@ -262,7 +262,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
262
262
|
requirements:
|
263
263
|
- - ">="
|
264
264
|
- !ruby/object:Gem::Version
|
265
|
-
hash: -
|
265
|
+
hash: -3361697488491906909
|
266
266
|
segments:
|
267
267
|
- 0
|
268
268
|
version: "0"
|