[groonga-dev,00308] Re: テーブルのベクター型のカラムの値がVECTORがUVECTORかを判別する方法。

Back to archive index

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);
> 
> お手数をお掛けしますが、ご返答よろしくお願いします。
> 




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