rsolr 1.0.2 → 1.0.3
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/README.rdoc +9 -4
- data/VERSION +1 -1
- data/lib/rsolr/char.rb +1 -1
- data/lib/rsolr/client.rb +30 -12
- data/lib/rsolr/connection.rb +17 -9
- data/lib/rsolr/response.rb +51 -0
- data/lib/rsolr/xml.rb +0 -1
- data/lib/rsolr.rb +1 -1
- data/spec/api/pagination_spec.rb +10 -22
- metadata +72 -10
- data/lib/rsolr/pagination.rb +0 -122
data/README.rdoc
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
|
3
3
|
A simple, extensible Ruby client for Apache Solr.
|
4
4
|
|
5
|
-
Notice: This document is only for the the 1.0 in the master. The last pre
|
5
|
+
Notice: This document is only for the the 1.0 in the master. The last pre 1.0 gem release documentation can be found here: http://github.com/mwmitchell/rsolr/tree/v0.12.1
|
6
6
|
|
7
7
|
==Documentation
|
8
|
-
The code docs can be viewed here : http://rdoc.info/projects/mwmitchell/rsolr
|
8
|
+
The code docs for the last *release* can be viewed here : http://rdoc.info/projects/mwmitchell/rsolr
|
9
9
|
|
10
10
|
== Installation:
|
11
|
-
sudo gem install rsolr
|
11
|
+
sudo gem install rsolr
|
12
12
|
|
13
13
|
== Example:
|
14
14
|
require 'rubygems'
|
@@ -184,7 +184,12 @@ The default response format is Ruby. When the :wt param is set to :ruby, the res
|
|
184
184
|
* Send me a pull request. Bonus points for topic branches.
|
185
185
|
|
186
186
|
==Contributors
|
187
|
+
* Jonathan Rochkind
|
188
|
+
* Chris Beer
|
189
|
+
* Craig Smith
|
190
|
+
* Randy Souza
|
187
191
|
* Colin Steele
|
192
|
+
* Peter Kieltyka
|
188
193
|
* Lorenzo Riccucci
|
189
194
|
* Mike Perham
|
190
195
|
* Mat Brown
|
@@ -193,7 +198,7 @@ The default response format is Ruby. When the :wt param is set to :ruby, the res
|
|
193
198
|
* Fouad Mardini
|
194
199
|
* Jeremy Hinegardner
|
195
200
|
* Nathan Witmer
|
196
|
-
*
|
201
|
+
* "shima"
|
197
202
|
|
198
203
|
==Author
|
199
204
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.3
|
data/lib/rsolr/char.rb
CHANGED
data/lib/rsolr/client.rb
CHANGED
@@ -3,6 +3,7 @@ class RSolr::Client
|
|
3
3
|
attr_reader :connection, :uri, :proxy, :options
|
4
4
|
|
5
5
|
def initialize connection, options = {}
|
6
|
+
@proxy = @uri = nil
|
6
7
|
@connection = connection
|
7
8
|
unless false === options[:url]
|
8
9
|
url = options[:url] ? options[:url].dup : 'http://127.0.0.1:8983/solr/'
|
@@ -15,10 +16,9 @@ class RSolr::Client
|
|
15
16
|
end
|
16
17
|
end
|
17
18
|
@options = options
|
18
|
-
extend RSolr::Pagination::Client
|
19
19
|
end
|
20
20
|
|
21
|
-
# returns the
|
21
|
+
# returns the request uri object.
|
22
22
|
def base_request_uri
|
23
23
|
base_uri.request_uri if base_uri
|
24
24
|
end
|
@@ -26,7 +26,7 @@ class RSolr::Client
|
|
26
26
|
# returns the uri proxy if present,
|
27
27
|
# otherwise just the uri object.
|
28
28
|
def base_uri
|
29
|
-
@proxy
|
29
|
+
@proxy ? @proxy : @uri
|
30
30
|
end
|
31
31
|
|
32
32
|
# Create the get, post, and head methods
|
@@ -38,6 +38,16 @@ class RSolr::Client
|
|
38
38
|
RUBY
|
39
39
|
end
|
40
40
|
|
41
|
+
# A paginated request method.
|
42
|
+
# Converts the page and per_page
|
43
|
+
# arguments into "rows" and "start".
|
44
|
+
def paginate page, per_page, path, opts = nil
|
45
|
+
opts ||= {}
|
46
|
+
opts[:params] ||= {}
|
47
|
+
raise "'rows' or 'start' params should not be set when using +paginate+" if ["start", "rows"].include?(opts[:params].keys)
|
48
|
+
execute build_paginated_request(page, per_page, path, opts)
|
49
|
+
end
|
50
|
+
|
41
51
|
# POST XML messages to /update with optional params.
|
42
52
|
#
|
43
53
|
# http://wiki.apache.org/solr/UpdateXmlMessages#add.2BAC8-update
|
@@ -187,10 +197,16 @@ class RSolr::Client
|
|
187
197
|
opts
|
188
198
|
end
|
189
199
|
|
200
|
+
def build_paginated_request page, per_page, path, opts
|
201
|
+
per_page = per_page.to_s.to_i
|
202
|
+
page = page.to_s.to_i-1
|
203
|
+
page = page < 1 ? 0 : page
|
204
|
+
opts[:params]["start"] = page * per_page
|
205
|
+
opts[:params]["rows"] = per_page
|
206
|
+
build_request path, opts
|
207
|
+
end
|
208
|
+
|
190
209
|
# A mixin for used by #adapt_response
|
191
|
-
# This module essentially
|
192
|
-
# allows the raw response access to
|
193
|
-
# the original response and request.
|
194
210
|
module Context
|
195
211
|
attr_accessor :request, :response
|
196
212
|
end
|
@@ -208,20 +224,22 @@ class RSolr::Client
|
|
208
224
|
def adapt_response request, response
|
209
225
|
raise "The response does not have the correct keys => :body, :headers, :status" unless
|
210
226
|
%W(body headers status) == response.keys.map{|k|k.to_s}.sort
|
211
|
-
raise RSolr::Error::Http.new request, response unless
|
212
|
-
[200,302].include? response[:status]
|
227
|
+
raise RSolr::Error::Http.new request, response unless [200,302].include? response[:status]
|
213
228
|
result = request[:params][:wt] == :ruby ? evaluate_ruby_response(request, response) : response[:body]
|
214
229
|
result.extend Context
|
215
|
-
result.request = request
|
216
|
-
result.
|
217
|
-
result
|
230
|
+
result.request, result.response = request, response
|
231
|
+
result.is_a?(Hash) ? result.extend(RSolr::Response) : result
|
218
232
|
end
|
219
233
|
|
220
234
|
protected
|
221
235
|
|
222
236
|
# converts the method name for the solr request handler path.
|
223
237
|
def method_missing name, *args
|
224
|
-
|
238
|
+
if name.to_s =~ /^paginated?_(.+)$/
|
239
|
+
paginate args[0], args[1], $1, *args[2..-1]
|
240
|
+
else
|
241
|
+
send_and_receive name, *args
|
242
|
+
end
|
225
243
|
end
|
226
244
|
|
227
245
|
# evaluates the response[:body],
|
data/lib/rsolr/connection.rb
CHANGED
@@ -3,7 +3,7 @@ require 'net/https'
|
|
3
3
|
|
4
4
|
# The default/Net::Http adapter for RSolr.
|
5
5
|
class RSolr::Connection
|
6
|
-
|
6
|
+
|
7
7
|
# using the request_context hash,
|
8
8
|
# send a request,
|
9
9
|
# then return the standard rsolr response hash {:status, :body, :headers}
|
@@ -13,7 +13,8 @@ class RSolr::Connection
|
|
13
13
|
request.body = request_context[:data] if request_context[:method] == :post and request_context[:data]
|
14
14
|
begin
|
15
15
|
response = h.request request
|
16
|
-
|
16
|
+
charset = response.type_params["charset"]
|
17
|
+
{:status => response.code.to_i, :headers => response.to_hash, :body => force_charset(response.body, charset)}
|
17
18
|
# catch the undefined closed? exception -- this is a confirmed ruby bug
|
18
19
|
rescue NoMethodError
|
19
20
|
$!.message == "undefined method `closed?' for nil:NilClass" ?
|
@@ -21,9 +22,9 @@ class RSolr::Connection
|
|
21
22
|
raise($!)
|
22
23
|
end
|
23
24
|
end
|
24
|
-
|
25
|
+
|
25
26
|
protected
|
26
|
-
|
27
|
+
|
27
28
|
# This returns a singleton of a Net::HTTP or Net::HTTP.Proxy request object.
|
28
29
|
def http uri, proxy = nil
|
29
30
|
@http ||= (
|
@@ -33,12 +34,12 @@ class RSolr::Connection
|
|
33
34
|
else
|
34
35
|
Net::HTTP.new uri.host, uri.port
|
35
36
|
end
|
36
|
-
http.use_ssl = uri.port == 443 || uri.instance_of?(URI::HTTPS)
|
37
|
+
http.use_ssl = uri.port == 443 || uri.instance_of?(URI::HTTPS)
|
37
38
|
http
|
38
39
|
)
|
39
40
|
end
|
40
|
-
|
41
|
-
#
|
41
|
+
|
42
|
+
#
|
42
43
|
def setup_raw_request request_context
|
43
44
|
http_method = case request_context[:method]
|
44
45
|
when :get
|
@@ -66,5 +67,12 @@ class RSolr::Connection
|
|
66
67
|
raw_request.initialize_http_header headers
|
67
68
|
raw_request
|
68
69
|
end
|
69
|
-
|
70
|
-
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def force_charset body, charset
|
74
|
+
return body unless charset and body.respond_to?(:force_encoding)
|
75
|
+
body.force_encoding(charset)
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module RSolr::Response
|
2
|
+
|
3
|
+
def self.extended base
|
4
|
+
if base["response"] && base["response"]["docs"]
|
5
|
+
base["response"]["docs"].tap do |d|
|
6
|
+
d.extend PaginatedDocSet
|
7
|
+
d.per_page = base.request[:params]["rows"]
|
8
|
+
d.start = base.request[:params]["start"]
|
9
|
+
d.total = base["response"]["numFound"].to_s.to_i
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# A response module which gets mixed into the solr ["response"]["docs"] array.
|
15
|
+
module PaginatedDocSet
|
16
|
+
|
17
|
+
attr_accessor :start, :per_page, :total
|
18
|
+
|
19
|
+
# Returns the current page calculated from 'rows' and 'start'
|
20
|
+
def current_page
|
21
|
+
return 1 if start < 1
|
22
|
+
per_page_normalized = per_page < 1 ? 1 : per_page
|
23
|
+
@current_page ||= (start / per_page_normalized).ceil + 1
|
24
|
+
end
|
25
|
+
|
26
|
+
# Calcuates the total pages from 'numFound' and 'rows'
|
27
|
+
def total_pages
|
28
|
+
@total_pages ||= per_page > 0 ? (total / per_page.to_f).ceil : 1
|
29
|
+
end
|
30
|
+
|
31
|
+
# returns the previous page number or 1
|
32
|
+
def previous_page
|
33
|
+
@previous_page ||= (current_page > 1) ? current_page - 1 : 1
|
34
|
+
end
|
35
|
+
|
36
|
+
# returns the next page number or the last
|
37
|
+
def next_page
|
38
|
+
@next_page ||= (current_page == total_pages) ? total_pages : current_page+1
|
39
|
+
end
|
40
|
+
|
41
|
+
def has_next?
|
42
|
+
current_page < total_pages
|
43
|
+
end
|
44
|
+
|
45
|
+
def has_previous?
|
46
|
+
current_page > 1
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
data/lib/rsolr/xml.rb
CHANGED
data/lib/rsolr.rb
CHANGED
@@ -4,7 +4,7 @@ require 'rubygems'
|
|
4
4
|
|
5
5
|
module RSolr
|
6
6
|
|
7
|
-
%W(Char Client Error Connection
|
7
|
+
%W(Response Char Client Error Connection Uri Xml).each{|n|autoload n.to_sym, "rsolr/#{n.downcase}"}
|
8
8
|
|
9
9
|
def self.version
|
10
10
|
@version ||= File.read(File.join(File.dirname(__FILE__), '..', 'VERSION')).chomp
|
data/spec/api/pagination_spec.rb
CHANGED
@@ -1,38 +1,26 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
describe "RSolr::Pagination" do
|
3
|
-
context "calculate_start_and_rows" do
|
4
|
-
it "should return an array with 2 ints" do
|
5
|
-
values = RSolr::Pagination.calculate_start_and_rows 2, 10
|
6
|
-
values[0].should == 10
|
7
|
-
values[1].should == 10
|
8
|
-
end
|
9
|
-
it "should handle string values" do
|
10
|
-
values = RSolr::Pagination.calculate_start_and_rows "1", "22"
|
11
|
-
values[0].should == 0
|
12
|
-
values[1].should == 22
|
13
|
-
end
|
14
|
-
end
|
15
3
|
context "build_paginated_request" do
|
16
4
|
it "should create the proper solr params and query string" do
|
17
|
-
c = RSolr::Client.new(nil, {})
|
5
|
+
c = RSolr::Client.new(nil, {})#.extend(RSolr::Pagination::Client)
|
18
6
|
r = c.build_paginated_request 3, 25, "select", {:params => {:q => "test"}}
|
19
|
-
r[:page].should == 3
|
20
|
-
r[:per_page].should == 25
|
21
|
-
r[:params][
|
22
|
-
r[:params][
|
7
|
+
#r[:page].should == 3
|
8
|
+
#r[:per_page].should == 25
|
9
|
+
r[:params]["start"].should == 50
|
10
|
+
r[:params]["rows"].should == 25
|
23
11
|
r[:uri].query.should =~ /rows=25/
|
24
12
|
r[:uri].query.should =~ /start=50/
|
25
13
|
end
|
26
14
|
end
|
27
15
|
context "paginate" do
|
28
16
|
it "should build a paginated request context and call execute" do
|
29
|
-
c = RSolr::Client.new(nil, {})
|
17
|
+
c = RSolr::Client.new(nil, {})#.extend(RSolr::Pagination::Client)
|
30
18
|
c.should_receive(:execute).with(hash_including({
|
31
|
-
|
32
|
-
|
19
|
+
#:page => 1,
|
20
|
+
#:per_page => 10,
|
33
21
|
:params => {
|
34
|
-
|
35
|
-
|
22
|
+
"rows" => 10,
|
23
|
+
"start" => 0,
|
36
24
|
:wt => :ruby
|
37
25
|
}
|
38
26
|
}))
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rsolr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 3
|
10
|
+
version: 1.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Matt Mitchell
|
@@ -25,13 +25,74 @@ autorequire:
|
|
25
25
|
bindir: bin
|
26
26
|
cert_chain: []
|
27
27
|
|
28
|
-
date: 2011-
|
29
|
-
default_executable:
|
28
|
+
date: 2011-11-09 00:00:00 Z
|
30
29
|
dependencies:
|
31
30
|
- !ruby/object:Gem::Dependency
|
31
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
32
|
+
none: false
|
33
|
+
requirements:
|
34
|
+
- - "="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
hash: 7
|
37
|
+
segments:
|
38
|
+
- 3
|
39
|
+
- 0
|
40
|
+
- 0
|
41
|
+
version: 3.0.0
|
42
|
+
version_requirements: *id001
|
32
43
|
name: builder
|
33
44
|
prerelease: false
|
34
|
-
|
45
|
+
type: :runtime
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
48
|
+
none: false
|
49
|
+
requirements:
|
50
|
+
- - "="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
hash: 7
|
53
|
+
segments:
|
54
|
+
- 1
|
55
|
+
- 6
|
56
|
+
- 4
|
57
|
+
version: 1.6.4
|
58
|
+
version_requirements: *id002
|
59
|
+
name: jeweler
|
60
|
+
prerelease: false
|
61
|
+
type: :development
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - "="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
hash: 63
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
- 9
|
72
|
+
- 2
|
73
|
+
version: 0.9.2
|
74
|
+
version_requirements: *id003
|
75
|
+
name: rake
|
76
|
+
prerelease: false
|
77
|
+
type: :development
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - "="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
hash: 43
|
85
|
+
segments:
|
86
|
+
- 3
|
87
|
+
- 9
|
88
|
+
- 4
|
89
|
+
version: 3.9.4
|
90
|
+
version_requirements: *id004
|
91
|
+
name: rdoc
|
92
|
+
prerelease: false
|
93
|
+
type: :development
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
35
96
|
none: false
|
36
97
|
requirements:
|
37
98
|
- - ">="
|
@@ -42,8 +103,10 @@ dependencies:
|
|
42
103
|
- 1
|
43
104
|
- 2
|
44
105
|
version: 2.1.2
|
106
|
+
version_requirements: *id005
|
107
|
+
name: builder
|
108
|
+
prerelease: false
|
45
109
|
type: :runtime
|
46
|
-
version_requirements: *id001
|
47
110
|
description: RSolr aims to provide a simple and extensible library for working with Solr
|
48
111
|
email: goodieboy@gmail.com
|
49
112
|
executables: []
|
@@ -63,7 +126,7 @@ files:
|
|
63
126
|
- lib/rsolr/client.rb
|
64
127
|
- lib/rsolr/connection.rb
|
65
128
|
- lib/rsolr/error.rb
|
66
|
-
- lib/rsolr/
|
129
|
+
- lib/rsolr/response.rb
|
67
130
|
- lib/rsolr/uri.rb
|
68
131
|
- lib/rsolr/xml.rb
|
69
132
|
- spec/api/char_spec.rb
|
@@ -78,7 +141,6 @@ files:
|
|
78
141
|
- Rakefile
|
79
142
|
- tasks/spec.rake
|
80
143
|
- tasks/rdoc.rake
|
81
|
-
has_rdoc: true
|
82
144
|
homepage: http://github.com/mwmitchell/rsolr
|
83
145
|
licenses: []
|
84
146
|
|
@@ -108,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
170
|
requirements: []
|
109
171
|
|
110
172
|
rubyforge_project:
|
111
|
-
rubygems_version: 1.
|
173
|
+
rubygems_version: 1.8.10
|
112
174
|
signing_key:
|
113
175
|
specification_version: 3
|
114
176
|
summary: A Ruby client for Apache Solr
|
data/lib/rsolr/pagination.rb
DELETED
@@ -1,122 +0,0 @@
|
|
1
|
-
module RSolr::Pagination
|
2
|
-
|
3
|
-
# Calculates the "start" and "rows" Solr params
|
4
|
-
# by inspecting the :per_page and :page params.
|
5
|
-
def self.calculate_start_and_rows page, per_page
|
6
|
-
per_page = per_page.to_s.to_i
|
7
|
-
page = page.to_s.to_i-1
|
8
|
-
page = page < 1 ? 0 : page
|
9
|
-
start = page * per_page
|
10
|
-
[start, per_page]
|
11
|
-
end
|
12
|
-
|
13
|
-
# A mixin module for RSolr::Client
|
14
|
-
# -- note, this must mixed-in via
|
15
|
-
# "extend" on a RSolr::Client instance.
|
16
|
-
module Client
|
17
|
-
|
18
|
-
# A paginated request method.
|
19
|
-
def paginate page, per_page, path, opts = nil
|
20
|
-
@warned ||= begin
|
21
|
-
warn "DEPRECATION WARNING: RSolr::Pagination / pagination functionality will be removed in 1.1.0."
|
22
|
-
true
|
23
|
-
end
|
24
|
-
request_context = build_paginated_request page, per_page, path, opts
|
25
|
-
execute request_context
|
26
|
-
end
|
27
|
-
|
28
|
-
# Just like RSolr::Client #build_request
|
29
|
-
# but converts the page and per_page
|
30
|
-
# arguments into :rows and :start.
|
31
|
-
def build_paginated_request page, per_page, path, opts = nil
|
32
|
-
opts ||= {}
|
33
|
-
opts[:page] = page
|
34
|
-
opts[:per_page] = per_page
|
35
|
-
opts[:params] ||= {}
|
36
|
-
values = RSolr::Pagination.calculate_start_and_rows(page, per_page)
|
37
|
-
opts[:params][:start] = values[0]
|
38
|
-
opts[:params][:rows] = values[1]
|
39
|
-
build_request path, opts
|
40
|
-
end
|
41
|
-
|
42
|
-
protected
|
43
|
-
|
44
|
-
# Checks if the called method starts
|
45
|
-
# with "paginate_*" and
|
46
|
-
# converts the * to the solr
|
47
|
-
# request path. It then calls paginate
|
48
|
-
# with the appropriate arguments.
|
49
|
-
# If the called method doesn't
|
50
|
-
# start with "paginate_",
|
51
|
-
# the original/super
|
52
|
-
# RSolr::Client #method_missing
|
53
|
-
# method is called.
|
54
|
-
def method_missing name, *args
|
55
|
-
if name.to_s =~ /^paginated?_(.+)$/
|
56
|
-
paginate args[0], args[1], $1, *args[2..-1]
|
57
|
-
else
|
58
|
-
super name, *args
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
# Overrides the RSolr::Client #evaluate_ruby_response method.
|
63
|
-
# Calls the original/super
|
64
|
-
# RSolr::Client #evaluate_ruby_response method.
|
65
|
-
# Mixes in the PaginatedDocSet if
|
66
|
-
# the request[:page] and request[:per_page]
|
67
|
-
# opts are set.
|
68
|
-
def evaluate_ruby_response request, response
|
69
|
-
result = super request, response
|
70
|
-
if request[:page] && request[:per_page] && result["response"] && result["response"]["docs"]
|
71
|
-
d = result['response']['docs'].extend PaginatedDocSet
|
72
|
-
d.per_page = request[:per_page]
|
73
|
-
d.start = request[:params][:start]
|
74
|
-
d.total = result["response"]["numFound"].to_s.to_i
|
75
|
-
end
|
76
|
-
result
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
|
81
|
-
# A response module which gets mixed into the solr ["response"]["docs"] array.
|
82
|
-
module PaginatedDocSet
|
83
|
-
|
84
|
-
attr_accessor :start, :per_page, :total
|
85
|
-
|
86
|
-
# Returns the current page calculated from 'rows' and 'start'
|
87
|
-
# WillPaginate hook
|
88
|
-
def current_page
|
89
|
-
return 1 if start < 1
|
90
|
-
per_page_normalized = per_page < 1 ? 1 : per_page
|
91
|
-
@current_page ||= (start / per_page_normalized).ceil + 1
|
92
|
-
end
|
93
|
-
|
94
|
-
# Calcuates the total pages from 'numFound' and 'rows'
|
95
|
-
# WillPaginate hook
|
96
|
-
def total_pages
|
97
|
-
@total_pages ||= per_page > 0 ? (total / per_page.to_f).ceil : 1
|
98
|
-
end
|
99
|
-
|
100
|
-
# returns the previous page number or 1
|
101
|
-
# WillPaginate hook
|
102
|
-
def previous_page
|
103
|
-
@previous_page ||= (current_page > 1) ? current_page - 1 : 1
|
104
|
-
end
|
105
|
-
|
106
|
-
# returns the next page number or the last
|
107
|
-
# WillPaginate hook
|
108
|
-
def next_page
|
109
|
-
@next_page ||= (current_page == total_pages) ? total_pages : current_page+1
|
110
|
-
end
|
111
|
-
|
112
|
-
def has_next?
|
113
|
-
current_page < total_pages
|
114
|
-
end
|
115
|
-
|
116
|
-
def has_previous?
|
117
|
-
current_page > 1
|
118
|
-
end
|
119
|
-
|
120
|
-
end
|
121
|
-
|
122
|
-
end
|