目次


連載 Domino V10 アプリ開発 #鬼わか 解説

第 4 回「Node.js から DQL で Domino のデータにアクセスしてみよう #鬼わか 解説」

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: 連載 Domino V10 アプリ開発 #鬼わか 解説

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:連載 Domino V10 アプリ開発 #鬼わか 解説

このシリーズの続きに乞うご期待。

1

はじめに

連載 「Domino V10 アプリ開発 #鬼わか 解説」のページにアクセスいただき、ありがとうございます。

前回は、 Windows サーバー上に Node.js を導入し、Node.js アプリケーションから、Proton タスク経由で IBM Domino 上のアプリケーションにデータを登録する方法を解説しました。

今回は Domino V10 のコア機能として新しく提供された Domino Query Language (以下 DQL と略します) についてご紹介します。

DQL とは一言でいうと

「複雑な条件を用いた文書検索を簡潔な構文で実行可能にするクエリ言語」です。

例えば下記のような SQL ライクな構文のクエリ文で IBM Domino 上のアプリケーションに格納されているデータに対して検索を実行することが可能です。

例)クエリサンプル
location in (‘London’, ‘LA’, ‘Tokyo’) AND date > @dt(‘20160511’) or parts_number = 388388

「location」 フィールドの値が “London” か ”LA” か “Tokyo” かつ 「date」フィールドの値が “2016 年 5 月 11 日” 以降、あるいは 「parts_number」フィールドの値が “388388” の文書を検索する

また従来に比べて高速な検索を可能にすることができるのも特長のひとつです。

DQL に特化したインデックスをカタログ (GQFdsgn.cat) に登録し、これを最新の状態に保持していくことで、より高いパフォーマンスを実現することが出来ます。

では実際にサンプル DB を利用して DQL で文書検索を実行するやりかたをみていきましょう。

2

サンプル Notes DB の準備とデザインカタログの作成

今回、DQL を使って参照するサンプルアプリケーションとして、Teameuc アプリケーションを使用します。

Teameuc Notes アプリケーションを「こちら」からダウンロードし、Domino サーバーのデータディレクトリに配置します。

今回の環境では、下記に配置しています。

    配置パス     :/local/notesdata/demo/teameucdemo.nsf

次に、デザインカタログを作成します。

デザインカタログは「GQFDsgn.cat」という名前で、-e オプション付きの updall コマンド初回実行時にデータディレクトリに作成されます。

Domino サーバーコンソールから下記のコマンドを投入します。

load updall demo/teameucdemo.nsf -e

下記のように teameucdemo.nsf のビューに関連する情報がデザインカタログに出力されました。

 

(注 1) DQL を使わないアプリケーションをデザインカタログへ追加する必要はありません。
(注 2) ビューの設計を更新した場合にはデザインカタログの更新が必要となります。その場合は、-d オプションを使用して、「load updall demo/teameucdemo.nsf -d」のようにコマンドを投入します。現時点のバージョン (Domino V10.0.1) では、ビューの設計変更時にデザインカタログを自動更新する機能はありません。

3

Domino サーバーコンソールから DQL を実行

デザインカタログを作成したので、上記のサンプルアプリケーションで DQL を利用する準備ができました。それでは早速、DQL を試してみようと思います。まずはコンソールから試してみます。

今回の Domino Designer を使用してサンプルアプリケーションの中身を見ると、このようなフォームを使用しています。下記画面ショットで確認したフィールドを利用して、クエリ文を書いていきます。

 

コンソールで、下記のコマンドを入力して、DQL を利用した検索を実行します。

load domquery -f "demo/teameucdemo.nsf" -q "NumCont > 10000000" -e

こちらは、「demo/teameucdemo.nsf」というアプリケーションの「NumCont」というフィールドの値が、1000 万以上の文書を検索するというクエリ文です。

結果はこのようになりました。

 

Total Documents found =2 とある通り、

NumCont (金額) が 1000 万以上の文書は 2 件あることが分かります。

ちなみに、「-e」を付けているので、上記では検索にかかった時間も出力しています。

「-e」を末尾に付けずに実行してみます。

load domquery -f "demo/teameucdemo.nsf" -q "NumCont > 10000000"

「-e」がある場合と比べて情報が減り、Total Document found =2 と表示されるのみとなります。

 

管理コンソールからの実行確認は完了です。

