MAGIC + DB2 で XQuery(5)
クロスリファレンスに挑戦!
前回は、SQL/XML機能を用いてMAGIC V10のプログラムリポジトリから任意の文字列検索を行ってみました。
今回は、プログラムのクロスリファレンス検索を行ってみようと思います。
クロスリファレンス機能は、オブジェクト(プログラム等)を参照している他のオブジェクト(プログラム等)を逆引きする機能ですが、MAGICの開発を行っている方にはお馴染みの機能かと思います。V9になってクロスリファレンスの結果が保存されるようになったので、とても便利になりましたよね。V10にも同様の機能が実装されています。
さて、このリファレンスを検索するにはどうすればいいでしょうか?
V10のプログラムとそのリポジトリファイルの内容を実際に見比べてみます。
まず、プログラム編集画面ですが、適当なプログラムを開き、ロジックの一部分でプログラムをコールしている箇所を探します。(下図は、「受注登録(Single)」プログラムのロジックタブの画面)

次に、このプログラムのリポジトリ(XMLファイル)の該当箇所をXMLのソースから探します。下記の部分が該当箇所になります。

このことから類推すると、あるプログラム(id=X)を参照しているプログラムの一群は、
子ノード「OperationType/@val」の値が"P"であり、
かつ、子ノード「TaskID/@comp」の値が"-1"で、
かつ、子ノード「TaskID/@obj」の値がXである
「CallTask」ノードを持つXMLドキュメント(プログラム)
を条件に探せば良いということになりそうです。
さて、上記の条件を xmlexists 関数に置き換えてみましょう。
前回公開させて頂いたプログラムソースの12番「SQL/XMLサンプル2」プログラムに今回のプログラムは作成済みです。該当箇所(ルートタスクの式4)は次のように記述してあります。
'select c.DATAID from DB2ADMIN.XMLDBTEST c where
xmlexists(''$i/Application//CallTask[OperationType/@val="P"
and TaskID/@comp="-1" and TaskID/@obj="'&Trim(Str(B,'5'))&'" ]''
passing c.DATAXML as "i")'
このSQL/XML文を実行することにより、コールしているプログラムを検索することが可能です。
簡単に、上記SELECT文の解説をしておきましょう。
まず、「/Application//CallTask」と間に「//」を入れることにより、任意の階層のタスクの「CallTask」ノードが該当するようになります。
「and」で連結する条件式は、"[" と "]" の間に記述するようにします。
「Trim(Str(B,'5'))」は、プログラムのidですが、これはパラメータで任意のプログラムのリファレンスを検索できるようにするためのものです。
「comp」属性は、コンポーネントを利用しているアプリケーションの場合は、そのコンポーネントの番号が記載されます。今回は、同じアプリケーション内のプログラム(-1の値が指定される)に限定して検索を行うことになります。(うまく処理できれば、コンポーネントを使用しているアプリケーション間のクロスリファレンスの取得も可能かもしれませんね!)
さて、いよいよ、プログラムを実行してみましょう。
クロスリファレンスの実行
今回作成したプログラムは、#2:「プログラム一覧」を実行し、プログラムを一覧表示させたときのポップアップメニューから実行できるようにしてあります。
XMLファイル(プログラムのリポジトリ)をインポートしたプロジェクトを選択し、プログラムの一覧を表示します。
任意のプログラム(画面上は、「受注書印刷 BTCH」)をクリックし、マウスの右ボタンから、「SQLテスト2」を選択します。
するとどうでしょうか?検索が終わり、下記のようにプログラムを参照しているプログラムの一覧が表示されます。
試しに、MAGIC V10のクロスリファレンスを実行し、結果が正しいかどうか確認してみましょう。

検索処理速度の比較・・・
さて、実際の検索スピードはどれくらい違うのでしょうか?
今回のプログラムは、プログラム単位に「あるかないか」を探すだけなので、V10のクロスリファレンス機能のようにプログラム内の該当箇所までを探すものではありません。
それを承知の上で、単純に結果が出てくるまでの時間を、比較してみたのが次の表です。
(プログラム本数200本程度のアプリケーションで試しました。)
| 処理内容 | MAGIC V10のクロスリファレンス検索 (プログラムのみ) |
DB2 9によるsql/xml検索 |
|---|---|---|
| リポジトリのDB2へのインポート | ー | 30秒 |
| プログラムの検索処理時間 | 20秒 | 4秒 |
さて、如何でしょう?
百聞は一見にしかずではありませんが、実際に試されてみることをお勧めします。 「これがXMLデータベースというものか!」というようなちょっとした感動があります...。
高々200行程度のデータベースでも高速に検索してくれますから、大規模なアプリケーションになればなるほど、更に効果が現れるように思います。
これならリアルタイムでの検索を行わせるようなプログラムを作ったとしても、殆ど実用レベルで動作可能ではないでしょうか?
今回は小規模のデータだったので、索引は作成していませんが、大規模のデータベースになる場合はXMLドキュメントに索引を作成することも可能です。(このあたりはまたの機会に・・・。)

V10HACKS_20070329.lzh