Sha256: fbbf13c9171efdbd8ac066cdf92241ff142c1d02fde349202b1330277447cb5e

Contents?: true

Size: 1.57 KB

Versions: 2

Compression:

Stored size: 1.57 KB

Contents

module RSolr::Response
  
  def self.extended base
    if base["response"] && base["response"]["docs"]
      base["response"]["docs"].tap do |d|
        d.extend PaginatedDocSet
        d.per_page = base.request[:params]["rows"]
        d.page_start = base.request[:params]["start"]
        d.page_total = base["response"]["numFound"].to_s.to_i
      end
    end
  end
  
  # A response module which gets mixed into the solr ["response"]["docs"] array.
  module PaginatedDocSet

    attr_accessor :page_start, :per_page, :page_total
    if not (Object.const_defined?("RUBY_ENGINE") and Object::RUBY_ENGINE=='rbx')
      alias_method(:start,:page_start)
      alias_method(:start=,:page_start=)
      alias_method(:total,:page_total)
      alias_method(:total=,:page_total=)
    end

    # Returns the current page calculated from 'rows' and 'start'
    def current_page
      return 1 if start < 1
      per_page_normalized = per_page < 1 ? 1 : per_page
      @current_page ||= (start / per_page_normalized).ceil + 1
    end

    # Calcuates the total pages from 'numFound' and 'rows'
    def total_pages
      @total_pages ||= per_page > 0 ? (total / per_page.to_f).ceil : 1
    end

    # returns the previous page number or 1
    def previous_page
      @previous_page ||= (current_page > 1) ? current_page - 1 : 1
    end

    # returns the next page number or the last
    def next_page
      @next_page ||= (current_page == total_pages) ? total_pages : current_page+1
    end

    def has_next?
      current_page < total_pages
    end

    def has_previous?
      current_page > 1
    end

  end
  
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rsolr-1.0.10.pre1 lib/rsolr/response.rb
rsolr-1.0.9 lib/rsolr/response.rb