mongoid_spacial 0.1.0 → 0.1.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/Gemfile CHANGED
@@ -6,11 +6,11 @@ source "http://rubygems.org"
6
6
  # Add dependencies to develop your gem here.
7
7
  # Include everything needed to run rake, tests, features, etc.
8
8
  gem 'mongoid'
9
- gem "bson", '>= 1.3', :platforms => [:jruby] # for non jruby apps, require bson_ext in your Gemfile to boost performance
10
- gem "bson_ext", '>= 1.3', :platforms => [:mri]
11
9
  gem 'activesupport'
12
10
 
13
11
  group :development do
12
+ gem "bson", '>= 1.3', :platforms => [:jruby] # for non jruby apps, require bson_ext in your Gemfile to boost performance
13
+ gem "bson_ext", '>= 1.3', :platforms => [:mri]
14
14
  gem "rspec", "~> 2.3.0"
15
15
  gem "yard", "~> 0.6.0"
16
16
  gem "bundler", "~> 1.0.0"
@@ -25,4 +25,6 @@ end
25
25
 
26
26
  group :test do
27
27
  gem 'mocha'
28
+ gem 'will_paginate'
29
+ gem 'kaminari'
28
30
  end
data/README.md CHANGED
@@ -99,14 +99,15 @@ River.where(:name=>'hudson').geo_near({:lat => 40.73083, :lng => -73.99756})
99
99
  # :max\_distance - Integer
100
100
  # :distance\_multiplier - Integer
101
101
  # :spherical - true - To enable spherical calculations
