Kouhei Sutou
kou****@clear*****
2014年 1月 9日 (木) 11:29:48 JST
須藤です。 In <CA+vpKiqQL=XNwzZX6b_CjtaU****@mail*****> "[groonga-dev,02039] [rroonga] Groonga::Table#paginate の結果から参照元のレコードのidを取得したい" on Thu, 9 Jan 2014 01:49:31 +0900, ongaeshi <ongae****@gmail*****> wrote: > ある Groonga::Array を生成した際、Groonga::Table#select の結果から実レコードのidを取得したい時は > > results = array.select("aaa") # 検索 > record = results.first # 検索結果からレコードを取得 > id = record.key.id # 実レコードのidを取得 > > で取得出来ますが、 Groonga::Table#paginate の結果からは取得出来ないようです。 > > results = array.select("aaa") # 検索 > results.paginate( # さらにページネーション処理 > [["_score", :desc]], > :page => 1) > record = results.first # ページネーション結果からレコードを取得 > id = record.key.key.id # エラー、record.key の結果が nil になる > > paginateの結果から実レコードのidを取得することは可能でしょうか? 可能です! record.value.key.idでいけます! ^^^^^ keyじゃなくvalue 検索結果は順番が関係ないので一時Groonga::Hashで返すのですが、 paginateは順番が関係あるので一時Groonga::Arrayで結果を返すの です。Groonga::Hashにはキーがあるので、そこに実レコードのIDが 入っているのですが、Groonga::Arrayにはキーがないので、valueの ところに実レコードのIDが入っています。 検索結果に対してのrecord.keyは 検索結果の一時Groonga::Hashのキーに入っている実レコードの IDを取得してGroonga::Recordオブジェクトを返す ということをしています。 一方、paginateの結果に対してのrecord.valueは paginate結果の一時Groonga::Arrayのvalueに入っている実レコー ドのIDを取得してGroonga::Recordオブジェクトを返す というようになります。 ちなみに、sortも同じようにGroonga::Arrayを返すのでrecord.key ではなくrecord.valueになります。 -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270) Groongaサポート: http://groonga.org/ja/support/ パッチ採用はじめました: http://www.clear-code.com/recruitment/ コミットへのコメントサービスはじめました: http://www.clear-code.com/services/commit-comment.html