Ryo Onodera
onode****@clear*****
2009年 12月 16日 (水) 15:14:54 JST
小野寺です。 カラムの値が可変長ならGRN_VECTOR、固定長ならGRN_UVECTORとすることにし て、実装が終わりました。このコミットはこのメーリングリストのスレッド「配 列に配列を格納する形式のloadコマンドの実装がドキュメントと食い違う。」に 私が投稿したコミットの後に続くものです。 factor out common code into set_vector() http://github.com/ryoqun/groonga/commit/cb1cc48537662a48e3df11164edea37700bb3025 use GRN_UVECTOR if appropriate http://github.com/ryoqun/groonga/commit/589f7f910faecdb5d39ee351bd83af87d17fc81d 15日の打ち合わせで決まったとおり、本家のgroongaリポジトリにはまだpushし ないことにします。このコミットをレビューしていただき、もし問題が無いよう ならば、pullしていただけるか、あるいは私が本家にpushします。 それではよろしくお願いします。 On Mon, 2009-12-14 at 16:08 +0900, Ryo Onodera wrote: > 小野寺です。 > > 一つ質問があります。 > > 現在はGRN_VECTOR形式のレコードのdumpに成功するのですが、GRN_UVECTORの形 > 式のレコードでheader.typeがGRN_TYPEの時は成功しません。grn_text_otojのそ > のための修正は終えたのですが、GRN_VECTORかGRN_UVECTORかを判定する部分を > どう書けばいいのかある程度は調べてみたのですが、分かりませんでした。 > > 原因はgrn_obj_get_value(ctx, column, id, &buf)を呼んでもbuf->header.type > がGRN_UVECTORやGRN_VECTORに設定されるのではなく、逆に、この値を元に > grn_obj_get_valueは別個の動作をしているようです。 > > また、loadコマンドから呼び出されるlib/db.cにあるbracket_closeや > brace_closeはカラムのデータ型に関わらず、GRN_VECTORを作成し、それを > grn_obj_set_valueしています。つまり、GRN_VECTORの各要素は固定長(Int32な > ど)か可変長(ShortTextなど)でありえます。 > > もちろんCでGroongaのAPIを叩けば、データが固定長ならば、GRN_UVECTORをカラ > ムにgrn_obj_set_valueすることができます。 > > まとめると、ベクター型のカラムのデータ型が固定長だからといってすべてのレ > コードがGRN_UVECTORとは断定できないと思います。 > > それと、たぶん一つのカラムに対して、レコードごとにGRN_VECTORか > GRN_UVECTORかでgrn_obj_set_valueできるのではないのでしょうか? > > ちょっと説明が分かりにくくてすいません。突き詰めて言えば、私が欲しいコー > ドは以下のif内の条件式なんです。 > > if (/* columns[j]のレコードidの値はGRN_VECTORか? */) { > GRN_OBJ_INIT(&buf, GRN_VECTOR, 0, range); > } else { > GRN_OBJ_INIT(&buf, GRN_UVECTOR, 0, range); > } > grn_obj_get_value(ctx, columns[j], id, &buf); > grn_text_otoj(ctx, outbuf, &buf, NULL); > > お手数をお掛けしますが、ご返答よろしくお願いします。 >