[groonga-dev,00080] Re: Ruby/groongaを用いて、カウンタを作りたい

Back to archive index

Tasuku SUENAGA a****@razil*****
2009年 6月 23日 (火) 15:34:30 JST


すえながです。

> はい、そうです。Hashと同じAPIにしました。

理解しました。

> 実は、今でもGroonga::Hash.findとするとGroonga::Recordオブジェ
> クトが返ってきます。
> (中略)
> それぞれのAPIはこんなのを考えていました。
>
>   * 値の設定: Groonga::Record#value= (実装済み)
>   * 値のインクリメント: Groonga::Record#increment!
>   * 値の追加: Groonga::Record#append and/or #<<

おお、こんな感じであれば気持ちよく使えると思います。

> Ruby的には「+」は非破壊的な操作なので、「+=」というAPIにする
> と、「複製を作って代入する」ということになって違和感がありま
> す。これについては専用のメソッドを定義するのがよいのではない
> かと思います。

破壊的操作に関する視点を持っていませんでした。
専用メソッドがよさそうですね。

> 追加(GRN_OBJ_APPEND)は#<<でよいと思うのですが、
> GRN_OBJ_PREPENDに#>>を使うのは直感的ではない気がします。
> なので、#<<以外に#appendと#prependも用意した方がよいかと思っ
> ています。

これについても同意です。

というわけで、現状で僕がやりたいことを実現するには
・Groonga::PatriciaTrie(今回keyの前方一致での統計を取りたいので)
 で、Groonga::PatriciaTrie.findをしてGroonga::Recordを取るようにする。
・Groonga::Recordにincrement!を実装する。
の2段階を踏めばよさそうですね。

というわけで、Groonga::Record.increment!を実装したいと思います。

Kouhei Sutou さんは書きました:
> 須藤です。
> 
> In <4A404****@razil*****>
>   "[groonga-dev,00078] Ruby/groongaを用いて、カウンタを作りたい" on Tue, 23 Jun 2009 12:35:57 +0900,
>   Tasuku SUENAGA <a****@razil*****> wrote:
> 
>> 現在、RubyのGroonga::Tableにおいて、
>> ・『[]』はテーブルの指定idに対する値の取得
>> ・『[]=』はテーブルの指定idに対して値を設定
>> となっています。
> 
> はい、そうです。Hashと同じAPIにしました。
> 
>> groongaのgrn_obj_set_valueは第5引数にオプションを取ることができ、
>> atomicな足し算やデータの連結などを行うことができます。
> 
>> ・『[]』は、テーブルの指定idに対するオブジェクトを生成する。
> 
> これと似たような方法を考えていました。ただ、[]ではなく、別の
> メソッド名ですが。
> 
> 最初は[]でそのようなオブジェクト(Groonga::Record)を返して
> いたのですが、[]では[]=で設定した値が返ってきた方が自然だと
> 思って変えました。(HashっぽいAPI)
> 
>   table[key] = value
>   table[key] # -> value not Groonga::Record
> 
>> ・『[]』は、テーブルの指定idに対するオブジェクトを生成する。
>>  そのオブジェクトが、『=』で代入を行えば値の設定、
>>  『+=』で数値を足せばインクリメント、
>>  『<<』でバイト列を付与すれば末尾追加、
>>  などの操作ができる。
> 
> 実は、今でもGroonga::Hash.findとするとGroonga::Recordオブジェ
> クトが返ってきます。(groongaに合わせてlookupにしてもよいか
> もしれません。今はActiveRecord風な方に倒しています。)
> 
> それぞれのAPIはこんなのを考えていました。
> 
>   * 値の設定: Groonga::Record#value= (実装済み)
>   * 値のインクリメント: Groonga::Record#increment!
>   * 値の追加: Groonga::Record#append and/or #<<
>   * ...
> 
> Ruby的には「+」は非破壊的な操作なので、「+=」というAPIにする
> と、「複製を作って代入する」ということになって違和感がありま
> す。これについては専用のメソッドを定義するのがよいのではない
> かと思います。
> 
> 追加(GRN_OBJ_APPEND)は#<<でよいと思うのですが、
> GRN_OBJ_PREPENDに#>>を使うのは直感的ではない気がします。
> なので、#<<以外に#appendと#prependも用意した方がよいかと思っ
> ています。
> 
>> というわけで、どの方針でいくかを悩んでいます。
>> 方針さえ決まれば実装はできそうです。
> 
> こんな風に考えていたのですが、どうでしょう?
> --
> 須藤 功平 <kou****@clear*****>
> 株式会社クリアコード (http://www.clear-code.com/)
---
末永 匡 <a****@razil*****>




groonga-dev メーリングリストの案内
Back to archive index