NotesQueryResultsProcessor (LotusScript)

複数のアプリケーションから収集した文書のコレクションを様々な計算を使って並び替え、その結果を一時的なビューや JSON 形式のファイルに出力します。

メモ:このクラスは、リリース 12.0 で新しく追加されました。

包含関係

NotesDatabase に含まれる

プロパティ

MaxEntries

TimeOutSec

メソッド

AddCollection

AddColumn

AddDominoQuery

AddFormula

ExecuteToJSON

ExecuteToView

作成

QueryResultsProcessor オブジェクトを作成するには、NotesDatabase で CreateQueryResultsProcessor メソッドを使用します。

構文

Dim variableNameAs NotesQueryResultsProcessor
Set notesQueryResultsProcessor = notesDatabase.CreateQueryResultsProcessor

パラメータ

なし

 

 


MaxEntries プロパティ

コレクションとして入力する文書の最大数を指定します。ExecuteToJSON または ExecuteToView の処理中に、すべての入力コレクションから取ってきた文書の数が MaxEntries の制限を超えるとエラーが発生します。

データ型

Long

構文

取得するには:
 Dim maxentries as Long
 maxentries = qrp.MaxEntries
設定するには: qrp.MaxEntries = value

使い方

QueryResultsProcessor エンジンには、入力されたすべての条件のデータが含まれるため、 MaxEntries を使用して処理を行う総数を制限します。この制限が超過した場合、処理は失敗し、「照会のためにスキャンされる文書またはビューエントリーの最大数を超えています」というエラーメッセージが返されます。デフォルトでは、制限はありません。

 

 


TimeOutSec プロパティ

ExecuteToJSON または ExecuteToView の実行時間を制限します。実行時間が TimeOutSec の制限を超えるとエラーになります。

データ型

Integer

構文

取得するには:
 Dim timeoutsec Long
 timeoutsec = qrp.TimeOutSec
 
設定するには:
 qrp.TimeOutSec = value

使い方

指定しない場合、QueryResultsProcessor エンジンは、すべての検索結果が返されるか、ビューが完全に計算されるまで処理が続けられます。

 

 


AddCollection メソッド

QueryResultsProcessor の処理対象として NotesDocumentCollection または NotesViewEntryCollection を追加します。

構文

Call notesQueryResultsProcessor.AddCollection(Variant Collection, String ReferenceName)

パラメータ

Collection

Variant。NotesDocumentCollection オブジェクトまたは NotesViewEntryCollection オブジェクト。

ReferenceName

String。QueryResultsProcessor インスタンス内で一意となる入力コレクションの名前です。この名前は、以下のような用途で使用されます。

Dim qrp As NotesQueryResultsProcessor
Set qrp = db.Createqueryresultsprocessor()
Dim dc1 As NotesDocumentCollection
Set dc1 = db.Ftsearch("[sales_person] contains Trudi", 10000)
‘ add the collection, name it rslts2
Call qrp.Addcollection(dc1, "rslts1")

 

 


AddColumn メソッド

このメソッドは、QueryResultsProcessor 実行時に返される 1 列の値を作成します。

また、Domino 14.0 以降では、.executeToView() を使ってビューを作成する場合に、既存のビューの設計を指定すると、.addColumn() を呼び出してそのビューの列の名前を指定し、列プロパティを上書きすることができます(例については ExecuteToView (NotesQueryResultsProcessor - LotusScript) を参照してください)。

構文

Call notesQueryResultsProcessor.AddColumn
(String Name, Optional String Title, Optional String Formula, Optional Integer SortOrder, Optional Boolean Hidden, Optional Boolean Categorized)

パラメータ

Name

この値は、QueryResultsProcessor インスタンス内で一意な「列のプログラム名」です。

addFormula メソッドで上書き指定をしない場合、指定された名前は 各データベース内のフィールド名として扱われます。JSON 出力では、この名前が返される各エントリの要素名になります。

