Naoya Murakami
visio****@gmail*****
2014年 7月 30日 (水) 12:17:08 JST
お世話になっております。村上です。 ちょっとわけがわからないタイトルで恐縮なのですが、 現在、GroongaのC-APIでgrn_table_selectによって 得られたハッシュテーブルのキーを取得・削除する方法 で悩んでいます。 grn_table_selectによって得られたハッシュテーブルに 対して、grn_table_delete_by_idのID指定によるキーの 削除は可能なのですが、grn_table_deleteによるキーの 名前指定によるキーの削除やgrn_table_getによるキーの 名前指定によるIDの取得はできません。 このハッシュテーブルのキーは、テーブル型のキーなので、 実体は他のテーブルのキーへのポインタで、grn_table_get やgrn_table_deleteではそれをたどれないのかなぁとか思っ たりよくわかっていなかったり。。 ちなみにgrn_obj_column(..."_key"...)→grn_obj_get_valueの ID指定ではキーの値がとれました。しかし、この方法でのキー名 の特定はコストが高そうです。 <質問> grn_table_selectによって得られたテーブル型のハッシュテーブル からキーの名前指定でキーを削除またはIDを取得する方法は ありますか? なぜこれがしたいかというと、どの程度パフォーマンスが でるかわからないのですが、あるテーブルの検索結果と 他のテーブルの検索結果を積集合(AND)してみたいという ことです。 (2つのテーブル間のキーは部分集合の関係にしておく) もし、これができるのであれば、マルチスレッドでテーブルを 並列検索(それぞれのスレッドで異なるgrn_ctxを使う)させた 結果を片方のテーブルをカーソルで回してキーを取得し、 他方のテーブルのキーを削除することによりマージできない かなぁとか考えています。 以下はサンプルプログラムの実行結果です。 https://github.com/naoa/groonga-table_type_key_delete/blob/master/src/table_key_delete_sample.c table dump column: key=groonga column=groonga world key=mroonga column=mroonga world key=rroonga column=rroonga world filter:'column @ "world"' hits: 3 上記のようなキーとカラムのテーブルからスクリプト構文で 3件全てをヒットさせたresultテーブルを作ります。 https://github.com/naoa/groonga-table_type_key_delete/blob/master/src/table_key_delete_sample.c#L187-L193 result dump _key: key= column=groonga key= column=mroonga key= column=rroonga resultテーブルでは、grn_table_get_keyによるキーの取得 がうまくできません。grn_obj_get_valueでは値が取得され ています。 https://github.com/naoa/groonga-table_type_key_delete/blob/master/src/table_key_delete_sample.c#L122 grn_table_get(&ctx, result, "groonga", strlen("groonga")); id=0 grn_table_delete(&ctx, result, "groonga", strlen("groonga")); rc=-22 result dump _key: key= column=groonga key= column=mroonga key= column=rroonga grn_table_getとgrn_table_deleteのキーの名前指定では resultテーブルからうまくキーを取得、削除できていません。 https://github.com/naoa/groonga-table_type_key_delete/blob/master/src/table_key_delete_sample.c#L199-L206 grn_table_delete_by_id(&ctx, result, 1); rc=0 result dump _key: key= column=mroonga key= column=rroonga grn_table_delete_by_idのID指定では、resultテーブルから ID=1のkey=groongaのレコードが削除されています。 https://github.com/naoa/groonga-table_type_key_delete/blob/master/src/table_key_delete_sample.c#L208-L212 以上、よろしくお願いします。