Closed s-yata closed 9 years ago
find_one()
も同様に,カラムがテーブルより小さいとき, N/A を見つけるのに走査は不要になります.
条件を満たすいずれかの行 ID を返す関数なので,カラムのサイズに 1 を足したものを返すだけで十分です.
「カラムのサイズに 1 を足したもの」は削除されているかもしれないので, max_row_id()
を返すようにします.
索引があるとき, contains()
は索引に登録されている数とテーブルの行数から結果を出せるのですが, find_one()
は残念ながら結果を出せません.
索引があっても find_one()
で N/A の行 ID を見つけるには走査が必要になります.
Column<Text>
Column<Vector<T>>
(except T = Text
)Column<Vector<Text>>
まずは N/A を含まないデータで試し,それから一部を N/A に置き換えて試し,最後に索引を追加して試すという手順がよさそうです. ただし,最終的には個別にテストを用意するべきです.
カラムに含まれている N/A が索引を作成するときに誤って登録されるバグが見つかったので修正しました.
概要
現在の実装では,カラムの値を埋めていない範囲については,領域を確保しないことがあります. このとき,カラムのサイズはテーブルのサイズ(※)より小さくなります.
※ ここでは最大の行 ID(
max_row_id()
) に 1 を足した値を指しています.カラムの
contains()
はカラムとテーブルの小さい方のサイズまでを走査範囲としていて,カラムがテーブルより小さいときはテーブルの後半部分を無視しています.探している値が N/A でなければ問題ありませんが, N/A のときは問題となります. カラムがテーブルより小さい状態で N/A を探すように指示されたときは,常に真を返すようにしなければなりません. このとき,走査は不要になります.