Slide 1

Slide 1 text

NotesQueryResultsProcessor 中野晴幸 (Haruyuki Nakano) @harunakano (Twitter) harunakano.blogspot.com (blog)

Slide 2

Slide 2 text

NotesQueryResultsProcessor +バージョン 12 で LotusScript と Java に追加されたクラス +Dominoデータベースから文書コレクションを集約、計算、 ソート、フォーマットする db1 db3 db2 QRP

Slide 3

Slide 3 text

NotesQueryResultsProcessor クラス ソート順 列タイトル フィールド名 コレクション 列(カラム) クエリー 列式 カテゴリ 結果

Slide 4

Slide 4 text

NotesQueryResultsProcessor クラス ソート順 列タイトル フィールド名 AddColumn メソッド AddCollection メソッド AddFormula メソッド ExecuteToJson メソッド コレクション 列(カラム) クエリー ExecuteToView メソッド AddDominoQuery メソッド 列式 カテゴリ 結果

Slide 5

Slide 5 text

QRPサンプル (LotusScript) 2つの郵便番号DBの検索結果から ビュー(+エントリ)と json を作る db2 db1 view json QRP

Slide 6

Slide 6 text

Dim ss As New NotesSession Dim db As NotesDatabase Dim qrp As NOTESQUERYRESULTSPROCESSOR Dim db1 As New NotesDatabase( "","DQL1201-1.nsf" ) Dim dql1 As NotesDominoQuery Dim col1 As NotesDocumentCollection Dim db2 As New NotesDatabase( "","DQL1201-2.nsf" ) Dim dql2 As NotesDominoQuery Dim col2 As NotesDocumentCollection Dim nav As NotesJSONNavigator Dim doc As NotesDocument Dim servername As String Dim nam As New NotesName( ss.currentdatabase.Server ) Dim formula1 As String Dim link1 As String Dim link2 As String Dim view As NotesView Dim readers( 2 ) As String Dim query As String Dim expirehours As Long Dim resultviewname As String servername = nam.Common 1/4 宣言など

Slide 7

Slide 7 text

‘結果の出力先 DB で qrp インスタンス作成 Set db = ss.Currentdatabase Set qrp = db.Createqueryresultsprocessor() query = “@All” ’DQLクエリー ‘文書コレクションの追加 If Not db1.Isopen Then Call db1.Open( “”, “” ) Set dql1 = db1.Createdominoquery() Set col1 = dql1.Execute( query ) ’クエリーを実行して文書コレクションを作成 Call qrp.Addcollection( col1, “allDoc1” ) ’qrpに文書コレクションを追加、「参照名」は allDoc1 ‘DQLクエリーの追加 If Not db2.Isopen Then Call db2.Open( “”, “” ) Set dql2 = db2.Createdominoquery() Call qrp.Adddominoquery( dql2, query, “allDoc2” ) ’qrpにクエリーを追加、「参照名」は allDoc2 入力設定 2/4

Slide 8

Slide 8 text

'列(カラム)定義の追加 Call qrp.Addcolumn( "jiscode", "", "", SORT_ASCENDING, False, True ) Call qrp.Addcolumn( "postcode3", "", "@Left(postcode7;3)", SORT_ASCENDING, False, True ) Call qrp.Addcolumn( "postcode7", "", "", SORT_ASCENDING, False, False ) Call qrp.Addcolumn( "state_kanji", "", "", SORT_UNORDERED, False, False ) Call qrp.Addcolumn( "doclink", "", "", SORT_UNORDERED, False, False ) '列式の追加(郵便番号へ記号の付加、ワイルドカード使用) formula1 = "'〒'+@Left(postcode7;3)+'-'+@Right(postcode7;4)" Call qrp.Addformula( formula1, “postcode7”, “allDoc*” ) ‘式の適用対象を参照名で指定(ここのallDoc*は*だけでもOK) '列式の追加(NotesURLの付加、ワイルドカード未使用) link1 = "'notes://" + servername + "/__" + db1.Replicaid + ".nsf/0/' + @Text(@DocumentUniqueID)" Call qrp.Addformula( link1, “doclink”, “allDoc1” ) ‘対象は db1 の文書セットだけ link2 = "'notes://" + servername + "/__" + db2.Replicaid + ".nsf/0/' + @Text(@DocumentUniqueID)" Call qrp.Addformula( link2, “doclink”, “allDoc2” ) ‘対象は db2 の文書セットだけ 3/4 出力設定

Slide 9

Slide 9 text

‘実行(JSON出力):QRPで計算とソートし、結果をJSONを作成する Set nav = qrp.Executetojson() ‘jsonの生成 Set doc = New NotesDocument( db ) Call doc.Appenditemvalue( "json", nav.Stringify() ) Call doc.Save( True, False ) ‘実行(View出力)QRPで計算とソートを行い、結果をホストDBに「結果ビュー」として作成する resultviewname = “postcodeview“ ‘結果ビューの名前 expirehours = 24 ‘ホストDBに結果ビューを残す時間(単位:時間)、デフォルトは24時間、updall or DBMT で期限を延長可能(?) readers(0) = "CN=admin/O=v10" 'ユーザーの階層名 readers(1) = "[Admin]" 'ユーザーロール readers(2) = "LocalDomainServers" 'グループ名 Set view = qrp.Executetoview( resultviewname, expirehours, readers ) ‘結果ビューの生成 4/4 実行

