Class: Groonga::Table

Inherits:
Object
  • Object
show all
Defined in:
ext/groonga/rb-grn-table.c,
lib/groonga/pagination.rb

Overview

This class is base class which represents Rroonga’s table. Array , Hash , PatriciaTrie are extended from this class.

Direct Known Subclasses

Array, DoubleArrayTrie, Hash, PatriciaTrie

Defined Under Namespace

Modules: KeySupport

Instance Method Summary collapse

Instance Method Details

#paginate(sort_keys, options = {}) ⇒ Object

ページネーション用便利メソッド。ページネーションをした い場合は #sort よりも #paginate の方が便利。

説明文(descriptionカラム)を「Ruby」で全文検索し、 検索結果をスコアの高い順にソートして、10項目ずつ表示する 場合は以下のようになる。

query = "Ruby"
entries = Groonga["entries"]
selected_entries = entries.select do |record|
  entry.description =~ query
end
paged_entries = selected_entries.paginate([["_score", :desc]],
                                          :page => 1,
                                          :size => 10)

#sort と違い、返される Groonga::Table オブジェクトには Pagination モジュールがextendされており、 以下のようにページネーション情報を取得できる。

puts "#{paged_entries.n_records}件ヒット"
puts "#{paged_entries.start_offset}-#{paged_entries.end_offset}件を表示"
paged_entries.each do |entry|
  puts entry.description
end

sort_keys には ソートに用いる情報を指定する。 指定の仕方は #sort と同様なので、詳細は #sort を参照。

options に指定可能な値は以下の通り。

Parameters:

  • options (::Hash) (defaults to: {})

    The name and value pairs. Omitted names are initialized as the default value.

Options Hash (options):

  • :size (Integer) — default: 10

    1ページあたりに表示する最大項目数。

  • :page (Integer) — default: 1

    ページ番号。ページ番号は0ベースではなく1ベースであることに注意。



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/groonga/pagination.rb', line 114

def paginate(sort_keys, options={})
  _size = size
  page_size = options[:size] || 10
  minimum_size = [1, _size].min
  if page_size < 1
    raise TooSmallPageSize.new(page_size, minimum_size.._size)
  end

  max_page = [(_size / page_size.to_f).ceil, 1].max
  page = options[:page] || 1
  if page < 1
    raise TooSmallPage.new(page, 1..max_page)
  elsif max_page < page
    raise TooLargePage.new(page, 1..max_page)
  end

  offset = (page - 1) * page_size
  limit = page_size
  records = sort(sort_keys, :offset => offset, :limit => limit)
  records.extend(Pagination)
  records.send(:set_pagination_info, page, page_size, _size)
  records
end