102
- River.geo_near([-73.99756,40.73083], :max_distance => 4, :unit => :mi, :spherical)
103
-
102
+ # :page - pagination will be enabled if set to any variable including nil, pagination will not be enabled if either :per\_page or :paginator is set
103
+ # :per\_page
104
+ # :paginator - Choose which paginator to use. [default :arrary]
105
+ # Prefered method to set is Mongoid::Spacial.paginator=:array
106
+ # Available Paginators [:kaminari, :will\_paginate, :array]
107
+ # The only thing this does really is configure default per\_page so it is only kind of useful
108
+ River.geo_near([-73.99756,40.73083], :max_distance => 4, :unit => :mi, :spherical => true, :page => 1)
104
109
  ```
105
110
 
106
- ToDo
107
- -----------
108
- 1. Add pagination
109
-
110
111
  Thanks
111
112
  -----------
112
113
  * Thanks to Kristian Mandrup for creating the base of the gem and a few of the tests
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
@@ -39,17 +39,19 @@ module Mongoid #:nodoc:
39
39
  if distance_multiplier = Mongoid::Spacial.earth_radius[opts.delete(:unit)]
40
40
  opts[:distance_multiplier] = distance_multiplier
41
41
  end
42
-
42
+
43
+ # setup paging.
43
44
  if opts.has_key?(:page)
44
45
  opts[:page] ||= 1
45
- opts[:paginator] ||= Mongoid::Spacial.paginator
46
- if opts[:paginator] == :will_paginate
47
- opts[:per_page] ||= klass.per_page
48
- elsif opts[:paginator] == :kaminari
49
- opts[:per_page] ||= Kaminari.config.default_per_page
50
- else
51
- opts[:per_page] ||= 25
52
- end
46
+ opts[:paginator] ||= Mongoid::Spacial.paginator()
47
+
48
+ if opts[:paginator] == :will_paginate
49
+ opts[:per_page] ||= klass.per_page
50
+ elsif opts[:paginator] == :kaminari
51
+ opts[:per_page] ||= Kaminari.config.default_per_page
52
+ else
53
+ opts[:per_page] ||= Mongoid::Spacial.default_per_page
54
+ end
53
55
  end
54
56
  query = create_geo_near_query(center,opts)
55
57
  results = klass.db.command(query)
@@ -36,6 +36,9 @@ module Mongoid
36
36
  @@distance_formula = :n_vector
37
37
 
38
38
  mattr_accessor :paginator
39
- @@paginator = :kaminari
39
+ @@paginator = :array
40
+
41
+ mattr_accessor :default_per_page
42
+ @@default_per_page = 25
40
43
  end
41
44
  end
@@ -5,7 +5,9 @@ module Mongoid
5
5
 
6
6
  def initialize(klass,results,opts = {})
7
7
  raise "class must include Mongoid::Spacial::Document" unless klass.respond_to?(:spacial_fields_indexed)
8
- @klass, @stats,@opts = klass,results['stats'],opts
8
+ @klass = klass
9
+ @opts = opts
10
+ @stats = results['stats']
9
11
 
10
12
  @_original_array = results['results'].collect do |result|
11
13
  res = Mongoid::Factory.from_db(klass, result.delete('obj'))
@@ -18,29 +20,29 @@ module Mongoid
18
20
  res.geo[key.snakecase.to_sym] = value
19
21
  end
20
22
  # dist_options[:formula] = opts[:formula] if opts[:formula]
21
- opts[:calculate] = klass.spacial_fields_indexed if klass.spacial_fields_indexed.kind_of?(Array) && opts[:calculate] == true
22
- if opts[:calculate]
23
- opts[:calculate] = [opts[:calculate]] unless opts[:calculate].kind_of? Array
24
- opts[:calculate] = opts[:calculate].map(&:to_sym) & geo_fields
23
+ @opts[:calculate] = klass.spacial_fields_indexed if klass.spacial_fields_indexed.kind_of?(Array) && @opts[:calculate] == true
24
+ if @opts[:calculate]
25
+ @opts[:calculate] = [@opts[:calculate]] unless @opts[:calculate].kind_of? Array
26
+ @opts[:calculate] = @opts[:calculate].map(&:to_sym) & geo_fields
25
27
  if klass.spacial_fields_indexed.kind_of?(Array) && klass.spacial_fields_indexed.size == 1
26
28
  primary = klass.spacial_fields_indexed.first
27
29
  end
28
- opts[:calculate].each do |key|
30
+ @opts[:calculate].each do |key|
29
31
  key = (key.to_s+'_distance').to_sym
30
- res.geo[key] = res.distance_from(key,center, opts[:distance_multiplier])
32
+ res.geo[key] = res.distance_from(key,center, @opts[:distance_multiplier])
31
33
  res.geo[:distance] = res.geo[key] if primary && key == primary
32
34
  end
33
35
  end
34
36
  res
35
37
  end
36
38
 
37
- if opts[:page]
38
- start = (opts[:page]-1)*opts[:per_page] # assuming current_page is 1 based.
39
- super(@_original_array[start, opts[:per_page]])
40
- elsif opts[:skip] && @_original_array.size > opts[:skip]
41
- super(@_original_array[opts[:skip]..-1])
39
+ if @opts[:page]
40
+ start = (@opts[:page]-1)*@opts[:per_page] # assuming current_page is 1 based.
41
+ super(@_original_array[start, @opts[:per_page]] || [])
42
+ elsif @opts[:skip] && @_original_array.size > @opts[:skip]
43
+ super(@_original_array[@opts[:skip]..-1] || [])
42
44
  else
43
- super(@_original_array)
45
+ super(@_original_array || [])
44
46
  end
45
47
  end
46
48
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mongoid_spacial}
8
- s.version = "0.1.0"
8
+ s.version = "0.1.1"
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}]
@@ -134,9 +134,9 @@ Gem::Specification.new do |s|
134
134
 
135
135
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
136
136
  s.add_runtime_dependency(%q<mongoid>, [">= 0"])
137
- s.add_runtime_dependency(%q<bson>, [">= 1.3"])
138
- s.add_runtime_dependency(%q<bson_ext>, [">= 1.3"])
139
137
  s.add_runtime_dependency(%q<activesupport>, [">= 0"])
138
+ s.add_development_dependency(%q<bson>, [">= 1.3"])
139
+ s.add_development_dependency(%q<bson_ext>, [">= 1.3"])
140
140
  s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
141
141
  s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
142
142
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
@@ -146,9 +146,9 @@ Gem::Specification.new do |s|
146
146
  s.add_development_dependency(%q<ruby-debug19>, [">= 0"])
147
147
  else
148
148
  s.add_dependency(%q<mongoid>, [">= 0"])
149
+ s.add_dependency(%q<activesupport>, [">= 0"])
149
150
  s.add_dependency(%q<bson>, [">= 1.3"])
150
151
  s.add_dependency(%q<bson_ext>, [">= 1.3"])
151
- s.add_dependency(%q<activesupport>, [">= 0"])
152
152
  s.add_dependency(%q<rspec>, ["~> 2.3.0"])
153
153
  s.add_dependency(%q<yard>, ["~> 0.6.0"])
154
154
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
@@ -159,9 +159,9 @@ Gem::Specification.new do |s|
159
159
  end
160
160
  else
161
161
  s.add_dependency(%q<mongoid>, [">= 0"])
162
+ s.add_dependency(%q<activesupport>, [">= 0"])
162
163
  s.add_dependency(%q<bson>, [">= 1.3"])
163
164
  s.add_dependency(%q<bson_ext>, [">= 1.3"])
164
- s.add_dependency(%q<activesupport>, [">= 0"])
165
165
  s.add_dependency(%q<rspec>, ["~> 2.3.0"])
166
166
  s.add_dependency(%q<yard>, ["~> 0.6.0"])
167
167
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
@@ -20,48 +20,50 @@ describe Mongoid::Contexts::Mongo do
20
20
  Bar.geo_near(lax.location, :spherical => true).should == [lax, jfk]
21
21
  Bar.geo_near(jfk.location, :spherical => true).should == [jfk, lax]
22
22
  end
23
-
24
- describe 'option :num' do
25
- it "should limit number of results to 1" do
26
- Bar.geo_near(jfk.location, :num => 1).size.should == 1
23
+ context 'option' do
24
+ context ':num' do
25
+ it "should limit number of results to 1" do
26
+ Bar.geo_near(jfk.location, :num => 1).size.should == 1
27
+ end
27
28
  end
28
- end
29
29
 
30
- describe 'option :maxDistance' do
31
- it "should get 1 item" do
32
- Bar.geo_near(lax.location, :spherical => true, :max_distance => 2465/Mongoid::Spacial.earth_radius[:mi]).size.should == 1
33
- end
34
- it "should get 2 items" do
35
- Bar.geo_near(lax.location, :spherical => true, :max_distance => 2480/Mongoid::Spacial.earth_radius[:mi]).size.should == 2
36
- end
30
+ context ':maxDistance' do
31
+ it "should get 1 item" do
32
+ Bar.geo_near(lax.location, :spherical => true, :max_distance => 2465/Mongoid::Spacial.earth_radius[:mi]).size.should == 1
33
+ end
34
+ it "should get 2 items" do
35
+ Bar.geo_near(lax.location, :spherical => true, :max_distance => 2480/Mongoid::Spacial.earth_radius[:mi]).size.should == 2
36
+ end
37
37
 
38
- end
38
+ end
39
39
 
40
- describe 'option :distance_multiplier' do
41
- it "should multiply returned distance with multiplier" do
40
+ context ':distance_multiplier' do
41
+ it "should multiply returned distance with multiplier" do
42
42
  Bar.geo_near(lax.location, :spherical => true, :distance_multiplier=> Mongoid::Spacial.earth_radius[:mi]).second.geo[:distance].to_i.should be_within(1).of(2469)
43
+ end
43
44
  end
44
- end
45
45
 
46
- describe 'option :unit' do
47
- it "should multiply returned distance with multiplier" do
46
+ context ':unit' do
47
+ it "should multiply returned distance with multiplier" do
48
48
  Bar.geo_near(lax.location, :spherical => true, :unit => :mi).second.geo[:distance].to_i.should be_within(1).of(2469)
49
- end
49
+ end
50
50
 
51
- it "should convert max_distance to radians with unit" do
51
+ it "should convert max_distance to radians with unit" do
52
52
  Bar.geo_near(lax.location, :spherical => true, :max_distance => 2465, :unit => :mi).size.should == 1
53
- end
53
+ end
54
54
 
55
- end
55
+ end
56
56
 
57
- describe 'option :query' do
58
- it "should filter using extra query option" do
59
- # two record in the collection, only one's name is Munich
60
- Bar.geo_near(jfk.location, :query => {:name => jfk.name}).should == [jfk]
57
+ context ':query' do
58
+ it "should filter using extra query option" do
59
+ # two record in the collection, only one's name is Munich
60
+ Bar.geo_near(jfk.location, :query => {:name => jfk.name}).should == [jfk]
61
+ end
61
62
  end
63
+
62
64
  end
63
65
 
64
- describe 'criteria chaining' do
66
+ context 'criteria chaining' do
65
67
  it "should filter by where" do
66
68
  Bar.where(:name => jfk.name).geo_near(jfk.location).should == [jfk]
67
69
  Bar.any_of({:name => jfk.name},{:name => lax.name}).geo_near(jfk.location).should == [jfk,lax]
@@ -78,5 +80,32 @@ describe Mongoid::Contexts::Mongo do
78
80
  end
79
81
 
80
82
  end
83
+
84
+ context ':page' do
85
+ before(:all) do
86
+ Bar.delete_all
87
+ Bar.create_indexes
88
+
89
+ 100.times do
90
+ Bar.create({:location => [rand(360)-180,rand(360)-180]})
91
+ end
92
+ end
93
+ context ":paginator :array" do
94
+ [nil,1,2,3,4].each do |page|
95
+ it "page=#{page} should have 25" do
96
+ Bar.geo_near([1,1], :page => page).size.should == 25
97
+ end
98
+ end
99
+
100
+ it "page=20 should have 0" do
101
+ Bar.geo_near([1,1], :page => 20).size.should == 0
102
+ end
103
+
104
+ it "per_page=5" do
105
+ Bar.geo_near([1,1], :page => 1, :per_page => 5).size.should == 5
106
+ end
107
+ end
108
+ end
109
+
81
110
  end
82
111
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: mongoid_spacial
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.0
5
+ version: 0.1.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Ryan Ong
@@ -24,36 +24,36 @@ dependencies:
24
24
  prerelease: false
25
25
  version_requirements: *id001
26
26
  - !ruby/object:Gem::Dependency
27
- name: bson
27
+ name: activesupport
28
28
  requirement: &id002 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: "1.3"
33
+ version: "0"
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: *id002
37
37
  - !ruby/object:Gem::Dependency
38
- name: bson_ext
38
+ name: bson
39
39
  requirement: &id003 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ">="
43
43
  - !ruby/object:Gem::Version
44
44
  version: "1.3"
45
- type: :runtime
45
+ type: :development
46
46
  prerelease: false
47
47
  version_requirements: *id003
48
48
  - !ruby/object:Gem::Dependency
49
- name: activesupport
49
+ name: bson_ext
50
50
  requirement: &id004 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ">="
54
54
  - !ruby/object:Gem::Version
55
- version: "0"
56
- type: :runtime
55
+ version: "1.3"
56
+ type: :development
57
57
  prerelease: false
58
58
  version_requirements: *id004
59
59
  - !ruby/object:Gem::Dependency
@@ -261,7 +261,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
261
261
  requirements:
262
262
  - - ">="
263
263
  - !ruby/object:Gem::Version
264
- hash: -2362332534301507743
264
+ hash: 3825965172872748297
265
265
  segments:
266
266
  - 0
267
267
  version: "0"