「Elixir Report」をWebアプリケーション向けのクエリ/レポートツールとして活用する

 帳票ツール「Elixir Report」を利用することで、GUIツールでデータベースへのクエリを作成したり、クエリ結果の編集や加工が簡単に行えるようになる。今回はWebアプリケーションからElixir Reportを利用してさまざまなデータに対しクエリを実行したり、それらを元にしたレポートを出力する方法を紹介する。

さまざまなアプリケーションで活用できるElixir Report

 Elixir Reportは、さまざまなデータソースからデータを取り出し、それらを元に表やグラフを作成してPDFやPowerPoint、画像、HTMLといった形式でそれらを出力できる帳票ツールだ。Elixir ReportにはGUIでデータソースの設定を行ったり、レポートテンプレートを作成する「レポートデザイナ」が用意されており、コードを一切記述せずにデータを元に表やグラフを含むレポートを生成できる(図1)。

図1 Elixir Reportのレポートデザイナ
図1 Elixir Reportのレポートデザイナ

 Elixir Reportの概要やレポートの作成方法については『コードを記述することなしにデータを表やグラフとして出力できる帳票ツール「Elixir Report」』や『「Elixir Report」を使ってクラウド上のデータをグラフ化してみよう』といった記事で紹介しているが、レポートデザイナで作成したデータソースやレポートテンプレートは、Elixir Reportに含まれるレポートサーバー経由で任意のアプリケーションからアクセスできる。

 Elixir ReportはJavaで実装されており、またレポートサーバーにアクセスするためのJavaライブラリも提供されている。そのため、Javaアプリケーションからであれば容易にElixir Reportの機能を利用することができる。とはいえ、アプリケーションの内容や開発体制によっては、Java以外の言語を使いたいというケースもあるだろう。そういった場合に向け、Elixir ReportのレポートサーバーはHTTPでも各種APIを呼び出せるようになっている。これを利用することで、任意の言語で実装されたアプリケーションからデータソースにアクセスしたり、レポートを生成することが可能だ。

クエリツールとしてのElixir Report

 Elixir Reportは表やグラフを出力する機能を備えているが、レポートサーバーではこれらを取得するAPIだけでなく、データソースから取得したデータをそのまま出力するAPIも用意されている。これらを利用することで、Elixir Reportをクエリツールとして利用することができるようになる。

 多くのアプリケーションでは、データベース内に格納されているデータを取得するのにSQLを利用する。SQLでは複数のテーブルにまたがってのクエリを実行できるだけでなく、複雑な条件を指定してデータを取得したり、複数のテーブルから取得したデータを結合したり、データをソートする、といった操作も可能だが、これら操作はすべてSQL文として記述しなければならず、そのために一定のスキルが必要となる。

 Elixir Reportでは基本的なSQL文をGUIで作成できるクエリビルダーが用意されているほか、取得したデータに対し集計やソート、フィルタといった操作を行える「コンポジットデータソース」機能や、データを一定期間キャッシュする機能も用意されている。これらを活用することで、データベースに含まれるデータを、アプリケーション側で利用しやすい形で簡単に取り出すことができる。

 そして、これらデータソースはElixir Reportからだけでなく、任意のアプリケーションから利用することもできる。つまり、Elixir Reportを任意のデータソースからデータを取り出すためのクエリツールとして利用できるのだ。

 今回の記事では、Elixir ReportをWebアプリケーションのバックエンドとして使い、Elixir Reportを使ってデータの取得や加工を行い、それをWebアプリケーションから利用する例を紹介する。

 今回作成するサンプルアプリケーションは、Googleの提供するアクセス解析ツール「Googleアナリティクス」で収集されたデータを取得し、指定した月の月間ページビュー(PV)やユニークユーザー、セッション数などのトラフィック情報をグラフとして表示するWebアプリケーションだ(図2)。

図2 今回作成したサンプルアプリケーション
図2 今回作成したサンプルアプリケーション

