[groonga-dev,00300] 配列に配列を格納する形式のloadコマンドの実装がドキュメントと食い違う。

Back to archive index

Ryo Onodera onode****@clear*****
2009年 12月 14日 (月) 19:10:12 JST


小野寺です。

現在、dumpコマンドはloadコマンドにJSONのオブジェクトの配
列([{...},{...},...])を渡しています。この形式だと各レコードごとにカラム
名を付随させなければならないため、dumpの出力結果が幾分か冗長になります。
そのため配列に配列を格納する形式でloadコマンドに出力してやろうとしたので
すが、その前に修正しなければならない箇所が判明しました。

[[カラム名1, カラム名2,..], [カラム値1, カラム値2,..], [カラム値1, カラム値2,..],..]

とドキュメントには記載されています。

この表記だと最初のカラム名の配列の要素数と次以降に続くカラム値の配列の要
素数が等しくなければならないような印象を受けました。しかし、実際は、
GRN_TABLE_HASH_KEY又はGRN_TABLE_PAT_KEYの場合、カラム値の配列の要素数は
カラム名の配列の要素数より一つ大きくなくてはなりません。

lib/db.c:10792      if (ndata == ncols + 1) {

そのカラム名と対応していないカラム値はそのテーブルの主キーとなります。さ
らにその値は常にカラム値の配列の先頭の要素に位置しなければならず、カラム
値の配列の自由な位置に置くことができません。

lib/db.c:10793        id = loader_add(ctx, value);
lib/db.c:10794        ndata--;
lib/db.c:10795        value++;

例としてドキュメントに準拠した次の入力は先頭の"_key"が"_key"カラムの値と
してloadされてしまいます。

(1) [["_key"],["groonga"],["ruby"],["ubuntu"]]

それで、次のようにカラム名の配列を空にしても正しく動きません。

(2) [[],["groonga"],["ruby"],["ubuntu"]]

カラムを一個定義しても動きません。

(3) [["column1"],["key1","value1",],["key2","value2"]]

最終的には、プログラムで意図されている挙動が正しく動くには二個以上のカラ
ムが必要です。

(4) [["column1","column2"],["key1","value1-1","value1-2"],["key2","value2-1","value2-2"]]

このような状態なので、このバグを直すべきかと思いますが、二つの案が考えら
れます。

1. ドキュメント通りの(1)が動くような仕様に変更する。
2. 現在の実装通りの(4)の実行結果が(2),(3)でも動くように修正し、ドキュメ
ントを修正する。

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




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