レコードの検索は、次のように行なう。
次のsearch_data/6第1引数SearchTypeは、検索するテーブルの種別を決める アトム(current|history|all)である。
search_data(SearchType, Search_cond, ComStatus, Status)-IFP :- get_table_list(read, Tables), IFP <= begin_transaction(Tables,[],Status1), search_data1(SearchType,Status1,Search_cond,VLS,ComStatus0)-IFP, IFP <= close(Status), ComStatus0 = normal, ComStatus = normal(VLS).
ここで、VLS(ValueListStream)が、コマンドステータスComStatusの引数として 返されていることに注意する。このVLSが、次節のレコードの読み込み制御に 関係している。
次は、irpr_select:select/6で名簿管理システムで許された検索条件 Search_condを、kappaの検索条件に変換して検索を行なっている部分である。
search1(TableName,Search_cond,Set,Status)-IFP :- irpr_select:select(TableName,Search_cond,Set1,Status1)-IFP, search2(Status1,TableName,{Set1,_Set1},Set,Status)-IFP.
% 以下は、モジュールirpr_select(irpr_select.kl1)から抜粋。 select(TableName,Cond,Set,Status)-IFP :- conv_cond(Cond,normal,R,TableName,Status1)-IFP, % 検索条件の変換 exec_select(R,Status1,TableName,Set,Status)-IFP. % レコードの選択 exec_select(index(Cond),normal,TableName,Set,Status)-IFP :- IFP <= search_index(TableName,Cond,Set,Status). exec_select(data(Cond),normal,TableName,Set,Status)-IFP :- IFP <= search_data(TableName,Cond,Set,Status). exec_select(data_set(Set1,Cond),normal,TableName,Set,Status)-IFP :- IFP <= search_data(TableName,{Set1,_},Cond,Set,Status). exec_select(mix(ICond,DCond),normal,TableName,Set,Status)-IFP :- IFP <= search_index(TableName,ICond,Set1,Status1), exec_select(data_set(Set1,DCond),Status1,TableName,Set,Status)-IFP. otherwise. exec_select(_R,PStatus,_TableName,Set,Status)-IFP :- Set = {}, Status = PStatus.