groonga / grnxx

groonga++
Other
7 stars 0 forks source link

カラムの contains() で N/A を見つけられないことがある #135

Closed s-yata closed 9 years ago

s-yata commented 9 years ago

概要

現在の実装では,カラムの値を埋めていない範囲については,領域を確保しないことがあります. このとき,カラムのサイズはテーブルのサイズ(※)より小さくなります.

※ ここでは最大の行 ID(max_row_id()) に 1 を足した値を指しています.

カラムの contains() はカラムとテーブルの小さい方のサイズまでを走査範囲としていて,カラムがテーブルより小さいときはテーブルの後半部分を無視しています.

探している値が N/A でなければ問題ありませんが, N/A のときは問題となります. カラムがテーブルより小さい状態で N/A を探すように指示されたときは,常に真を返すようにしなければなりません. このとき,走査は不要になります.

s-yata commented 9 years ago

追記

find_one() も同様に,カラムがテーブルより小さいとき, N/A を見つけるのに走査は不要になります. 条件を満たすいずれかの行 ID を返す関数なので,カラムのサイズに 1 を足したものを返すだけで十分です.

s-yata commented 9 years ago

追記の追記

「カラムのサイズに 1 を足したもの」は削除されているかもしれないので, max_row_id() を返すようにします.

s-yata commented 9 years ago

追加

索引があるとき, contains() は索引に登録されている数とテーブルの行数から結果を出せるのですが, find_one() は残念ながら結果を出せません. 索引があっても find_one() で N/A の行 ID を見つけるには走査が必要になります.

s-yata commented 9 years ago

残作業

s-yata commented 9 years ago

テスト項目

まずは N/A を含まないデータで試し,それから一部を N/A に置き換えて試し,最後に索引を追加して試すという手順がよさそうです. ただし,最終的には個別にテストを用意するべきです.

s-yata commented 9 years ago

テスト項目(追加)

s-yata commented 9 years ago

デバッグ

カラムに含まれている N/A が索引を作成するときに誤って登録されるバグが見つかったので修正しました.