Slide 10

Slide 10 text

結果(ビュー) ‘実行(View出力)QRPで計算とソートを行い、結果をホストDBに「結果ビュー」として作成する resultviewname = “postcodeview“ ‘結果ビューの名前 expirehours = 24 ‘ホストDBにビューを残す時間(単位:時間)、デフォルトは24時間、updall or DBMT で期限を延長可能(?) readers(0) = "CN=admin/O=v10" 'ユーザーの階層名 readers(1) = "[Admin]" 'ユーザーロール readers(2) = "LocalDomainServers" 'グループ名 Set view = qrp.Executetoview( resultviewname, expirehours, readers )

Slide 11

Slide 11 text

> show database DQL1201.nsf e [24C8:000A-42CC] DQL 12.0.1 [24C8:000A-42CC] Results View sizes Bytes Expires [24C8:000A-42CC] (postcodeview) 99,680 2022/03/15 07:05:57 e オプション付きで show database を投入すると 結果ビューの情報(名前、サイズ、期限)を表示できる resultviewname = "postcodeview" expirehours = 24 Set view = qrp.Executetoview( resultviewname, expirehours, readers ) Dominoコンソール

Slide 12

Slide 12 text

結果ビューは Domino Designer からアクセス可能 名前には括弧が付くため「隠しビュー」となる

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

'列(カラム)定義の追加 Call qrp.Addcolumn( "jiscode", "", "", SORT_ASCENDING, False, True )

Slide 15

Slide 15 text

'列(カラム)定義の追加 Call qrp.Addcolumn( "jiscode", "JISコード", "", SORT_ASCENDING, False, True ) ※ Addcolumnメソッドの 第2パラメータは、出力先 がJSONの場合反映されな い

Slide 16

Slide 16 text

'列(カラム)定義の追加 Call qrp.Addcolumn( "postcode3", "", "@Left(postcode7;3)", SORT_ASCENDING, False, True )

Slide 17

Slide 17 text

'列(カラム)定義の追加 Call qrp.Addcolumn( "postcode7", "", "", SORT_ASCENDING, False, False ) '列式の追加(郵便番号へ記号の付加、ワイルドカード使用) Call qrp.Addformula( "'〒'+@Left(postcode7;3)+'-'+@Right(postcode7;4)", "postcode7", "allDoc*" ) ビュー(設計) ビュー(データ)

Slide 18

Slide 18 text

'列(カラム)定義の追加 Call qrp.Addcolumn( "jiscode", "", "", SORT_ASCENDING, False, True ) Call qrp.Addcolumn( "postcode3", "", "@Left(postcode7;3)", SORT_ASCENDING, False, True ) Call qrp.Addcolumn( "postcode7", "", "", SORT_ASCENDING, False, False ) Call qrp.Addcolumn( "state_kanji", "", "", SORT_UNORDERED, False, False ) Call qrp.Addcolumn( "doclink", "", "", SORT_UNORDERED, False, False )

Slide 19

Slide 19 text

結果ビューの QueryOpenDocument イベントのコードによって 結果ビューに表示されている(別のDBにある文書の)エントリを ダブルクリックすると文書は開きます。

Slide 20

Slide 20 text

結果ビューに表示されている(別のDBにある文書の)エントリから 文書のプロパティを開こうとすると 「文書が無効またはありません」と表示されます。 ※このメッセージの表示がループすることもあるので要注意

Slide 21

Slide 21 text

結果(JSON) ‘実行(JSON出力):QRPで計算とソートし、結果をJSONを作成する Set nav = qrp.Executetojson() Set doc = New NotesDocument( db ) Call doc.Appenditemvalue( "json", nav.Stringify() ) Call doc.Save( True, False )

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

以下、自動で付加される • 最上位に”StreamResults” • カテゴリを有効にすると”category” • 文書一覧直前には”documents” • 文書ごとに”@nid”, “@DbPath” Visual Studio Codeへペースト後、Shift+Alt+F でフォーマット

Slide 24

Slide 24 text

結果ビューのために 追加された コマンドオプション show database, updall

Slide 25

Slide 25 text

結果ビューのサイズと期限 +データベースにある結果ビューのサイズと期限を表示 show database database e

Slide 26

Slide 26 text

結果ビューの削除と期限の延長 +ビュー名を指定して削除する load updall database -Tx resultsviewname +有効期限を延長する(単位:日) load updall database -T- resultsviewname days -T- は機能してなくない?

Slide 27

Slide 27 text