条件に合致した文書を特定できることは分かりましたので、これを Node.js アプリケーションで利用して何ができるかを見てみたいと思います。

4

Node.js から DQL で Domino データを取得してみる

サーバーコンソールから DQL を実行できることを確認できたら、Node.js アプリケーションから DQL を使って IBM Domino アプリケーションのデータを取得してみましょう。

以下のソースコードを dql.js という名前のテキストファイルにコピーし、前回サンプルアプリを配置した作業用のディレクトリ (C:¥My-App など) にコピーしてください。その際に、サーバー名やポート番号は環境に合わせて書き換えてください。また、UTF-8 形式でファイルを保存して下さい。

<dql.js>
const { useServer } = require('@domino/domino-db');

const serverConfig = {
  hostName: 'your.server.com', // お使いのサーバーのホスト名へと変更してください
  connection: {
    port: '8080', // Proton タスクが利用しているポート番号へと変更してください
  },
};

const databaseConfig = {
  filePath: 'demo/teameucdemo.nsf', // TeamEUCデータベースのパスとファイル名を指定してください
};

useServer(serverConfig).then(async server => {
  const database = await server.useDatabase(databaseConfig);

  // 条件に合致した文書の顧客名とふりがなを取得
  const response = await database.bulkReadDocuments({
    query: "NumCont > 10000000",  // クエリ条件:NumContフィールドの値が、xxを超える場合
    // query: "ECont in ('Win', 'Lost')", // クエリ条件:EContフィールドの値が、'Win'もしくは'Lost'の場合
    itemNames: ['ACont', 'BCont'],    // ACont(顧客名)フィールドと、BCont(ふりがな)フィールドの値を取得
  });

  // ヒット数とエラー数を表示
  console.log("ヒット数: " + response.documents.length);
  console.log("エラー: " + response.errors);
//  console.log("DocumentRange.total: " + response.documentRange.total);
//  console.log("DocumentRange.start: " + response.documentRange.start);
//  console.log("DocumentRange.count: " + response.documentRange.count);

  // エラーがなければコンソールにヒット数分をループして表示
  if (response.errors == 0){
    for (var i = 0; i < response.documents.length; i++){
      console.log("顧客名: " + JSON.stringify(response.documents[i].ACont) + ", ふりがな: " + JSON.stringify(response.documents[i].BCont));
    }
  }
})

コマンドプロンプトを開き、C:¥My-App に移動し、node dql.js とコマンドを実行すると、dql.js 内に記述されたロジックが実行されます。

上記のソースコード中、赤字の部分が条件を指定するクエリです。NumCont (金額) フィールドの値が 10,000,000 を超える文書があれば、その ACont (顧客名) フィールドと、BCont (ふりがな) フィールドの値が表示されるはずです。

 

dql.js ファイルをメモ帳などで開き、赤字部分の条件を変更してみます。数値を 9,000,000 に変更して保存しましょう。

    query: "NumCont > 9000000",
// query: "ECont in ('Win', 'Lost')",

再度 node dql.js コマンドを実行すると、先ほどより多くの結果が返ってくることがわかります。結果が正しいか、Notes クライアントで「見積り金額」列をソートして確認してみてください。

 

次に、テキストフィールドの値で条件指定してみます。dql.js ファイルをメモ帳などで開き、NumCont の行を // でコメントアウトし、ECont の行の // を削除して、ファイルを保存します。

この条件では、ECont (ステータス) フィールドの値が Win もしくは Lost である文書が指定されます。

 // query: "NumCont > 9000000",
    query: "ECont in ('Win', 'Lost')",

再び node dql.js を実行すると、該当する文書の顧客名とふりがなが表示されます。

 

Notes クライアントのビューから同条件で検索しても、同じ結果が返ってきていることが確認できます。

 

5

おわりに

いかがでしたでしょうか?DQL を使って IBM Domino 上に格納されているデータにアクセスすることが可能になりました。皆様もぜひお試しください。

次回は Lotus Script から DQL を使う方法について、サンプルも交えて解説します。

お楽しみに!


ダウンロード可能なリソース


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Lotus
ArticleID=1064940
ArticleTitle=連載 Domino V10 アプリ開発 #鬼わか 解説: 第 4 回「Node.js から DQL で Domino のデータにアクセスしてみよう #鬼わか 解説」
publish-date=03052019