ILOG Elixir

IBM ILOG Elixir:FlexでさらにOLAPクエリを活用する

2009-09-15 12:21:49

 Flex Builder Proと、これに同梱されているData Visualizationライブラリには、OLAPエンジンとそのエンジンに対しクエリを行うためのAPIが付属しており、OLAPDataGridという名前のAdvancedDataGridの実装を使ってクエリの結果を表示することができる。この記事では、このAPIを利用し、デフォルトで提供されている機能よりも多くのことを行う方法について説明するが、その前にまず簡単にこのAPIの機能について説明しよう。

 ここでは、バックエンドから次のようなフラットな売上データが得られていると仮定しよう。

取引地域 取引製品 取引額
europe A 500000
us B 20000
europe A 100000
europe B 20000
us A 150000
us B 250000

 まずは、地域ごとにどれだけの売り上げを上げているかを知りたいと思うだろう。Flex OLAP APIを使えば実現できる。このためには、OLAPキューブの記述の中で、集計タイプにSUMを使ったメジャーを利用し、データを集約する。

<mx:OLAPMeasure name="Sales"
        dataField="sales"
        aggregator="SUM"/>

 あるいは、地域ごとの取引総額ではなく、平均取引額を表示したいと思うかも知れない。この場合は、次のようなメジャーを使えばよい。

<mx:OLAPMeasure name="Sales"
        dataField="sales"
        aggregator="AVG"/>

 キューブやクエリの設計について詳しく知りたければ、Adobe Systemsのドキュメントを読むことをお勧めする。集計方法に平均を指定した場合、結果は次のようになる。

 より複雑な集計方法を使いたいという場合もあるだろう。例えば、取引額が特定の金額よりも大きい取引がどのくらいあるかを知りたい場合もあるかもしれない。ここでは、10万ドルを超える取引の割合を知りたいとしよう。このためには、この操作を行う自作の集計タイプを作成する必要がある。これには、次に示すように、IOLAPCustomAggregatorインターフェースを実装すればよい。

package {
  import mx.olap.IOLAPCustomAggregator;  

  public class BigDealsAggregator implements IOLAPCustomAggregator
  {
    public function BigDealsAggregator() {}  

    public function computeBegin(dataField:String):Object {
      // start with a count of 0 for number of deals and of
      // big deals in a brand new object
      var newObj:Object = {};
      newObj[dataField] =  {
        totalCount : 0,
        bigDealsCount : 0
      };
      return newObj;
    }  

    public function computeLoop(data:Object, dataField:String,
                                           value:Object):void {
      // increment number of deals
      data[dataField].totalCount++;
      // increment number of big deals only if big deal
      if (value[dataField] > 100000) {
        data[dataField].bigDealsCount++;
      }
    }  

    public function computeEnd(data:Object, dataField:String):Number {
      // compute the percentage
      return 100 * data[dataField].bigDealsCount /
              data[dataField].totalCount;
    }  

    public function computeObjectBegin(value:Object):Object {
      // clone object
      var newObj:Object = {};
      for (var prop:String in value)
        newObj[prop] = value[prop];
      return newObj;
    }  

    public function computeObjectLoop(oldValue:Object,
                                                    newValue:Object):void {
      for (var prop:String in newValue) {
        oldValue[prop].totalCount += newValue[prop].totalCount;
        oldValue[prop].bigDealsCount += newValue[prop].bigDealsCount;
      }
    }  

    public function computeObjectEnd(oldValue:Object,
                                                  dataField:String):Number {
      return 100 * oldValue[dataField].bigDealsCount /
	   oldValue[dataField].totalCount;
    }
  }
}

 これを次のようにメジャーの定義で使う。

<mx:OLAPMeasure name="Sales"
        dataField="sales"
        aggregator="{new BigDealsAggregator()}"/>

 すると、データグリッドには平均取引額ではなく、大型取引のパーセンテージが表示される。

 さらに一歩進んで、単純にOLAPクエリをカスタマイズするだけではなく、その結果を異なるFlexコンポーネントで表示することもできる。この方法については、今後の記事で扱いたいと考えている。

IBM ILOG Elixirについての詳細は、http://www.ilog.co.jp/product/visu/ilogelixir/をご覧ください。

※このエントリは ブロガーにより投稿されたものです。朝日インタラクティブ および ZDNet Japan編集部の見解・意向を示すものではありません。
  • 新着記事
  • 特集
  • ブログ
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]