[groonga-dev,02549] grn_table_selectの検索結果のハッシュテーブルからのキーの取得・削除について

Back to archive index

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

以上、よろしくお願いします。



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