パーソナルツール
現在の場所: ホーム ブログ MAGIC + DB2 で XQuery(5)
« 2018January »
Su Mo Tu We Th Fr Sa
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
このBlogについて
 代表の向井田ことMUKAです。当ブログサイトでは、MAGICやDB2に関する技術者向け情報を公開しています。お気軽にお立ち寄り下さい。
最近のエントリ
twitter / 新RT機能を英語モードで・・・ muka 2009年11月19日
twitter / List Widget muka 2009年11月03日
twitter API / Retweet の仕様が・・・ muka 2009年10月30日
twitter API / Lists muka 2009年10月24日
IBM Rational Software Conference 2009 と アジャイル開発 muka 2009年10月08日
twitter API / geoタグ! muka 2009年10月01日
Twitter Developers Meetup in Tokyo muka 2009年09月11日
Club DB2 2009/9/4 muka 2009年09月05日
最近のコメント
Re:Club DB2 2009/8/29 muka 2009年09月01日
Re:Club DB2 2009/8/29 SIM 2009年08月31日
最近のトラックバック
Club DB2 8/29の感想エントリと今後の予定 Unofficial DB2 BLOG 2009年09月01日
カテゴリ
misc (47)
dbMAGIC (47)
DB2 (47)
mail (47)
Web (47)
twitter (47)
 

MAGIC + DB2 で XQuery(5)


クロスリファレンスに挑戦!


 前回は、SQL/XML機能を用いてMAGIC V10のプログラムリポジトリから任意の文字列検索を行ってみました。
 今回は、プログラムのクロスリファレンス検索を行ってみようと思います。
 クロスリファレンス機能は、オブジェクト(プログラム等)を参照している他のオブジェクト(プログラム等)を逆引きする機能ですが、MAGICの開発を行っている方にはお馴染みの機能かと思います。V9になってクロスリファレンスの結果が保存されるようになったので、とても便利になりましたよね。V10にも同様の機能が実装されています。

 さて、このリファレンスを検索するにはどうすればいいでしょうか?
 V10のプログラムとそのリポジトリファイルの内容を実際に見比べてみます。
 まず、プログラム編集画面ですが、適当なプログラムを開き、ロジックの一部分でプログラムをコールしている箇所を探します。(下図は、「受注登録(Single)」プログラムのロジックタブの画面)

v10db2_031.jpg


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


v10db2_032.jpg

 このことから類推すると、あるプログラム(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ファイル(プログラムのリポジトリ)をインポートしたプロジェクトを選択し、プログラムの一覧を表示します。

v10db2_033.jpg

 任意のプログラム(画面上は、「受注書印刷 BTCH」)をクリックし、マウスの右ボタンから、「SQLテスト2」を選択します。
 するとどうでしょうか?検索が終わり、下記のようにプログラムを参照しているプログラムの一覧が表示されます。

v10db2_034.jpg

 試しに、MAGIC V10のクロスリファレンスを実行し、結果が正しいかどうか確認してみましょう。


v10db2_035.jpg



検索処理速度の比較・・・


 さて、実際の検索スピードはどれくらい違うのでしょうか?
 今回のプログラムは、プログラム単位に「あるかないか」を探すだけなので、V10のクロスリファレンス機能のようにプログラム内の該当箇所までを探すものではありません。
 それを承知の上で、単純に結果が出てくるまでの時間を、比較してみたのが次の表です。
(プログラム本数200本程度のアプリケーションで試しました。)

処理内容 MAGIC V10のクロスリファレンス検索
(プログラムのみ)
DB2 9によるsql/xml検索
リポジトリのDB2へのインポート 30秒
プログラムの検索処理時間 20秒 4秒

 さて、如何でしょう?
 百聞は一見にしかずではありませんが、実際に試されてみることをお勧めします。 「これがXMLデータベースというものか!」というようなちょっとした感動があります...。
 高々200行程度のデータベースでも高速に検索してくれますから、大規模なアプリケーションになればなるほど、更に効果が現れるように思います。
 これならリアルタイムでの検索を行わせるようなプログラムを作ったとしても、殆ど実用レベルで動作可能ではないでしょうか?

 今回は小規模のデータだったので、索引は作成していませんが、大規模のデータベースになる場合はXMLドキュメントに索引を作成することも可能です。(このあたりはまたの機会に・・・。)




MAGIC + DB2 で XQuery(1) MAGIC + DB2 で XQuery(1)
サイズ 4320 - File type text/html
MAGIC + DB2 で XQuery(2) MAGIC + DB2 で XQuery(2)
サイズ 7143 - File type text/html
MAGIC + DB2 で XQuery(3) MAGIC + DB2 で XQuery(3)
サイズ 10488 - File type text/html
MAGIC + DB2 で XQuery(4) MAGIC + DB2 で XQuery(4)
サイズ 14638 - File type text/html
V10HACKS_20070329.lzh V10HACKS_20070329.lzh
サイズ 95.6 kB - File type application/x-lzh
カテゴリ
dbMAGIC
DB2