2018年12月23日日曜日

NotesDominoQuery クラスを使ってみよう!

Notes と Domino の 10.0.1 がリリースされました。

早速、トライアル版の Domino と Notes (+ Designer + Administrator)をダウンロードして、ベータ版へ上書きインストールしました。どちらも問題なく完了しました。

このリリースに合わせて Domino Designer 10.0.1 のオンラインヘルプ が公開されましたので眺めたところ、LotusScript に追加された幾つかの新たなクラスが記載されていました。

その中でも今回は NotesDominoQuery クラスに少し触れてみたのでご紹介します。

NotesDominoQuery クラスは、V10 からサポートされた Domino Query Language (以下、DQL) を扱うクラスです。

※DQL については以前のブログエントリでもご紹介しましたので割愛します。


まずは NotesDominoQuery クラスの Explain メソッド を使って、クエリの実行に関する情報を見てみたいと思います。Explain メソッドは domquery コマンドの -e オプションに相当します。
以下のコードをエージェントにタイプします。

Dim ss As New NotesSession
Dim db As NotesDatabase
Dim dq As NOTESDOMINOQUERY
Dim query As String
Set db = ss.Currentdatabase
Set dq = db.Createdominoquery()
query = "Subject = 'test document'"
Print dq.Explain( query )

そしてエージェントを実行するわけですが、クライアントから実行しようとすると「Method is not available: Function is not supported for remote databases」とメッセージが表示され、実行できません。



現状は Domino サーバー上で実行する必要がありそうです。

そこで、サーバー上でエージェントを実行できるようトリガーとターゲットを変更し、Domino のコンソールから「tell amgr "AppName.nsf" 'AgentName'」とコマンドを投入してみたところ、コンソール上に次のように表示されました。

> tell amgr run "DQ.nsf" 'DominoQuery#1'
[8228:000B-5B74] 2018/12/22 23:19:43   AMgr: Start executing agent 'DominoQuery#1' in 'DQ.nsf'
[8228:000B-5B74] 2018/12/22 23:19:43   Agent Manager: Agent printing:   Query Processed: [Subject = 'test document']  0.Subject = 'test document' NSF document search estimated cost = 100    Prep 0.153 msecs, Exec 27.660 msecs, ScannedDocs 3569, Entries 0, FoundDocs 4  ******************
[8228:000B-5B74] 2018/12/22 23:19:43   AMgr: Agent 'DominoQuery#1' in 'DQ.nsf' completed execution

オレンジ色で示した箇所が Explain メソッドの結果です。

FoundDocs が 4 ですので、4件の文書がヒットしたことがわかります。

文書検索にかかるコストが 100 と高く見積もられています。おそらくはクエリーに最適化されたビューを作っていないためコストが高くなったのでしょう。そのせいか検索にかかる時間も長くなっているように思います。


では、クエリーを実行して文書を取得する Execute メソッドを試してみたいと思います。
エージェントに次のコードをタイプします。

Dim ss As New NotesSession
Dim db As NotesDatabase
Dim dq As NOTESDOMINOQUERY
Dim query As String
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument

Set db = ss.Currentdatabase
Set dq = db.Createdominoquery()
query = "Subject = 'test document'"
Set dc = dq.Execute( query )
Set doc = dc.Getfirstdocument()
Print doc.Subject(0)

Subject フィールドの値に "test document" がセットされている文書の集合から、最初の文書を取り出し、Subject フィールドの値を表示します。

そして Domino のコンソールから先ほどと同様にコマンドを投入した結果がこちらです。

> tell amgr run "DQ.nsf" 'DominoQuery#2'
[8228:0010-0F78] 2018/12/23 00:16:51   AMgr: Start executing agent 'DominoQuery#2' in 'DQ.nsf'
[8228:0010-0F78] 2018/12/23 00:16:51   Agent Manager: Agent printing: test document[8228:0010-0F78] 2018/12/23 00:16:51   AMgr: Agent 'DominoQuery#2' in 'DQ.nsf' completed execution

正しく表示できました。

ベータ版では今回試した Explain に相当する機能は提供されていましたが、文書を取得する手段は存在しませんでした。

10.0.1 では文書を取得するメソッドも実装され、それが正しく機能することが確認できました。

0 件のコメント:

コメントを投稿