さらに、name フィールドには 集計関数(aggregate functions)を指定することもできます。集計関数を使う場合は、カテゴリ化された列が必要です。集計関数は、指定カテゴリ内の結果セットを対象に 数値を計算して返します。集計関数に引数として名前が必要な場合、その名前も通常の name 値と同様に上書き可能です。

Title

String。オプション。列の表示タイトル。 title は 生成されたビューでのみ使用される UI 上の列ヘッダです。

Formula

文字列。列の値を計算するための式言語を指定します。これがデフォルトの計算方法となります。

指定がない場合、または addFormula で上書きされない場合、name 引数がフィールド名として扱われます。

列の値を決定する優先順位は次の通りです:

1. addFormula での式言語による上書き
2. AddColumn メソッドの Formula 引数
3. AddColumn メソッドの name 引数をデータベースのフィールド名として使用

Formula を指定した場合、その式は addCollection や addDominoQuery で追加されたすべての結果セットに対して適用されます。

なお、集計(aggregate)を持つ列には Formula を使用できません。

SortOrder

Integer。オプション。並べ替えの方向を示す以下の定数。デフォルトは SORT_UNORDERED。
SORT_UNORDERED
SORT_ASCENDING
SORT_DESCENDING

Hidden

Boolean。オプション。この設定を有効にすると、列の値を返さずにソートだけに利用できます。true に設定した場合、列のソート順は SORT_UNORDERED にできません。また、その列を カテゴリ化(Categorized)= True にすることもできません。

Categorized

Boolean。オプション。列をカテゴリ化すると、その列のユニークな値ごとに 1 つのエントリが返され、その値を持つエントリは入れ子(ネスト)構造として配置されます。

JSON 出力では、これらの入れ子エントリは、カテゴリ化された値の下に配列として表現されます。

繰り返しフィールド(リスト型の値)はカテゴリ化できません。

カテゴリ化された列の前に、カテゴリ化されていない列がある場合:
そのカテゴリ化列は「前にある非カテゴリ化列+カテゴリ化列」の組み合わせをカテゴリ値として生成します。つまり、カテゴリ化列は 自分自身の値に加え、前にある非カテゴリ化列の値もまとめてカテゴリを作ることになります。

複数のカテゴリ列を使えば、階層的なサブカテゴリ(ネストされたカテゴリ) を作ることもできます。

次の列を左から右の順に追加して考えてみましょう。

Col1 Col2 Col3 Col4 Col5 Col6 Col7 
カテゴリ     カテゴリ   カテゴリ  

カテゴリ階層の例

第1カテゴリ → Col1 の値
第2カテゴリ(サブカテゴリ) → Col2, Col3, Col4 の値
第3カテゴリ → Col5, Col6 の値

Col7 の値 → 上記 3 つのカテゴリそれぞれの下に、文書ごとに含まれる

集計関数(Aggregate functions)の名前は @@ から始めます。大文字・小文字は区別されません。入れ子(ネスト)にはできません。出力は 整数 または 浮動小数点値 のどちらかです。

集計関数の例

@@avg(col1)
→ Col1 内のすべての値の合計を、そのカテゴリ内の文書数で割った平均値を返す

@@sum(col2)
→ Col2 内のすべての値の合計を返す(カテゴリ単位)

@@max(col3)
→ Col3 内の最大値を返す(カテゴリ単位)

@@min(col4)
→ Col4 内の最小値を返す(カテゴリ単位)

@@count()
→ 現在のカテゴリ内の文書数を返す

注意点
集計関数を持つ列は、計算方式によって制御され、常に SORT_UNORDERED(並び替えなし) になります。


次のような列を左から右の順に追加して考えてみます。
1 2 3 4 5 6 7 8

Col1

Col2
カテゴリ

@@avg(Col3)

@@sum(Col4)

Col5

Col6
カテゴリ

@@avg(Col7)

col8

カテゴリの表示の流れ