> sh database DQL1201.nsf e [1AA0:000A-1DE0] DQL 12.0.1 [1AA0:000A-1DE0] Results View sizes Bytes Expires [1AA0:000A-1DE0] (postcodeview) 116,064 2022/03/15 16:46:56 > load updall DQL1201.nsf [44A4:0002-42C4] 2022/03/15 22:47:27 Index update process started: DQL1201.nsf [44A4:0002-42C4] 2022/03/15 22:47:27 Updating views in C:¥IBM¥Domino¥data¥DQL1201.nsf [44A4:0002-42C4] 2022/03/15 22:47:27 Updating views in C:¥IBM¥Domino¥data¥DQL1201.nsf [44A4:0002-42C4] QueryResults::NamedFoundsetDeleteOld() has been called [44A4:0002-42C4] Starting enumeration for ENUMACTION_FOUNDSET_DELETE_OLD in namedFoundsetEnumProc() [44A4:0002-42C4] Ending enumeration for ENUMACTION_FOUNDSET_DELETE_OLD in namedFoundsetEnumProc() [44A4:0002-42C4] Deleted 0 old named foundsets in DQL1201.nsf [44A4:0002-42C4] 2022/03/15 22:47:27 QueryResults::NamedFoundsetDeleteOld() completed in 11.822 ms [44A4:0002-42C4] Named foundset total time used by object: 11.822 ms [44A4:0002-42C4] 2022/03/15 22:47:27 Updating C:¥IBM¥Domino¥data¥DQL1201.nsf view 'default' [44A4:0002-42C4] 2022/03/15 22:47:27 ビューの再構築 - コレクションオブジェクトは削除しました。(読み込み C:¥IBM¥Domino¥data¥DQL1201.nsf ビュー 文書 '(postcodeview)') [44A4:0002-42C4] 2022/03/15 22:47:27 ビューの再構築 - コレクションオブジェクトは削除しました。(読み込み C:¥IBM¥Domino¥data¥DQL1201.nsf ビュー 文書 '(postcodeview)') [44A4:0002-42C4] 2022/03/15 22:47:27 ビューの再構築 - コレクションオブジェクトは削除しました。(読み込み C:¥IBM¥Domino¥data¥DQL1201.nsf ビュー 文書 '(postcodeview)') [44A4:0002-42C4] 2022/03/15 22:47:27 Results view (postcodeview) in C:¥IBM¥Domino¥data¥DQL1201.nsf deleted (expiration 2022/03/15 16:46:56) [44A4:0002-42C4] 2022/03/15 22:47:27 Finished updating views in C:¥IBM¥Domino¥data¥DQL1201.nsf [44A4:0002-42C4] 2022/03/15 22:47:27 Index update process shutdown > sh database DQL1201.nsf e [1AA0:000A-1DE0] DQL 12.0.1 [1AA0:000A-1DE0] Results View sizes Bytes Expires > 期限切れの結果ビューが updall で削除される様子 -Tx オプションは指定しない

Slide 28

Slide 28 text

制限、注意点など

Slide 29

Slide 29 text

QRPの注意点(12.0.1 の制限?) 実行できる ✓Dominoサーバー上にあるア プリのコードをサーバー上 で実行する ✓クライアントの(ローカル にある)アプリのコードを 実行する 実行できない Dominoサーバー上にあるア プリのコードをクライアン ト側で実行する 【参考】KB0095920 リモートデータベースで NotesQueryResultsProcessor を実行できない https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0095920

Slide 30

Slide 30 text

コレクションやクエリーの結果が0件のとき ExecuteToJson メソッドがエラーになる。 可能ならばコレクションのCountプロパティを使い 件数がなければ ExecuteToJson を実行しないようにしましょう。 12.0.1 FP1 で問題が修正され、 エラーにならないことを確認し ました

Slide 31

Slide 31 text

同じコードを続けて実行するなどして 結果ビューと同名のビューが存在する場合 上書きや自動削除は行ってくれないので ExecuteToViewメソッドの実行前にビューの既存チェックをしましょう

Slide 32

Slide 32 text

【参考】updall –j オプション NotesDominoQuery.Execute メソッドで作成した「結果セッ ト」に対するオプションがバージョン 12.0.1 で追加された QRPの ExecuteToView メソッドで作成した「結果ビュー」や AddCollectionメソッドやAddDominoQueryメソッドで付けた 「文書セットの名前」には反応しない [96C8:000A-9924] load updall DQL1201-1.nsf -j report <省略> [8FD0:0002-A6F8] # # # # # QRP Named Foundset report # # # # # [DQL1201-1.nsf] [8FD0:0002-A6F8] Name | Entries | Size | Time Created | Expiration | Query [8FD0:0002-A6F8] >---------- - - - - - - - - - - - [8FD0:0002-A6F8] mysavedresults | 37 | 23 | 2022/03/17 22:31:52 | 2022/03/18 22:35:56 | "@All" [8FD0:0002-A6F8] >---------- - - - - - - - - - - - [8FD0:0002-A6F8] Total count: 1 [8FD0:0002-A6F8] Total size: 421 [8FD0:0002-A6F8] Named foundset total time used by object: 2.357 ms

Slide 33

Slide 33 text

まとめ

Slide 34

Slide 34 text

まとめ +結果ビューは、隠しビューとして生成されることや文書プロ パティを開けないなど、プログラミング用途のものである +AddFormulaで追加した式はDesignerクライアントで確認で きず、DXLへExportしても探せなかった…どこにもないの?