next up previous
Next: レコードの読み Up: モジュール irpr_kappa(irpr_kappa.kl1) Previous: メッセージの実行

レコードの検索

レコードの検索は、次のように行なう。

次の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.