Class: RelaxDB::Paginator
- Inherits:
-
Object
- Object
- RelaxDB::Paginator
- Defined in:
- lib/relaxdb/paginator.rb
Instance Attribute Summary collapse
-
#paginate_params ⇒ Object
readonly
Returns the value of attribute paginate_params.
Instance Method Summary collapse
- #add_next_and_prev(docs, design_doc, view_name, view_keys) ⇒ Object
- #create_next(doc, view_keys) ⇒ Object
- #create_prev(doc, view_keys) ⇒ Object
-
#initialize(paginate_params, page_params) ⇒ Paginator
constructor
A new instance of Paginator.
- #orig_offset(design_doc, view_name) ⇒ Object
- #total_doc_count(design_doc, view_name) ⇒ Object
Constructor Details
#initialize(paginate_params, page_params) ⇒ Paginator
Returns a new instance of Paginator.
7 8 9 10 11 12 13 14 |
# File 'lib/relaxdb/paginator.rb', line 7 def initialize(paginate_params, page_params) @paginate_params = paginate_params @orig_paginate_params = @paginate_params.clone page_params = page_params.is_a?(String) ? JSON.parse(page_params).to_mash : page_params # Where the magic happens - the original params are updated with the page specific params @paginate_params.update(page_params) end |
Instance Attribute Details
#paginate_params ⇒ Object (readonly)
Returns the value of attribute paginate_params.
5 6 7 |
# File 'lib/relaxdb/paginator.rb', line 5 def paginate_params @paginate_params end |
Instance Method Details
#add_next_and_prev(docs, design_doc, view_name, view_keys) ⇒ Object
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/relaxdb/paginator.rb', line 25 def add_next_and_prev(docs, design_doc, view_name, view_keys) unless docs.empty? no_docs = docs.size offset = docs.offset orig_offset = orig_offset(design_doc, view_name) total_doc_count = total_doc_count(design_doc, view_name) next_exists = !@paginate_params.order_inverted? ? (offset - orig_offset + no_docs < total_doc_count) : true next_params = create_next(docs.last, view_keys) if next_exists prev_exists = @paginate_params.order_inverted? ? (offset - orig_offset + no_docs < total_doc_count) : (offset - orig_offset == 0 ? false : true) prev_params = create_prev(docs.first, view_keys) if prev_exists else next_exists = prev_exists = false end docs..instance_eval do define_method(:next_params) { next_exists ? next_params : false } define_method(:next_query) { next_exists ? "page_params=#{::CGI::escape(next_params.to_json)}" : false } define_method(:prev_params) { prev_exists ? prev_params : false } define_method(:prev_query) { prev_exists ? "page_params=#{::CGI::escape(prev_params.to_json)}" : false } end end |
#create_next(doc, view_keys) ⇒ Object
51 52 53 54 55 56 |
# File 'lib/relaxdb/paginator.rb', line 51 def create_next(doc, view_keys) next_key = view_keys.map { |a| doc.send(a) } next_key = next_key.length == 1 ? next_key[0] : next_key next_key_docid = doc._id { :startkey => next_key, :startkey_docid => next_key_docid, :descending => @orig_paginate_params.descending } end |
#create_prev(doc, view_keys) ⇒ Object
58 59 60 61 62 63 |
# File 'lib/relaxdb/paginator.rb', line 58 def create_prev(doc, view_keys) prev_key = view_keys.map { |a| doc.send(a) } prev_key = prev_key.length == 1 ? prev_key[0] : prev_key prev_key_docid = doc._id prev_params = { :startkey => prev_key, :startkey_docid => prev_key_docid, :descending => !@orig_paginate_params.descending } end |
#orig_offset(design_doc, view_name) ⇒ Object
65 66 67 68 69 70 71 72 73 74 |
# File 'lib/relaxdb/paginator.rb', line 65 def orig_offset(design_doc, view_name) query = Query.new(design_doc, view_name) if @paginate_params.order_inverted? query.startkey(@orig_paginate_params.endkey).descending(!@orig_paginate_params.descending) else query.startkey(@orig_paginate_params.startkey).descending(@orig_paginate_params.descending) end query.reduce(false).limit(1) RelaxDB.retrieve(query.view_path).offset end |
#total_doc_count(design_doc, view_name) ⇒ Object
16 17 18 19 20 21 22 23 |
# File 'lib/relaxdb/paginator.rb', line 16 def total_doc_count(design_doc, view_name) result = RelaxDB.view(design_doc, view_name) do |q| q.reduce(true) q.startkey(@orig_paginate_params.startkey).endkey(@orig_paginate_params.endkey).descending(@orig_paginate_params.descending) end total_docs = RelaxDB.reduce_result(result) end |