mongoid_spacial 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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"