Elixir ReportのレポートサーバーAPI

 さて、サンプルアプリケーションについての解説を行う前に、Elixir ReportのレポートサーバーにアクセスするためのAPIについて紹介しておこう。

 『コードを記述することなしにデータを表やグラフとして出力できる帳票ツール「Elixir Report」』記事でも紹介したとおり、Elixir Reportではレポートサーバーがデータソースからのデータ取得やレポート(PDFや画像といった形式のドキュメント)の出力を担当している。アプリケーションからは、このレポートサーバーが提供しているAPI経由でデータ取得やレポートの出力といったレポートサーバーの機能を利用することになる。

 Elixir ReportではレポートサーバーAPIとして、Javaライブラリ経由で利用できるものと、HTTP経由で利用できるもの、そしてJDBC経由で利用できるものが提供されている。今回はこのうち、プログラミング言語を問わず利用できるHTTP経由で利用できるAPI(REST API)を利用することとする。

REST APIの構造と認証

 REST APIでは、レポートサーバーの特定のURLにGETやPOST、PUT、DELETEといったメソッドでリクエストを送信することで、レポートの生成やデータソースからのデータ取得と言った操作を実行できる。

 レポートサーバーにREST API経由でアクセスするには、まず認証が必要となる。レポートサーバーはCookieでセッション管理が行われており、「/login.html」にPOSTリクエストでユーザー名やパスワードを送信することでセッションが認証され、各種APIを呼び出せるようになる。また、「/logout.html」にGETリクエストを送信することでログアウトされ、認証が無効になる。

 ただし「/login.html」にリクエストを送信して認証を行う際、HTTPクライアントに対しCookieが割り当てられていないと、セッションが無効である旨が表示されてログインが行えない。そのため、POSTリクエストを送信する前にレポートサーバー上の適当なURLにアクセスしてセッションCookieを取得しておく必要がある。具体的な流れとしては、次のようになる。

  1. 適当なURL(「/」など)にアクセスしてCookieを取得する
  2. 取得したCookieをセットした状態で、「/login.html」に対し「username=<ユーザー名>」および「password=<パスワード>」というパラメータをPOSTで送信する
  3. 取得したCookieをセットした状態で必要なAPIを呼び出す
  4. 「/logout.html」にGETリクエストを送信し、ログアウトする

REST APIで取得できる情報

 REST APIでは、レポートサーバーに登録されているファイルシステムの情報や、ファイルシステム上に登録されているレポートテンプレートおよびデータソースといったファイルの情報などを取得できる。また、レポートのPDF形式でのレンダリングや、データソースからのデータの取得も可能だ。たとえばレポートをPDF形式でレンダリングするには、次のURLにGET形式でリクエストを送信する。

/report/<対象とするレポートのパス>

 このとき、URLの末尾に付加したクエリ文字列でパラメータを送信することで、レポートテンプレートに対し任意のパラメータを指定できる。たとえばレポートテンプレートの「start_date」に「2014-10-01」を、「end_date」に「2014-10-31」というパラメータを送信するには、次のようなクエリ文字列を指定すれば良い。

start_date=2014-10-01&end_date=2014-10-31&mime-type=application%2Fpdf&elx.disposition=inline

 また、データソースに対しては、次のURLにGETもしくはPOST形式でリクエストを送信することで、そのデータをExcelもしくはXML、CSV形式で取得できる。

/data/<対象とするデータソースのパス>

 たとえば「start_date」に「2014-10-01」を、「end_date」に「2014-10-31」というパラメータを指定し、XML形式でデータを取得する場合、POSTメソッドを使って次のようなデータをapplication/x-www-form-urlencoded形式で送信すれば良い。

{
  "start_date": "2014-10-01",
  "end_date": "2014-10-31",
  "mime-type": "text/xml"
}

 そのほか、リポジトリ(レポートサーバーに登録されているディレクトリ)内のファイル情報を取得したり、レポートテンプレートやデータソースに対して与えられるパラメータを取得するAPIなども用意されている。これらの詳しい情報はヘルプドキュメントを参照してほしい。