列順序のルール

※たとえば、Col4 と Col5 の順序を入れ替えたり、Col7 より先に Col8 を置いたりすることはできません。

重要:
この順序を守らない場合、検証エラーや想定外の結果が発生します。
正しい出力例については、カテゴリと集計関数を使ったサンプルを参照してください。

次の例は、シンプルな単一カテゴリーのカラム・セットを示しています。

Set qrp = db.Createqueryresultsprocessor()

	…
Call qrp.Addcolumn("sales_person", "", “”, SORT_ASCENDING, False, True)
Call qrp.AddColumn("ordno", "", “”, SORT_DESCENDING, False, False, 
     “order_number * 1000”)
Call qrp.AddColumn("order_origin", "", “”, SORT_UNORDERED, False, False)
Call qrp.AddColumn("partno")

カテゴリと集計関数の例

以下の例では、前の表に示した列名で入れ子になったカテゴリの結果を作成します。オーバーライドを使用する例については、addFormula の例のケース 2 を参照してください。
‘  First category - 2 fields making 1 categorized key value	
Call qrp.AddColumn("Department", "Dept",, “$Left(dept; 10)”, 
     SORT_ASCENDING, False, False);
Call qrp.AddColumn("JobTitle", "Job Title ", “"SORT_ASCENDING, False, True)
				
‘  aggregates off the first category
Call qrp.AddColumn("@@avg(salary)", "", “”, SORT_UNORDERED, False, False)
Call qrp.AddColumn("@@sum(salary)", "", “”, SORT_UNORDERED, False, False)
	
‘  2nd category -  2 field categorized key
Call qrp.AddColumn("GEO”)  ‘ see shortened method form below
Call qrp.AddColumn("OU", "Organizational Unit ",””, SORT_ASCENDING, False, True)
				
‘ 4 aggregates off the 2nd category
Call qrp.AddColumn("@@count()", "", “”, SORT_UNORDERED, False, False)
Call qrp.AddColumn("@@avg(salary)", "", SORT_UNORDERED, False, False)
Call qrp.AddColumn("@@sum(salwithraise)", "", “”, SORT_UNORDERED, False, False)
Call qrp.AddColumn("@@avg(salwithraise)", "", “”, SORT_UNORDERED, False, False)
			
‘  document detail under both categories - unique to Domino
Call qrp.AddColumn("FullName", "Full Name ", “”, SORT_ASCENDING, False, False)

 

 


AddDominoQuery メソッド

NotesDominoQuery の文書の出力セットを実行し、NotesQueryResultsProcessor インスタンスに含まれる文書に追加します。すべての NotesDominoQuery パラメータは、DQL クエリの実行に対して有効です。

構文

Call notesQueryResultsProcessor.AddDominoQuery(NotesDominoQuery Query, String QueryString, String ReferenceName)

パラメータ

Query

作成され、すぐに実行できる NotesDominoQuery クラスインスタンス。パラメータの詳細については、NotesDominoQuery を参照してください。

QueryString

String。実行するDomino Query Language のクエリ。置換変数とすべての DQL 構文を含むことができます。

ReferenceName

String。 入力セットの一意の名前 (NotesQueryResultsProcessor インスタンス)。この名前は、結果のソースが必要な場合に返されるエントリと、ソートされた列値を作成するために使用されるデータをオーバーライドするための addFormula メソッド呼び出しで使用されます。

Dim dq As NotesDominoQuery
Set dq = db2.Createdominoquery()
dq.Maxscandocs = 300000
Dim qrp As NotesQueryResultsProcessor
Set qrp = db.Createqueryresultsprocessor()
Dim dc1 As NotesDocumentCollection

‘ Add the Query object as rslts2, provide the query text
‘ The query will be executed as part of this call
Call qrp.Adddominoquery(dq, "@all", "rslts2")

 

 


AddFormula メソッド

特定のソート列と入力コレクションまたはコレクションのセットの値の生成に使用されるデータをオーバーライドする Domino 式言語を提供します。入力コレクションは異なるデータベースから作成できるため、addFormula を使用して設計の違いを調整し、出力に均一な値を生成できます。

構文

Call notesQueryResultsProcessor.AddFormula(String Formula, String ColumnName, String ReferenceName)

パラメータ

Formula

String。ソート列の値を供給するために評価される式言語の文字列。

ColumnName

String。提供された式言語を使って値を生成するソート列のプログラム名を示す文字列値。

ReferenceName

String。数式を使用してソート列値を生成する入力コレクション名を指定するために使用します。複数の入力コレクション名に対応させるために、ワイルドカードを指定することができます。

Dim qrp As NotesQueryResultsProcessor 
Set qrp = notesDatabase.CreateQueryResultsProcessor 
…
‘ case 1 - overrides values For sales_person column in rslts1
Call qrp.Addformula("@lowercase(sales_person + foo)", _
	"sales_person", "rslts1")
‘ overrides values For sales_person column In rslts2
Call qrp.AddFormula("@Lowercase(sales_first + ' ' + sales_last)", _
	"sales_person", "rslts2")
‘ overrides ordno_adjusted column values for collection names matching rslts*
Call qrp.addFormula("ordno + 10000", "ordno_adjusted", "rslts*")

‘ case 2. override column names against the categorized, aggregate case described in AddColumn:
‘  supplies a 5% raise for across a categorized set of results
Call qrp.addFormula(“salary*1.05”, “salwithraise”, “coll*”) 
‘ constucts the fullname value from 2 other fields
Call qrp.addFormula(“firstname + “ “ + lastname”, “Fullname”, “coll*”)

 

 


ExecuteToJSON メソッド

ソート列で指定された方法で入力コレクションを処理し、addFormula で指定して式言語でフィールド値を上書きし、NotesJSONNavigator オブジェクトに JSON 形式の出力を返します。

構文

Set jsonnavigatorobj = notesQueryResultsProcessor.ExecuteToJSON()

NotesQueryResultsProcessor の実行結果は JSON RFC 8259 に準拠しています。

トップレベル要素
すべての結果は "StreamedResults" というトップ要素の下に出力されます。

カテゴリ化された結果
入れ子の詳細データは "Documents" キーの下に配置されます。

特別なキー
@nid → NoteID(文書を一意に識別)
@DbPath → データベースのパス
これらは文書単位で操作できるように出力されます。

リスト型フィールド
文書内に複数値フィールド(リスト)がある場合、それは 同一型の JSON 配列 として出力されます。

注意点
@DbPath はすべての結果エントリごとに出力されるため、やや冗長です。
HCL は、このような設計上の詳細について Beta フォーラムでフィードバックを募集しています。

パラメータ

なし

例1

以下の例は、QueryResultsProcessorのJSON出力の基本フォーマットを示しています。

{
   "StreamResults":[
      {
         "@nid":"NT0000A572",
         "@DbPath":"dev\\ordwrkqrp.nsf",
         "sales_person": "Smedley Gonstrap",
         "date_origin":"2001-10-26T00:00:00.00Z"
      },
      {
         "@nid":"NT0000A542",
         "@DbPath":"dev\\ordwrkqrp.nsf",
         "sales_person": "Otto Matic",
         "date_origin": "2001-10-26T00:00:00.00Z"
      }
}

例2

以下の例では、partnoフィールドの値リストがJSON配列として表示されています。

{
   "StreamResults":[
      {
         "@nid":"NT0000A3A6",
         "@DbPath":"dev\\ordwork.nsf",
         "Sales_Person":"Bryan Frye",
         "Order_origin":"San Diego",
         "Partno":[
            389,
            27883
         ]
      },
      {
         "@nid":"NT0000A3F6",
         "@DbPath":"dev\\ordwork.nsf",
         "Sales_Person":"Bryan Frye",
         "Order_origin":"San Diego",
         "Partno":[
            389,
            27883
         ]
      }
}

例3

以下は、"sales_person "フィールドを分類した同じ出力を示しています。

{
   "StreamResults":[
      {
         "Sales_person":"Bart Cherry",
         "documents":[
            {
               "@nid":"NT00009F22",
               "@DbPath":"dev\\ordwrk4.nsf",
               "Order_no":157779,
               "partno":587992
            },
            {
               "@nid":"NT00009EA6",
               "@DbPath":"dev\\ordwrk4.nsf",
               "Order_no":157602,
               "partno":388388
            },
            {
               "@nid":"NT00009DD2",
               "@DbPath":"dev\\ordwrk4.nsf",
               "Order_no":157285,
               "partno":587992
            }
},
{
         "Sales_person":"Bryan Frye",
         "documents":[
            {
               "@nid":"NT0000A2EA",
               "@DbPath":"dev\\ordwrk4.nsf",
               "Order_no":159141,
               "partno":388388
            },
            {
               "@nid":"NT0000A19E",
               "@DbPath":"dev\\ordwrk4.nsf",
               "Order_no":158701,
               "partno":587992
            }
}
}

例4

以下の例では、AddColumnで説明したような、カテゴリ化された集約関数カラムからの出力を示しています。
{
  "StreamResults": [
    {
      "Department": "Administration",
      "JobTitle": "Account manager/representative (sales or account management)",
      "@@avg(salary)": 84545.45454545455,
      "@@sum(salary)": 930000,
      "category": [
        {
          "OU": "Canada",
          "@@count()": 1,
          "@@avg(salary)": 82500,
          "@@sum(salary)": 82500,
          "@@avg(salwithraise)": 86625,
          "documents": [
            {
              "@nid": "NT00009A62",
              "@DbPath": "c:\\domino\\data\\dev\\fake50k4.nsf",
              "FullName": "Grayson Regan"
            }
          ]
        },
        {
          "OU": "China",
          "@@count()": 2,
          "@@avg(salary)": 87500,
          "@@sum(salary)": 175000,
          "@@avg(salwithraise)": 91875,
          "documents": [
            {
              "@nid": "NT0001DA2A",
              "@DbPath": "c:\\domino\\data\\dev\\fake50k4.nsf",
              "FullName": "Donald Head"
            },
            {
              "@nid": "NT000111D2",
              "@DbPath": "c:\\domino\\data\\dev\\fake50k2.nsf",
              "FullName": "Luca Humphries"
            }
          ]
        }
      ]
    }
  ]
}

 

 


ExecuteToView メソッド

QueryResultsProcessor のソート済み結果を データベース内の「結果ビュー」 に保存します。

入力コレクションは Sort Columns で指定された方法で処理されます。addFormula で指定された式でフィールド値を上書きできます。ホストデータベースに結果ビューを作成し、View オブジェクト を返します。

Domino 14.0.0 以降の新機能

構文

Set myview = qrp.ExecuteToView( Byval name As String, Optional Byval Expirehours As Long, Optional Readers as Variant, Optional DesignSrcDB As NotesDatabase, Optional byval DesignSrcViewName As String) As NotesView

パラメータ

name

String。作成して入力する結果ビューの名前。

Expirehours

Long。ビューがホストデータベースに残される時間です (時間単位)。指定しない場合は updall または dbmt タスクによって 24 時間で期限切れになります。

Readers

文字列の中の単一の名前か、名前を含む文字列の variant 配列です。これらは、ビュー内の文書に許可される読者を定義します。それぞれの値は正規表現でなければなりません。

DesignSrcDB

DesignSrcViewName が格納されているデータベース。NULLの場合、関数は呼び出し元のオブジェクトに関連付けられたデータベースをチェックします。

DesignSrcViewName

設計をコピーするビューの名前。指定されたビューを、作成する QRP ビューの設計元として使用します。NULL または空の場合、デフォルトの設計が使用されます。

使い方

ExecuteToView メソッドで作られる結果ビューには、通常のビューとは異なる特徴があります。Notes クライアントで開いたり、アプリケーションコードから利用する場合は、この点を理解しておく必要があります。

結果ビューは、指定したデータベースに作成/保持されます。このため、本番以外の別データベースに作成することが推奨となります。別データベースに作成することで、ユーザーが標準のビューと混同するのを防げることができます。

結果ビューはプログラムで作成される一時的なビューなので、有効期限が切れると自動的に削除されます。

結果ビュー内の文書は、固有の NoteID を持ちますが、これは通常の参照には使えません。

結果ビューのセキュリティは ビュー単位 で管理されます。

その他は、Domino 側では通常ビューと同様に処理されます。Domino Designer で編集可能ですが、選択条件や式(formula)は作成時に決定されるため変更はできません。

 メモ:Domino の [show database] コマンドに -e オプションを付けて使用すると、 データベース内の各結果ビューのサイズと有効期限を一覧表示します。

例 1: ExecuteToView の使用

Dim theReaders (1 to 4) as String
theReaders (1) = “CN=User1 UserLN1/O=MYORG”
theReaders (2) = “CN=User2 UserLN2/O=MYORG”
theReaders (3) = “PrivilegedGroup”
theReaders (4) = “CN=User3 UserLN3/O=MYORG”
 
Dim s As New NotesSession
Dim db As NotesDatabase
Dim qrp As NotesQueryResultsProcessor
Dim myview As NotesView
Set db = s.GetDatabase("myserver", "mydb.nsf")
Set qrp = db. CreateQueryResultsProcessor()

‘ .. AddColumn, AddDominoQuery, AddFormula, etc.

‘ That is, 2 hours to expiration, view name is MyNewResultsView

Set myview = qrp.executeToView(“MyNewResultsView”, 2, theReaders);

\‘ .. view processing

例 2: 非表示ビュー列の$DBPathと$NoteIDの使用

…
Dim pathelem As Integer
Dim nidelem As Integer
Dim dbPath As String
Dim realnid As String
Dim colvals as Variant
Dim v as NotesView
Dim vec as NotesViewEntryCollection
Dim ve as NotesViewEntry
Set dir = s.GetDbDirectory("")
Set db = dir.OpenDatabase("QRPHostDB.nsf")
Set v = db.GetView("Main Results View")
‘ For the view “Main Results View” it is known that 
‘      $DBPath column is the 5th         and
‘      $NoteID column is the 6th
Set pathelem = 5
Set nidelem = 6
For Each cn In v.ColumnNames
  count = count + 1
Set vec = v.GetAllEntries()
Set ve = vec.GetFirstEntry()
While NOT (ve is Nothing)
‘  Note – the NoteID property is useless since documents reside in other databases
   Set dbPath = ve.ColumnValues(pathelem)
   Set realnid = ve.ColumnValues(nidelem)
‘
‘ .. Whatever database open and document processing is desired
‘
   Set ve = vec.GetNextEntry()
wend

例 3: 特定の設計でビューを作成する

Set qrp = db.createDominoQuery()

‘ SrcDB contains a view named “MyCoolView” which will serve as the template for the design of our newly created view 
Set SrcDB = session.GetDatabase(“serverName”, “DBName”)

‘ oldColumn already exists in MyCoolView, we are renaming the title here
Call qrp.addColumn(“oldColumn”, “newTitle1”)

‘ newColumn does not exist in MyCoolView, we create it here
Call qrp.addColumn(“newColumn”, “newTitle2”)

‘ call executeToView where SrcDB is the DB where MyCoolView is stored
‘ MyCoolView contains columns with custom colors and fonts
Set myNewView = qrp.executeToView(“NewQRPViewName”, 0, null, SrcDB, “MyCoolView”)