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

Back to archive index

Ryo Onodera onode****@clear*****
2009年 12月 14日 (月) 16:08:57 JST


小野寺です。

一つ質問があります。

現在は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);

お手数をお掛けしますが、ご返答よろしくお願いします。

-- 
小野寺 諒 <onode****@clear*****>
株式会社クリアコード (http://www.clear-code.com/)




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