以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の情報処理装置を示す図である。情報処理装置1は、CPU(Central Processing Unit)などのプロセッサとRAM(Random Access Memory)などのメモリとを備えてもよく、メモリに記憶されたプログラムをプロセッサが実行するコンピュータであってもよい。また、情報処理装置1は、FPGA(Field Programmable Gate Array)やASIC(Application Specific Integrated Circuit)などの電子回路を備えてもよく、当該電子回路により情報処理装置1の機能が実現されてもよい。
情報処理装置1は、記憶部1aおよび演算部1bを有する。
記憶部1aは、イベントデータに基づく複数の処理を示す情報を含むルール情報2を記憶する。ここで、イベントデータは、例えば、ネットワークを介して情報処理装置1に接続されたイベントの発生元の装置(図示を省略)から情報処理装置1へ入力される。ルール情報2は利用者によって予め作成される。ルール情報2は、入力されるイベントデータに対して情報処理装置1にどのような処理を実行させるかを示すルールを記述した情報である。
複数の処理を示す情報には、例えば、入力されたイベントデータを直接的または間接的に用いる処理が含まれ得る。例えば、入力されたイベントデータを直接的に用いる処理は、入力されたイベントデータに対する条件判定の処理である。また、入力されたイベントデータを直接的に用いる処理は、当該イベントデータと記憶部1aまたは不図示の記憶装置に格納された外部テーブルとを結合する処理(JOIN)でもよい。イベントデータを直接的に用いる処理は、イベントデータに対して所定の計算や他の装置の制御を行う処理などでもよい。例えば、入力されたイベントデータを間接的に用いる処理は、当該結合の結果などを用いて他の装置の制御や、情報処理装置1が保持する制御用の情報の更新などを行う処理である。入力されたイベントデータを間接的に用いる処理は、当該結合の結果などを用いた条件判定の処理などでもよい。
演算部1bは、ルール情報2を参照して、第1の処理A1を示す情報と第1の処理A1の結果によらずに実行可能な条件判定Bの処理を示す情報と当該条件判定Bに関連付けられており第1の処理A1の結果を用いる第2の処理A2を示す情報とを検索する。例えば、第1の処理A1は、イベントデータと外部テーブルとを結合する処理である。第1の処理A1は、イベントデータを用いて所定の計算を行う処理などでもよい。例えば、第2の処理A2は、当該結合の結果に基づいてイベントの発生元の装置または他の装置を制御するための処理である。第2の処理A2は、当該結合の結果などを用いた条件判定の処理などでもよい。
また、第1の処理A1の結果によらずに実行可能な条件判定Bとは、第1の処理A1の結果が条件判定Bの結果に影響を及ぼさない条件判定である。条件判定Bは、第1の処理A1の結果を用いない条件判定であるということもできる。例えば、条件判定Bは、入力されたイベントデータを直接判定することで結果を得られる条件判定である。
更に、条件判定Bと第2の処理A2とが関連付けられている場合とは、条件判定Bの結果に応じて第2の処理A2を実行するか否かを判断するようにルールが記述されている場合が該当する。また、条件判定Bと並列に第2の処理A2の結果を取得するようにルールが記述されている場合も該当する。後者について、より具体的には、第2の処理A2が第1の処理A1の結果を用いた他の条件判定の処理であり、条件判定Bの結果と当該他の条件判定の結果とに基づいて、後続の他の処理を実行するようにルールが記述されている場合が考えられる。
演算部1bは、条件判定Bの結果に応じて第1の処理A1が実行され第1の処理A1の後に第2の処理A2が実行されるように処理の実行順を制御するための制御情報3を生成する。演算部1bは、生成した制御情報3を記憶部1aに格納する。演算部1bは、イベントデータが入力されると、記憶部1aに記憶された制御情報3に基づいて、入力されたイベントデータに応じた処理を実行する。
情報処理装置1によれば、演算部1bにより、ルール情報2が参照され、第1の処理A1を示す情報と第1の処理A1の結果によらずに実行可能な条件判定Bの処理を示す情報と条件判定Bに関連付けられており第1の処理A1の結果を用いる第2の処理A2を示す情報とが検索される。演算部1bにより、条件判定Bの結果に応じて第1の処理A1が実行され第1の処理A1の後に第2の処理A2が実行されるように処理の実行順を制御するための制御情報3が生成される。イベントデータが入力されると、演算部1bにより、制御情報3に基づいて、入力されたイベントデータに応じた処理が実行される。
これにより、イベントに対して効率的に処理を実行することができる。具体的には次の通りである。例えば、ルール情報2に含まれる第2の処理A2を実行するためには、第1の処理A1の結果が得られていることが前提である。一方、第2の処理A2は、条件判定Bと関連付けられている。このとき、ルールの記述のしかたによっては第1の処理A1が条件判定Bの前に実行され得る。
また、ルールを記述する言語によっては、条件判定の処理と、それ以外の処理とを明確に分け、条件判定後にそれ以外の処理を実行するように処理順序を定めることで、処理の高速化を図るものもある。条件判定のみであれば、レジスタなどを用いて高速に処理可能だからである。そのため、当該言語では、例えば結合の処理を条件判定の処理に含めて記述することを許していないことがある。当該言語を用いる場合、第2の処理A2が第1の処理A1の結果を用いる処理であると、条件判定Bの前に第1の処理A1を実行しておくことになる。
ところが、条件判定Bの前に第1の処理A1を実行するようにルールが定められている場合、第1の処理A1が無駄に実行され非効率的となるおそれがある。条件判定Bの結果によっては第2の処理A2を実行しなくてもよい場合があるからである。しかし、ルールの記述のしかたによって、処理順序を規定できる場合でも、利用者に対して常に処理の順序を意識してルールを作成するように強いることは難しい。また、上述のように記述言語によっては、条件判定Bの前に第1の処理A1を実行するような処理順序でしかルールを実行できないものも存在する。
そこで、情報処理装置1は、ルール情報2に基づいて制御情報3を生成する。情報処理装置1は、制御情報3に基づいて、入力されたイベントデータに応じた処理を実行する。例えば、条件判定Bは入力されたイベントデータを用いて結果を得られる(第1の処理A1の結果を用いない)条件判定であるとする。ルール情報2では、条件判定Bの結果が真の場合に第2の処理A2を実行し、条件判定Bの結果が偽の場合に第2の処理A2を実行しないように記述されているとする。
この場合、条件判定Bの結果が真であれば第1の処理A1を実行し、条件判定Bの結果が偽であれば第1の処理A1を実行しないように制御するための制御情報3が生成される。すると、あるイベントデータが入力されたとき、条件判定Bの結果が真であれば、第1の処理A1および第2の処理A2がこの順で実行される。別のイベントデータが入力されたとき、条件判定Bの結果が偽であれば、第1の処理A1および第2の処理A2は実行されない。第2の処理A2を実行しなくてよいのであれば、当該第2の処理A2の前提となる第1の処理A1も実行しなくてよいからである。
このように、条件判定Bの結果に応じて第1の処理A1を実行するか否かを制御することで、第1の処理A1が無駄に実行されることの防止を図れる。その結果、イベントに対して実行される処理の数が軽減され、所定時間当たりに処理できるイベントの数が向上する。また、無駄な処理の発生による他のイベントの処理待ちが改善されるので、イベントの発生に対して処理が実行されるまでの遅延を軽減できる。また、条件判定Bをフィルタ条件として抽出することで、例えばレジスタを用いて当該条件判定Bを高速に処理するように条件判定機能をモジュール化することも可能となる。
更に、ルール情報2に基づいて制御情報3を生成し、制御情報3に基づいてイベント処理を行う。このため、利用者が条件判定Bの前に第1の処理A1が実行されるようにルールを記述したとしても、第1の処理A1が無駄に実行されないように処理順序を制御することができる。また、利用者の処理順序を考慮したルール記述の負担を軽減でき、利用者によるルール記述の作業を省力化することができる。
[第2の実施の形態]
図2は、第2の実施の形態の情報処理システムを示す図である。第2の実施の形態の情報処理システムは、種々の装置がネットワーク10および中継装置20,30を介して接続され、各装置で発生したイベントに応じて、イベントの発生元の装置や他の装置の制御を行うシステムである。第2の実施の形態の情報処理システムは、携帯端末装置40、消費電力計測器50、空調機60、携帯電話機70、宅内電力管理装置80およびサーバ100を含む。
携帯端末装置40、消費電力計測器50および空調機60は、中継装置20およびネットワーク10を介してサーバ100と接続される。携帯電話機70および宅内電力管理装置80は、中継装置30およびネットワーク10を介してサーバ100と接続される。ネットワーク10は、LAN(Local Area Network)でもよいし、インターネットなどの広域ネットワークWAN(Wide Area Network)でもよい。中継装置20,30は、無線または有線の通信を中継するルータ装置やスイッチ装置などでもよい。中継装置20,30は、無線基地局でもよい。
携帯端末装置40は、ユーザによる入力を受け付け、当該入力に応じたイベントデータをサーバ100に送信する電子装置である。携帯端末装置40は、情報処理システムで発生したイベントに応じたメッセージなどをサーバ100から受信して、ユーザに提供することもできる。
消費電力計測器50は、ある宅内で消費される消費電力量を計測する計測器である。消費電力計測器50は、スマートメータと呼ばれることもある。消費電力計測器50は、計測した消費電力量をイベントデータに含めてサーバ100に送信する。
空調機60は、消費電力計測器50と同じ宅内に設置された電気機器である。空調機60は、現在の設定温度(建物室内の目標とする温度)をイベントデータに含めてサーバ100に送信する。空調機60は、情報処理システムで発生したイベントに応じてサーバ100から温度調整の指示を受信すると、当該指示に応じて設定温度を変更する。例えば、節電のためである。また、空調機60は、情報処理システムで発生したイベントに応じたメッセージなどをサーバ100から受信してユーザに提供することもできる。以下の説明において、空調機60では暖房機能が利用されているものとする。
携帯電話機70は、ユーザによる入力を受け付け、当該入力に応じたイベントデータをサーバ100に送信する電子装置である。携帯電話機70は、情報処理システムで発生したイベントに応じたメッセージなどをサーバ100から受信して、ユーザに提供することもできる。
宅内電力管理装置80は、太陽光発電などによる発電電力量を管理するための装置である。宅内電力管理装置80は、売電状態や買電状態などを切り替えの指示をサーバ100から受信すると、当該指示に応じて売電/買電状態などの切り替えを行う。
サーバ100は、各装置から随時受信するイベントデータに応じて、各装置を制御するための処理を実行するサーバコンピュータである。各装置から受信する複数のイベントデータをイベントストリームと呼ぶことがある。サーバ100は、CEPの技術を用いてイベントストリームに応じた処理を実行する。
図3は、第2の実施の形態のサーバのハードウェア例を示す図である。サーバ100は、CPU101、RAM102、HDD(Hard Disk Drive)103、画像信号処理部104、入力信号処理部105、ディスクドライブ106および通信部107を有する。各ユニットがサーバ100のバスに接続されている。
CPU101は、サーバ100の情報処理を制御するプロセッサである。CPU101は、HDD103に記憶されているプログラムやデータの少なくとも一部を読み出し、RAM102に展開してプログラムを実行する。サーバ100は複数のプロセッサを備えてもよく、複数のプロセッサを用いて処理を分散して実行してもよい。
RAM102は、CPU101が実行するプログラムや処理に用いるデータを一時的に記憶する揮発性メモリである。サーバ100は、複数のメモリを備えてもよい。
HDD103は、OS(Operating System)プログラムやアプリケーションプログラムなどのプログラムおよびデータを記憶する不揮発性の記憶装置である。HDD103は、CPU101の命令に従って、内蔵の磁気ディスクに対してデータの読み書きを行う。サーバ100は、HDD103に代えて、または、HDD103と併せて、SSD(Solid State Drive)などの他の記憶装置を備えてもよい。
画像信号処理部104は、CPU101の命令に従って、サーバ100に接続されたディスプレイ11に画像を出力する。ディスプレイ11としては、例えば、CRT(Cathode Ray Tube)ディスプレイや液晶ディスプレイなどを用いることができる。
入力信号処理部105は、サーバ100に接続された入力デバイス12から入力信号を取得し、CPU101に出力する。入力デバイス12としては、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
ディスクドライブ106は、記録媒体13に記録されたプログラムやデータを読み取る駆動装置である。記録媒体13としては、例えば、磁気記録装置、光ディスク、光磁気記録媒体、半導体メモリを使用できる。磁気記録装置には、HDD、フレキシブルディスク(FD)、磁気テープなどがある。光ディスクには、CD(Compact Disc)、CD−R(Recordable)/RW(ReWritable)、DVD(Digital Versatile Disc)、DVD−R/RW/RAMなどがある。光磁気記録媒体には、MO(Magneto-Optical disk)などがある。半導体メモリには、USB(Universal Serial Bus)メモリなどのフラッシュメモリがある。ディスクドライブ106は、例えば、CPU101の命令に従って、記録媒体13から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
通信部107は、ネットワーク10および中継装置20,30を介して他の装置と通信を行う有線または無線の通信インタフェースである。
図4は、第2の実施の形態のサーバのソフトウェア例を示す図である。図4に示すユニットの一部または全部は、サーバ100が実行するプログラムのモジュールであってもよい。また、図4に示すユニットの一部または全部は、FPGAやASICなどの電子回路であってもよい。
サーバ100は、記憶部110、振分部120および処理部130を有する。
記憶部110は、振分部120や処理部130の処理に用いるデータを記憶する。具体的には、記憶部110は、作成者などが作成したルール情報を記憶する。ルール情報は、イベントに応じて実行すべき複数の処理を示す情報を含む。ルール情報は、サーバ100に予め入力される。また、記憶部110は、ルール情報内の処理の実行順を制御するために処理部130が用いる制御情報を記憶する。当該制御情報は、振分部120によって生成され記憶部110に格納される。記憶部110は、RAM102やHDD103を用いて実装することができる。
振分部120は、記憶部110に記憶されたルール情報に基づいて制御情報を生成し、記憶部110に格納する。振分部120は、ルール情報に含まれる各処理を示す情報について、所定の関係性をもった処理を検索し、検索された処理の実行順を組替えることで制御情報を生成する。
処理部130は、他の装置からイベントデータを受信すると、記憶部110に記憶された制御情報に基づいて、イベントデータに応じた処理を実行する。以下の説明では、一例として、サーバ100が消費電力計測器50および空調機60から受信するイベントデータに基づいて、空調機60を制御する場合を説明する。
図5は、第2の実施の形態の入力されるイベントデータの例を示す図である。イベントデータ200は、各装置からサーバ100に送信されるデータである。イベントデータ200は、イベント種別、id(identifier)およびデータのフィールドを含む。
イベント種別のフィールドには、発生したイベントの種別を示す情報が設定される。idのフィールドには、イベントの発行元の装置を識別するための識別情報が設定される。データの項目には、イベントの内容を示す情報が設定される。データの項目には、イベントの発行元の装置によって、異なる種類の情報が設定され得る。例えば、消費電力計測器50によりデータの項目に設定される情報は、計測した消費電力量を示す情報である。例えば、空調機60によりデータの項目に設定される情報は、現在の設定温度を示す情報である。図5ではイベントデータ210,220も示されている。
イベントデータ210は、消費電力計測器50により生成されサーバ100に送信されるイベントデータである。イベントデータ210の各フィールドの設定内容は次の通りである。イベント種別には、消費電力計測器に関係するイベントであることを示す“P”が設定されている。idには、消費電力計測器50の識別情報である“0011”が設定されている。データには、計測された消費電力量である“1510(Wh)”が設定されている。イベントデータ210は、例えば、所定のタイミングで消費電力計測器50からサーバ100に送信される。周期的に送信してもよいし、計測した消費電力量が閾値を超過したタイミングなどに送信してもよい。
イベントデータ220は、空調機60により生成されサーバ100に送信されるイベントデータである。イベントデータ220の各フィールドの設定内容は次の通りである。イベント種別には、空調機に関係するイベントであることを示す“A”が設定されている。idには、空調機60の識別情報である“0021”が設定されている。データには、空調機60の現在の設定温度である“22(℃)”が設定されている。イベントデータ220は、例えば、所定のタイミングで空調機60からサーバ100に送信される。周期的に送信してもよいし、設定温度が変更されたタイミングなどに送信してもよい。
図6は、第2の実施の形態の出力されるイベントデータの例を示す図である。イベントデータ300は、処理部130により生成され、各装置に送信されるデータである。例えば、イベントデータ300は各装置を制御するためのデータである。イベントデータ300は、イベント種別、idおよびデータのフィールドを含む。各フィールドの設定内容は、イベントデータ200における同名のフィールドと同様である。図6ではイベントデータ310も示されている。
イベントデータ310は、イベントデータ210,220に応じて処理部130により生成され、空調機60に送信されるイベントデータである。イベントデータ310の各フィールドの設定内容は次の通りである。イベント種別には、空調機に関係するイベントであることを示す“A”が設定されている。idには、空調機60の識別情報である“0021”が設定されている。データには、空調機60に対する設定温度である“20(℃)”が設定されている。
次に、イベントデータ200を処理する処理部130のモジュール例を説明する。
図7は、第2の実施の形態の処理部の例を示す図である。図7に示すユニットの一部または全部は、サーバ100が実行するプログラムのモジュールであってもよい。また、図7に示すユニットの一部または全部は、FPGAやASICなどの電子回路であってもよい。
処理部130は、前段フィルタ部131、JOIN部132、後段フィルタ部133および主処理部134を有する。
前段フィルタ部131は、イベントデータ210またはイベントデータ220を用いて次段の処理を実行するか否かを判定する。次段の処理とは、JOIN部132または主処理部134における処理である。次段の処理は、ルール情報に記述されたルールによって決まる。
JOIN部132は、イベントデータ210,220と外部データとを結合する(JOIN)。外部データは、例えば、記憶部110に記憶されている。外部データは、サーバ100からアクセス可能な外部記憶装置に記憶されているものでもよい。ここで、記憶部110には、外部データとして、ホームテーブル111が記憶されているものとする。ホームテーブル111は、消費電力計測器50および空調機60が設置された家(建物)に関する情報を含む。ルール情報に記述されたルールの内容によっては、JOIN部132の処理がスキップされることもある。
後段フィルタ部133は、JOIN部132によるJOIN結果を用いて次段の主処理部134における処理を実行するか否かを判定する。ルール情報に記述されたルールの内容によっては、後段フィルタ部133の処理がスキップされることもある。
主処理部134は、イベントデータ210,220に応じて主処理部134で管理している情報の更新等の主要な処理を実行したり、必要に応じて出口処理を呼び出し、イベントデータ310を生成する。ルール情報に記述されたルールの内容によっては、主処理部134がJOIN部132のJOIN結果を用いることがある。
このように、処理部130は、前段フィルタ部131、JOIN部132、後段フィルタ部133および主処理部134に、条件判定、JOIN処理、主処理を委譲して実行させることができる。フィルタ処理を行う前段フィルタ部131および後段フィルタ部133、JOIN処理を行うJOIN部132、主処理を行う主処理部134というように明確に分けてモジュール化することで、各処理に適した実装を容易に行えるようになる。例えば、前段フィルタ部131や後段フィルタ部133ではフィルタ処理のみを専用で行うため、レジスタを用いた高速な処理を行うように実装することもできる。
図8は、第2の実施の形態のホームテーブルの例を示す図である。ホームテーブル111は、記憶部110に格納される。ホームテーブル111は、id、power、aircon、maxpow、nameおよびareaの項目を含む。
idの項目には、家(建物)を識別するための識別情報が登録される。powerの項目には、当該家に設置された消費電力計測器の識別情報が登録される。airconの項目には、当該家に設置された空調機の識別情報が登録される。maxpowの項目には、当該家における消費電力量(Wh)の閾値が登録される。この閾値は、イベントの判定に用いられる。nameの項目には、ユーザの名称が登録される。areaの項目には、当該家の存在する地域を示す情報が登録される。
例えば、ホームテーブル111には、idが“0001”、powerが“0011”、airconが“0021”、maxpowが“1500”、nameが“user1”、areaが“Tokyo”という情報が登録されている。これは、識別情報“0001”で示される家に、識別情報“0011”の消費電力計測器50および識別情報“0021”の空調機60が設置されていることを示す。また、イベントの判定に用いられる消費電力量の閾値が“1500”(Wh)であること、ユーザの名称が“user1”であること、当該家が東京に区分される地域に存在することを示す。
なお、ホームテーブル111では、idが“0002”で示されるレコードも登録されている。これは、他のユーザの家に関する情報である。当該レコードでは、例えば、powerが“0012”の消費電力計測器およびairconが“0022”の空調機が登録されている。このように、ホームテーブル111は、複数の項目が定義された複数のレコードを含む関係データである。
図9は、第2の実施の形態のルールセットの例を示す図である。ルールセット112は、記憶部110に格納される。ルールセット112は、情報処理システムの管理者などによって予め作成されるルール情報である。ルールセット112は、定義ルール112aおよび処理ルール112bを含む。
定義ルール112aは、イベントに関する一般的なルールを記述したデータである。
処理ルール112bは、定義ルール112aで定義されたイベントに対する具体的な処理内容を記述したデータである。
サーバ100は、定義ルール112aおよび処理ルール112bの個別の入力を許容する。振分部120または処理部130が定義ルール112aおよび処理ルール112bの個別の入力を受け付けて記憶部110に格納してもよい。定義ルール112aおよび処理ルール112bそれぞれは、異なるイベントに関する定義を記述するために複数作成されて記憶部110に格納されてもよい。
また、ルールセットも、イベントの組み合わせの別などに応じて複数作成されてもよい。例えば、第1のルールセットに第1のイベントの集合に関する定義ルールおよび処理ルールを登録し、第2のルールセットに第1のイベントの集合と重複しない第2のイベントの集合に関する定義ルールおよび処理ルールを登録することも考えられる。
図10は、第2の実施の形態の定義ルールの例を示す図である。定義ルール112aは、消費電力計測器に関係するイベント(イベント種別“P”)と空調機に関係するイベント(イベント種別“A”)に対する一般的なルールを記述したデータである。以下、定義ルール112aに便宜的に付した行番号を用いて各ルールを説明する。ここで、行番号はルールの符号に対応している。例えば、行番号d1のルールをルールd1と表す。例えば、ルールd1に対応する記述は“P(id,pow);”である。1つの行番号に対応する記述が1つのルールである。
ルールd1,d2は、イベント定義である。ルールd1では、イベント種別“P”で示されるイベントに対して、消費電力計測器の識別情報用の変数“id”と、消費電力量用の変数“pow”とが定義されている。イベントデータ210の例でいえば、id=“0011”である。pow=“1510”である。ルールd2では、イベント種別“A”で示されるイベントに対して、空調機の識別情報用の変数“id”と、温度用の変数“temp”とが定義されている。イベントデータ220の例でいえば、id=“0021”である。temp=“22”である。
ルールd3は、外部データおよび含まれる項目の定義である。ルールd3では、ホームテーブル111(テーブル名“Home”)について、“id”、“power”、“aircon”、“maxpow”,“name”、“area”の項目が定義されている。
ルールd4は、イベントに応じた状況を管理するためのウィンドウの定義である。ウィンドウを用いることでRAM102上に状況を示すデータを保持できる。ルールd4では、“Home.pow”という名前のウィンドウを用いて、ホームテーブル111の“id”の項目で示される各家の使用電力量(pow)を保持することが定義されている。例えば、id=“0001”で示される家の情報についてpow=“1510”を保持する場合、“Home(0001).pow=1510”のように、家の識別情報と消費電力量とを対応付けてRAM102上に格納する。なお、以下では“Home(id).pow”を“Home.pow”と“id”の指定部分を省略して表記することがある。
ルールd5,d6は、イベントデータと外部テーブルとのJOIN処理の定義である。ルールd5では、イベント種別“P”のイベントデータに含まれる“id”の値とホームテーブル111に含まれる“power”の値とが一致するレコードを抽出し、両データの全項目を組み合わせたレコードを得ることが定義されている。ルールd6では、イベント種別“A”のイベントデータに含まれる“id”の値とホームテーブル111に含まれる“aircon”の値とが一致するレコードを抽出し、両データの全項目を組み合わせたレコードを得ることが定義されている。
ルールd5は、条件判定の処理を示す情報を含んでいない。このため、ルールd5は1つの処理を示す情報と考えることができる。ルールd6も同様である。更に、ルールd5,d6の先頭がJOINを実行するための定型句“Select”であり、JOIN条件を示す“where”を含んでおり、当該定型句に基づいて、JOIN処理を行うルールであると判断することができる。
図11は、第2の実施の形態の処理ルールの例を示す図である。処理ルール112bは、消費電力計測器に関係するイベントおよび空調機に関係するイベントに対する具体的な処理内容を記述したデータである。以下、処理ルール112bに便宜的に付した行番号を用いて各ルールを説明する。図10と同様に、行番号はルールの符号に対応している。例えば、行番号r1のルールをルールr1と表す。例えば、ルールr1に対応する記述は“IF P.pow>500 THEN Set P.Home.pow=P.pow;”である。1つの行番号に対応する記述が1つのルールである。
ルールr1,r2,r3はイベントに対する処理内容を規定するルールである。
ルールr1では、消費電力計測器から送信されるイベントデータ(イベント種別“P”)に含まれる消費電力量(pow)が500(Wh)よりも大きい場合に、その家の消費電力量として、Home.powに設定することが定義されている。ここで、ルールr1は、Home.powに消費電力量を設定するが、Home.powウィンドウでは、ホームテーブル111のidに対応付けて消費電力量を保持する。このため、ルールr1では、ルールd5で示されるJOIN処理の結果を用いる。すなわち、ルールr1の実行時においてイベントデータの消費電力計測器の識別情報に対応する家の識別情報(ホームテーブル111のid)を得られることが前提となる。
ここで、ルールr1において、“P.pow>500”は条件判定を示す情報である。定型句である“IF”の文字列によって、当該条件判定を示す情報を識別できる。また、“Set P.Home.pow=P.pow”は、“P.pow>500”に関連付けられた処理を示す情報である。定型句である“THEN”により、“IF”内の条件判定を示す情報と“THEN”の後の処理を示す情報が関連付けられていることが分かる。そして、“Set P.Home.pow=P.pow”は上述のようにルールd5で示されるJOIN処理の結果を用いる処理である。
ルールr2では、空調機から送信されるイベントデータ(イベント種別“A”)に含まれる温度(temp)が25(℃)よりも大きい場合に、当該空調機にレコメンドメッセージ“設定温度を下げると省エネルギーになります”を送信することが定義されている。
ここで、ルールr2において、“A.temp>25”は条件判定を示す情報である。また、“Send A.msg=“設定温度を下げると省エネルギーになります””は、当該条件判定を示す情報に関連付けられた処理を示す情報である。ルールr1と同様に、“IF”や“THEN”の文字列によって、これらを識別することができる。
ルールr3では、空調機から送信されるイベントデータ(イベント種別“A”)に含まれる温度(A.temp)が20(℃)よりも大きく25(℃)以下であり、かつ、その家の消費電力量(Home.pow)がその家の消費電力量の閾値(Home.maxpow)よりも大きい場合に、当該空調機の設定温度を2℃下げるように制御することが定義されている。ここで、ルールr3は、Home.powから消費電力量を取得して、Home.maxpowと比較するが、この場合にもルールr1と同様に、該当する家のidを用いる。すなわち、ルールr3の実行時においてイベントデータの空調機の識別情報に対応する家の識別情報(ホームテーブル111のid)と当該家の消費電力量閾値(ホームテーブル111のmaxpow)を得られることが前提となる。
ここで、ルールr3において、“A.temp>20”、“A.temp<=25”および“A.Home.pow>A.Home.maxpow”は、条件判定を示す情報である。定型句である“IF”の文字列によって、当該各条件判定を示す情報を識別できる。また、各条件判定は定型句である“AND”の文字列によって関連付けられている。更に、“A.Home.pow>A.Home.maxpow”は上述のようにルールd6で示されるJOIN処理の結果を用いる処理である。また、“Cont A.temp−=2”は、上記各条件判定の処理を示す情報に関連付けられた処理を示す情報である。定型句である“THEN”により、“IF”内の(“AND”で結ばれた)各条件判定を示す情報と“THEN”の後の処理を示す情報が関連付けられていることが分かる。
図12は、第2の実施の形態の定義ルール管理テーブルの例を示す図である。定義ルール管理テーブル113は、振分部120によって生成され、記憶部110に格納される。定義ルール管理テーブル113は、No.、種別、名称および含まれる項目の項目を含む。
No.の項目には、定義ルール112a内で各ルールを識別するための情報が登録される。ここで、定義ルール112a内の1行を1つのルールとして管理している。したがって、定義ルール112a内の行番号がNo.の項目の設定値に対応する。種別の項目には、当該ルールの種別を示す情報が登録される。名称の項目には、当該ルールの種別に対する名称を示す情報が登録される。含まれる項目の項目には、ルール内に含まれる項目を示す情報が登録される。ただし、含まれる項目の項目には、種別がJOIN結果である場合、JOIN処理の結果によって得られる項目名が登録される。
例えば、定義ルール管理テーブル113には、No.が“d1”、種別が“イベント”、名称が“P”、含まれる項目が“P.id,P.pow”という情報が登録されている。これは、ルールd1の定義“P(id,pow)”に相当するものである。No.“d2”のレコードも同様にルールd2の定義に相当するものである。
また、例えば、定義ルール管理テーブル113には、No.が“d3”、種別が“外部表”、名称が“Home”、含まれる項目が“Home.id,Home.power,Home.aircon,Home.maxpow,Home.name,Home.area”という情報が登録されている。これは、ルールd3に相当するものである。
また、例えば、定義ルール管理テーブル113には、No.が“d4”、種別が“ウィンドウ”、名称が“Home.pow”、含まれる項目が“Home.pow”という情報が登録されている。これは、ルールd4の“Home.pow”のウィンドウの定義に相当するものである。
また、例えば、定義ルール管理テーブル113には、No.が“d5”、種別が“JOIN結果”、名称が“P.Home”、含まれる項目が“P.id,P.pow,P.Home.id,P.Home.aircon,P.Home.maxpow,P.Home.name,P.Home.area”という情報が登録されている。これは、ルールd5のJOIN処理の結果として得られる全項目に相当する。ルールd5では“Select * ・・・”と指定されているからである。ここで、ホームテーブル111に存在していた項目には、当該項目名の頭に“P.Home”の文字列を付して表す。これは、処理ルール112b内の表記と整合させ、イベント“P”に関連する家“Home”の項目であることを示したものである。
また、例えば、定義ルール管理テーブル113には、No.が“d6”、種別が“JOIN結果”、名称が“A.Home”、含まれる項目が“A.id,A.temp,A.Home.id,A.Home.power,A.Home.maxpow,A.Home.name,A.Home.area”という情報が登録されている。これは、ルールd6のJOIN処理の結果として得られる全項目に相当する。ルールd6では“Select * ・・・”と指定されているからである。ここで、ホームテーブル111に存在していた項目には、当該項目名の頭に“A.Home”の文字列を付して表す。これは、処理ルール112b内の表記と整合させ、イベント“A”に関連する家“Home”の項目であることを示したものである。
図13は、第2の実施の形態の制御テーブルの例を示す図である。制御テーブル114は、振分部120により生成され、記憶部110に格納される。制御テーブル114には、No.、前段フィルタ、JOIN、後段フィルタ、状況(ウィンドウ)および主処理の項目が含まれる。
No.の項目には、処理ルール112b内で各ルールを識別するための情報が登録される。ここで、処理ルール112b内の1行を1つのルールとして管理している。したがって、処理ルール112b内の行番号がNo.の項目の設定値に対応する。前段フィルタの項目には、当該ルールにおいて前段フィルタ部131で実行される条件判定の処理を示す情報が登録される。JOINの項目には、当該ルールにおいてJOIN部132で実行されるJOIN処理を示す情報が登録される。後段フィルタの項目には、当該ルールにおいて後段フィルタ部133で実行される条件判定の処理を示す情報が登録される。状況(ウィンドウ)の項目には、当該ルールで使用するウィンドウを示す情報が登録される。主処理の項目には、当該ルールにおいて主処理部134で実行される主処理を示す情報が登録される。
例えば、制御テーブル114には、No.が“r1”のレコードについて次のような情報が登録されている。
(1)前段フィルタ:“P.pow>500”
(2)JOIN:“Select * From P,Home Where P.id=Home.power;”
(3)後段フィルタ:設定なし(これを、ハイフン“−”で示している。以下同様)
(4)状況(ウィンドウ):“Home.pow”
(5)主処理:“Set P.Home.pow=P.pow”
これは、処理ルール112bのルールr1が、振分部120により前段フィルタ部131、JOIN部132、後段フィルタ部133および主処理部134に振り分けられた結果である。ただし、後段フィルタ部133に該当する処理がない。このため、ルールr1では後段フィルタ部133の処理はスキップされることになる。
また、例えば、制御テーブル114には、No.が“r2”のレコードについて次のような情報が登録されている。
(1)前段フィルタ:“A.temp>25”
(2)JOIN:設定なし
(3)後段フィルタ:設定なし
(4)状況(ウィンドウ):設定なし
(5)主処理:“Send A.msg = “・・・””
なお、主処理においてレコメンドメッセージの内容を“・・・”と略記している(以下、同様)。
これは、処理ルール112bのルールr2が、振分部120により前段フィルタ部131、JOIN部132、後段フィルタ部133および主処理部134に振り分けられた結果である。ただし、JOIN部132および後段フィルタ部133に該当する処理がない。このため、ルールr2ではJOIN部132および後段フィルタ部133の処理はスキップされることになる。
また、例えば、制御テーブル114には、No.が“r3”のレコードについて次のような情報が登録されている。
(1)前段フィルタ:“A.temp>20 A.temp<=25”
(2)JOIN:“Select * From A,Home Where A.id=Home.aircon;”
(3)後段フィルタ:“A.Home.pow>A.Home.maxpow”
(4)状況(ウィンドウ):“Home.pow”
(5)主処理:“Cont A.temp−=2”
なお、前段フィルタにおけるA.tempについての2つの条件はAND条件である。
これは、処理ルール112bのルールr3が、振分部120により前段フィルタ部131、JOIN部132、後段フィルタ部133および主処理部134に振り分けられた結果である。
図14は、第2の実施の形態の最適化後の制御テーブルの例を示す図である。制御テーブル114aは、振分部120により生成され、記憶部110に格納される。ここで、制御テーブル114aは、振分部120により制御テーブル114に所定の最適化処理を適用した後の情報である。制御テーブル114aには、No.、前段フィルタ、JOIN、後段フィルタ、状況(ウィンドウ)および主処理の項目が含まれる。各項目の設定内容は、制御テーブル114における同名の項目の設定内容と同様である。ただし、制御テーブル114,114aでは、JOIN以降の項目の設定内容が一部異なる。
具体的には、No.“r1”のレコードのJOIN項目について次のように異なる。
(1)制御テーブル114のJOIN: “Select * ・・・”
(2)制御テーブル114aのJOIN:“Select Home.id ・・・”
これは、後続の主処理“Set P.Home.pow=P.pow”で使用する項目が、ルールd5のJOIN結果により得られる項目のうちの“P.Home.id”のみだからである。具体的には、当該主処理では“P.Home.id”に基づいて、Home.powウィンドウ中から該当の家に関するウィンドウを特定している。
また、No.“r3”のレコードのJOIN項目について次のように異なる。
(1)制御テーブル114のJOIN: “Select * ・・・”
(2)制御テーブル114aのJOIN:“Select Home.id Home.maxpow ・・・”
これは、後続の後段フィルタで使用する項目がルールd6のJOIN結果により得られる項目のうちの“A.Home.id”および“A.Home.maxpow”のみであり、主処理ではJOIN結果を用いていないからである。すなわち、後続の処理のためには、JOIN結果として“A.Home.id”および“A.Home.maxpow”のみを取得しておけばよいからである。具体的には、当該後段フィルタでは、“A.Home.id”に基づいて、Home.powウィンドウ中から該当の家に関するウィンドウを特定している。また、当該後段フィルタでは、“A.Home.pow”に対する比較値として“A.Home.maxpow”を使用している。
また、No.“r1”のレコードの主処理項目について次のように異なる。
(1)制御テーブル114の主処理:“Set P.Home.pow=P.pow”
(2)制御テーブル114aの主処理:“Set Home.pow=P.pow”
これは、前段のJOIN部で“Home.id”が取得されており、主処理部では取得済の“Home.id”を使用して、”Home.pow”を直接処理できるからである。
また、No.“r3”のレコードの後段フィルタ項目について次のように異なる。
(1)制御テーブル114の後段フィルタ:“A.Home.pow>A.Home.maxpow”
(2)制御テーブル114aの後段フィルタ:“Home.pow>Home.maxpow”
これは、前段のJOIN部で“Home.id”が取得されており、後段フィルタ部では取得済の“Home.id”を使用して、”Home.pow”と”Home.maxpow”を直接処理できるからである。
図15は、第2の実施の形態の処理例を示すフローチャートである。以下、図15に示す処理をステップ番号に沿って説明する。
(ステップS11)振分部120は、ルールの振分を行う。具体的には、振分部120は、記憶部110に記憶されたルールセット112の定義ルール112aおよび処理ルール112bに含まれる各ルールに基づいて、制御テーブル114,114aを生成する。より具体的には、振分部120は当該各ルールに含まれる各処理を示す情報を検索し、各処理を示す情報を前段フィルタ、JOIN、後段フィルタおよび主処理に振り分ける。
(ステップS12)処理部130は、ルールと外部データとをメモリ上に展開する。具体的には、処理部130は、制御テーブル114aおよびホームテーブル111をRAM102上に読み込んでおく。これにより、処理部130においてイベントを受け付ける準備が整う。
(ステップS13)処理部130は、イベントデータを受信する。
(ステップS14)処理部130は、受信したイベントデータが終了イベントを示すか否かを判定する。終了イベントである場合、処理部130は制御テーブル114aやホームテーブル111を配置したRAM102上の領域を解放して、処理を終了する。終了イベントでない場合、処理をステップS15に進める。ここで、終了イベントとは、処理部130にイベント処理を終了させるためのイベントである。イベントデータが終了イベントであるとは、イベントデータに含まれるイベント種別に、終了イベントを示す情報が含まれることをいう。
(ステップS15)処理部130は、制御テーブル114aに基づいて、イベントデータに応じた処理を実行する。そして、処理をステップS13に進める。
このようにして、処理部130は、振分部120によって生成された制御テーブル114aに基づいて、イベント処理を行う。次に、ステップS11の処理を詳細に説明する。
図16は、第2の実施の形態のルール振分の例を示すフローチャートである。以下、図16に示す処理をステップ番号に沿って説明する。
(ステップS21)振分部120は、記憶部110に記憶された定義ルール112aに基づいて、定義ルール管理テーブル113を作成し記憶部110に格納する。定義ルール管理テーブル113は、上述したように定義ルール112a内の各ルール内に含まれる項目を分割することで作成することができる。例えば、ルールd1について“P(id,pow);”をカンマ“,”記号で分割して、含まれる項目として“P.id”および“P.pow”を得る。ルールd2,d3も同様である。また、ルールd4について、“Window Home.pow;”から、ウィンドウの名称“Home.pow”を得る。更に、ルールd5については、“Select”句と“Where P.id=Home.power”から、イベント種別“P”のイベントデータとホームテーブル111との結合を得ることが分かる。更に、“Select *”から結合結果の全項目を取得することが分かるので、“P”のイベントデータとホームテーブル111との上記結合結果の全項目“P.id,P.pow,P.Home.id,P.Home.aircon,P.Home.maxpow,P.Home.name,P.Home.area”を得る。ルールd6も同様である。ただし、この段階では実際のテーブルのJOIN処理は実行されていない。JOIN結果の項目が抽出されるのみである。振分部120は、このようにして定義ルール112aから得られた各項目を、ルールの番号(“d1”など)、種別および名称に対応付けて、定義ルール管理テーブル113に登録する。
(ステップS22)振分部120は、処理ルール112bに含まれる各ルールを“AND”条件を用いて組替える。ここで、“AND”条件を用いて組替えるとは、“OR”で結ばれた条件を含む1つのルールを“AND”のみを含む複数のルールに書き換えることを意味する。これによって、“OR”を含んで記述されたルールについても、組替え後のルールを用いて以降のステップを適用し得る。本ステップS22の具体的な処理の内容は後述する。
(ステップS23)振分部120は、ステップS22による組替え後の処理ルールからルール(処理ルール112bの1行分の記述に相当)を1つ抽出する。以降のステップにおいて、本ステップS23で抽出されたルールを単に“抽出されたルール”という。
(ステップS24)振分部120は、定義ルール管理テーブル113に基づいて、抽出されたルールがJOIN処理を含むか否かを判定する。JOIN処理を含む場合、処理をステップS25に進める。JOIN処理を含まない場合、処理をステップS26に進める。振分部120は、定義ルール管理テーブル113の種別“JOIN結果”に対応する“含まれる項目”内の何れかの項目を用いる処理が、抽出されたルール内に存在するか否かによって、JOIN処理を含むか否かを判定できる。例えば、ルールr1であれば、“Set P.Home.pow=P.pow”の処理において、消費電力計測器が設けられた家のウィンドウ“Home”を特定するためにルールd5のJOIN処理の結果に含まれる“P.Home.id”を用いる。よって、振分部120は、ルールr1についてJOIN処理を含むと判断する。同様にして、ルールr2についてはJOIN処理を含まないと判定される。ルールr3についてはJOIN処理を含むと判定される。
(ステップS25)振分部120は、抽出されたルールについて、制御テーブル114のJOINの項目に、JOIN処理を登録する。具体的には、ルールr1であれば、ステップS24で説明したようにルールd5で示されるJOIN処理を含む。よって、振分部120は、制御テーブル114においてルールr1(No.“r1”のレコード)のJOINの項目にルールd5のJOINを示す情報を登録する。
(ステップS26)振分部120は、抽出されたルールを最小項に分解する。最小項とは、ルール内に含まれる情報を条件判定部分(条件判定の処理を示す情報)を条件の最小単位に分割したものや主処理部分(条件判定の結果に応じて実行される処理を示す情報)に分割したものである。具体的な処理の内容は後述する。1つのルールに対して最小項は1つ以上含まれ得る。
(ステップS27)振分部120は、ステップS26で分割して得た最小項のうち、以降のステップS28〜S34で示す処理を行っていない未処理の最小項があるか否かを判定する。未処理の最小項がある場合、処理をステップS28に進める。未処理の最小項がない、すなわち、全ての最小項を処理済である場合、処理をステップS35に進める。
(ステップS28)振分部120は、未処理の最小項のうちから1つの最小項を抽出する。以降のステップにおいて、本ステップS28で抽出された最小項を単に“抽出された最小項”という。
(ステップS29)振分部120は、抽出された最小項がフィルタで処理可能であるか否かを判定する。抽出された最小項がフィルタで処理可能である場合、処理をステップS30に進める。抽出された最小項がフィルタで処理可能でない場合、処理をステップS32に進める。ここで、フィルタで処理可能であるとは、抽出された最小項が条件判定の処理を示す情報であって、かつ、当該最小項に含まれる項目が定義ルール管理テーブル113の該当のイベントに対応する“含まれる項目”に存在する項目のみで処理可能なことを示す。例えば、ルールr1からは後述するように“P.pow>500”という条件判定の処理を示す情報が最小項として抽出され得る。この最小項は、イベント種別“P”についてのものである。定義ルール管理テーブル113によれば、この最小項は、ルールd1に登録された“P.pow”のみを得ることで処理可能である。よって、振分部120は“P.pow>500”をフィルタで処理可能な最小項と判定する。また、例えば、ルールr1からは後述するように“Set P.Home.pow=P.pow”という処理を示す情報が最小項として抽出され得る。この場合、振分部120は、当該最小項が条件判定の処理ではないため、当該最小項がフィルタで処理可能ではないと判定する。
(ステップS30)振分部120は、抽出された最小項が入力されたイベントデータ内の項目に関する条件のみであるか否かを判定する。入力されたイベントデータ内の項目に関する条件のみである場合、処理をステップS31に進める。入力されたイベントデータ内の項目に関する条件のみではない場合、処理をステップS33に進める。例えば、前述したルールr1から抽出され得る最小項“P.pow>500”は、入力されるイベントデータに含まれる“P.pow”のみを用いて処理可能である。よって、振分部120は、当該最小項について入力されたイベントデータ内の項目に関する条件のみであると判定する。一方、例えば、ルールr3から抽出され得る最小項“A.Home.pow>A.Home.maxpow”はルールd6で示されるJOIN処理の結果得られる項目を含む。よって、振分部120は、当該最小項については入力されたイベントデータ内の項目に関する条件のみではないと判定する。
(ステップS31)振分部120は、抽出されたルールについて、制御テーブル114の前段フィルタの項目に、抽出された最小項を登録する。例えば、振分部120は、ルールr1について抽出された最小項“P.pow>500”を、制御テーブル114におけるNo.“r1”の前段フィルタの項目に登録する。そして、処理をステップS27に進める。
(ステップS32)振分部120は、抽出されたルールについて、制御テーブル114の主処理の項目に、抽出された最小項を登録する。例えば、振分部120は、ルールr1について抽出された最小項“Set P.Home.pow=P.pow”を制御テーブル114におけるNo.“r1”の主処理の項目に登録する。そして、処理をステップS34に進める。
(ステップS33)振分部120は、抽出されたルールについて、制御テーブル114の後段フィルタの項目に、抽出された最小項を登録する。例えば、振分部120は、ルールr3について抽出された最小項“A.Home.pow>A.Home.maxpow”を、制御テーブル114におけるNo.“r3”の後段フィルタの項目に登録する。そして、処理をステップS34に進める。
(ステップS34)振分部120は、抽出されたルールについて、後段フィルタまたは主処理で使用されるウィンドウがある場合、当該ウィンドウを示す情報を制御テーブル114の状況(ウィンドウ)の項目に登録する。そして、処理をステップS27に進める。例えば、ステップS32で例示した最小項“Set P.Home.pow=P.pow”では、ルールd4で定義されるウィンドウ“Home.pow”を使用している。よって、振分部120は、ルールr1について“Home.pow”を、制御テーブル114におけるNo.“r1”の状況(ウィンドウ)の項目に登録する。なお、振分部120は、抽出されたルールについて、後段フィルタまたは主処理で使用されるウィンドウがない場合、状況(ウィンドウ)への登録は行わない。
(ステップS35)振分部120は、ステップS22による組替え後の処理ルールに含まれる全てのルールについて、ステップS23以降のステップを実行したか否かを判定する。全てのルールについて処理済である場合、処理をステップS36に進める。未処理のルールがある場合、処理をステップS23に進める。
(ステップS36)振分部120は、制御テーブル114を最適化して、制御テーブル114aを作成する。具体的な方法は、図14で示した通りである。最適化により、JOIN結果として取得する項目を最小限に絞り込み、JOIN以降の処理を簡素化する。
このようにして、振分部120は、ルールセット112に基づいて制御テーブル114を作成する。また、振分部120は、制御テーブル114に基づいて制御テーブル114aを作成する。
なお、ステップS29において、抽出された最小項がフィルタで処理可能でない場合としては、例えば、当該最小項が主処理内の特殊な関数を用いた条件判定を示す情報である場合も考えられる。この場合、当該関数の結果により得られる項目を事前に把握することの難しいことがあり、当該関数により得られる項目を定義ルール管理テーブル113で管理することが難しいことがあるからである。ただし、当該関数により得られる結果を事前に把握できる場合には、定義ルール管理テーブル113で管理してもよい。
次に、ステップS22のANDを用いたルール組替えの例を説明する。
図17は、第2の実施の形態のルール組替えの例を示す図である。処理ルール112bには、“OR”を含むルールが記述されていないため、図17では新たにルールr4を例示している。ルールr4は本例を説明するために新たに図示したものであり、ルールセット112との関連はない。ここで、ルールr4では、“IF X=A AND (Y=B OR Z=C) THEN SET W=A;”と記述されている。
まず、振分部120は、ルールr4を、AND条件でまとめた条件をORで結合する形の論理式を用いた等価な1つのルールr5となるように書き換える。ルールr5は、“IF (X=A AND Y=B) OR (X=A AND Z=C) THEN SET W=A;”である。
更に、振分部120は、ルールr5にOR条件が含まれるため、ルールr5と等価な(すなわち、ルールr4と等価な)AND条件のみからなる複数のルールr6,r7となるようにルールr5を書き換える。ルールr6は、“IF X=A AND Y=B THEN SET W=A;”である。ルールr7は、“IF X=A AND Z=C THEN SET W=A;”である。
このように、振分部120は、“OR”を含んで記述されたルールr4を、“OR”を含まないように記述されたルールr6,r7に組替える。これにより、“OR”を含んで記述されたルールr4があったとしても、前段フィルタ、JOIN処理、後段フィルタおよび主処理への振分処理を適切に行える。このような組替えを行わないとすると、“OR”で結ばれた条件判定部分の振分が容易でない。“OR”で結ばれた2つの条件判定の結果に応じて“IF”で示される全体の条件判定の結果が変わることになり、“IF”で示される全体の条件判定の結果の導出が複雑化するからである。
次に、図16のステップS26におけるルール分解の例を説明する。
図18は、第2の実施の形態のルール分解の例を示す図である。図18(A)はルールr1のルール分解を例示している。ルールr1には、“IF”および“THEN”の定型句を用いて、条件判定部分r11(条件判定の処理を示す情報)と主処理部分r1a(主処理を示す情報)とが含まれている。条件判定部分r11および主処理部分r1aは、それぞれ1つの判定または処理を示しており、これ以上分解できないので、ルールr1における2つの最小項である。
振分部120は、“IF”の直後に続く“P.pow>500”を条件判定部分r11と判断する。振分部120は、“THEN”の直後に続く“Set P.Home.pow=P.pow”を主処理部分r1aと判断する。振分部120は、このようにしてルールr1を条件判定部分r11および主処理部分r1aの2つの最小項に分解する。
図16で説明した手順によれば、振分部120は、条件判定部分r11を前段フィルタに振り分ける。条件判定部分r11は、イベントデータに含まれる項目のみを用いて処理可能だからである。振分部120は、主処理部分r1aを主処理に振り分ける。主処理部分r1aは、条件判定以外の処理を含んでおりフィルタ処理可能ではないからである。
図18(B)はルールr2のルール分解を例示している。ルールr2には、“IF”および“THEN”の定型句を用いて、条件判定部分r21と主処理部分r2aとが含まれている。条件判定部分r21および主処理部分r2aは、それぞれ1つの判定または処理を示しており、これ以上分解できないので、ルールr2における2つの最小項である。
振分部120は、“IF”の直後に続く“A.temp>25”を条件判定部分r21と判断する。振分部120は、“THEN”の直後に続く“Send A.msg=“・・・””を主処理部分r2aと判断する。振分部120は、このようにしてルールr2を条件判定部分r21および主処理部分r2aの2つの最小項に分解する。
図16で説明した手順によれば、振分部120は、条件判定部分r21を前段フィルタに振り分ける。条件判定部分r21は、イベントデータに含まれる項目のみを用いて処理可能だからである。振分部120は、主処理部分r2aを主処理に振り分ける。主処理部分r2aは、条件判定以外の処理を含んでおりフィルタ処理可能ではないからである。
図18(C)はルールr3のルール分解を例示している。ルールr3には、“IF”、“AND”および“THEN”の定型句を用いて、条件判定部分r31,r32,r33および主処理部分r3aが含まれている。条件判定部分r31,r32,r33および主処理部分r3aは、ルールr3における4つの最小項である。
振分部120は、“IF”の直後に続く“A.temp>20”を条件判定部分r31と判断する。振分部120は、条件判定部分r31の次の“AND”の直後に続く“A.temp<=25”を条件判定部分r32と判断する。振分部120は、条件判定部分r32の次の“AND”の直後に続く“A.Home.pow>A.Home.maxpow”を条件判定部分r33と判断する。振分部120は、“THEN”の直後に続く“Cont A.temp−=2”を主処理部分r3aと判断する。振分部120は、このようにしてルールr3を条件判定部分r31,r32,r33および主処理部分r3aの4つの最小項に分解する。
図16で説明した手順によれば、振分部120は、条件判定部分r31,r32を前段フィルタに振り分ける。条件判定部分r31,r32は、イベントデータに含まれる項目のみを用いて処理可能だからである。振分部120は、条件判定部分r33を後段フィルタに振り分ける。条件判定部分r33は、ルールd5のJOIN結果を用いるからである。振分部120は、主処理部分r3aを主処理に振り分ける。主処理部分r3aは、条件判定以外の処理を含んでおりフィルタ処理可能でなないからである。
なお、以上のような定型句および分解判断のための情報は振分部120に予め与えられる。
次に、図15のステップS15の処理を詳細に説明する。
図19は、第2の実施の形態のイベント処理の例を示すフローチャートである。以下、図19に示す処理をステップ番号に沿って説明する。
(ステップS41)処理部130は、制御テーブル114aに基づいて、受信したイベントデータのイベント種別に対応するルールについて、前段フィルタがあるか否かを判定する。前段フィルタがある場合、処理をステップS42に進める。前段フィルタがない場合、処理をステップS43に進める。例えば、イベントデータ210のイベント種別は“P”である。制御テーブル114aにおいて、イベント種別“P”に対応するルールはルールr1(No.“r1”)である。ルールr1に対し、制御テーブル114aの前段フィルタの項目には条件判定を示す情報の登録がある。よって、処理部130はイベントデータ210に対して前段フィルタがあると判定する。また、例えば、イベントデータ220のイベント種別は“A”である。制御テーブル114aにおいて、イベント種別“A”に対応するルールはルールr2,r3(No.“r2”,“r3”)である。当該ルールr2,r3に対し、制御テーブル114aの前段フィルタの項目には条件判定を示す情報の少なくとも1つの登録がある(この場合は2つともである)。よって、処理部130はイベントデータ220に対して前段フィルタがあると判定する。
(ステップS42)前段フィルタ部131は、ステップS41で前段フィルタがあると判定されたルールについて、制御テーブル114a内の前段フィルタの条件判定を実行する。前段フィルタ部131は、当該条件判定の結果が真であるか否かを判定する。条件判定の結果が真である場合、処理をステップS43に進める。条件判定の結果が偽である場合、処理を終了する。なお、前段フィルタ部131は、ルールごとに前段フィルタの判定を行う。例えば、イベントデータ220に対して、ルールr2,r3で前段フィルタが存在している。前段フィルタ部131は、ルールr2,r3のそれぞれについて前段フィルタを評価する。この場合、ルールr2,r3の何れについても条件判定の結果が偽であれば処理を終了する。少なくとも1つの条件判定の結果が真であれば、処理をステップS43に進める。処理部130は、ステップS42で条件判定の結果が偽であったルールに関しては、ステップS43以降の処理は行わない。イベントデータ220の例では“temp=22”である。したがって、ルールr2の前段フィルタの結果は偽であり、ルールr3の前段フィルタの結果は真である。よって、ルールr2,r3のうちルールr3のみが以降のステップの処理対象となる。
(ステップS43)処理部130は、制御テーブル114aに基づいて、受信したイベントデータのイベント種別に対応するルールについて、JOIN処理があるか否かを判定する。JOIN処理がある場合、処理をステップS44に進める。JOIN処理がない場合、処理をステップS47に進める。例えば、イベントデータ210に対応するルールは前述したようにルールr1である。ルールr1に対し、制御テーブル114aのJOINの項目には、JOIN処理を示す情報の登録がある。よって、処理部130はイベントデータ210に対してJOIN処理があると判定する。なお、ステップS42で前段フィルタの条件判定を行っている場合、前述したように本ステップS43の判定の対象となるのは前段フィルタの判定結果が真であったルールに限られる。
(ステップS44)JOIN部132は、ステップS43でJOIN処理があると判定されたルールについて、制御テーブル114a内のJOIN処理を実行する。JOIN処理の実行結果は、受信したイベントデータに対するイベント処理が終了するまでRAM102上に保持される。
(ステップS45)処理部130は、制御テーブル114aに基づいて、ステップS44のJOIN処理を行ったルールについて後段フィルタがあるか否かを判定する。後段フィルタがある場合、処理をステップS46に進める。後段フィルタがない場合、処理をステップS47に進める。例えば、イベントデータ210について、ステップS44でルールr1に対応するJOIN処理が実行された場合を考える。この場合、ルールr1に対し、制御テーブル114aの後段フィルタの項目は設定なしである。よって、処理部130はイベントデータ210に対しては後段フィルタがないと判定する。また、例えば、イベントデータ220について、ステップS44でルールr3に対応するJOIN処理が実行された場合を考える。この場合、ルールr3に対し、制御テーブル114aの後段フィルタの項目には、条件判定の処理を示す情報の登録がある。よって、処理部130は、イベントデータ220に対しては後段フィルタがあると判定する。
(ステップS46)後段フィルタ部133は、ステップS45で後段フィルタがあると判定されたルールについて、制御テーブル114a内の後段フィルタの条件判定を実行する。後段フィルタ部133は、当該条件判定の結果が真であるか否かを判定する。条件判定の結果が真である場合、処理をステップS47に進める。条件判定の結果が偽である場合、処理を終了する。
(ステップS47)処理部130は、制御テーブル114aに基づいて、受信したイベントデータのイベント種別に対応するルールについて、主処理があるか否かを判定する。主処理がある場合、処理をステップS48に進める。主処理がない場合、処理を終了する。なお、ステップS42で前段フィルタの条件判定を行っている場合、前述したように本ステップS47の判定の対象となるのは前段フィルタの判定結果が真であったルールに限られる。
(ステップS48)主処理部134は、ステップS47で主処理があると判定されたルールについて、当該主処理内に条件判定があるか否かを判定する。当該主処理内に条件判定がある場合、処理をステップS49に進める。当該主処理内に条件判定がない場合、処理をステップS50に進める。
(ステップS49)主処理部134は、主処理内の条件判定を評価し、評価結果が真であるか否かを判定する。評価結果が真である場合、処理をステップS50に進める。評価結果が偽である場合、処理を終了する。
(ステップS50)主処理部134は、主処理内の後続処理を実行する。主処理内の後続処理とは、例えば、出口処理を呼び出してイベントデータ310を生成する処理である。また、当該イベントデータ310を制御対象の空調機60に送信する処理も含まれ得る。別の例として、r1に対する主処理部134の動作は、イベントに含まれる値“P.pow”を該当する家の消費電力としてウィンドウ“Home.pow”に設定する。
このようにして、処理部130は、イベントデータを受信すると、制御テーブル114aに登録された手順に従って、イベントデータに応じた処理を実行する。
図20は、第2の実施の形態のイベント処理の例を示す図である。図20では、ルールセット112に対して作成された制御テーブル114aに基づいて、ルールr1,r2,r3を前段フィルタ、JOIN、後段フィルタおよび主処理に振り分けて処理する際の処理順序を示している。ただし、図20では各処理を示す情報に対して“IF”および“THEN”の文字列を付加して示している。また、JOINおよび後段フィルタの登録がない箇所については“NONE”と表記している。
例えば、消費電力計測器50からイベントデータ210がサーバ100に入力された場合を考える。イベントデータ210のイベント種別は“P”なので、イベント種別“P”に対応するルールr1が実行される。このとき、ルールr1の最小項で示される各処理は、制御テーブル114aに基づいて次の順序で実行される。
(1)前段フィルタ部131は、条件判定部分r11に対応する条件判定を実行する。イベントデータ210では、“P.pow=1510”なので、条件判定部分r11の処理結果は真である。したがって、次のJOIN部132の処理が実行される。
(2)JOIN部132は、ルールd5aを実行する。ルールd5aは、ルールd5を最適化した後のJOIN処理を記述したルールである。ルールd5aの実行結果として“Home.id=0001”が得られる。ルールr1に対して後段フィルタは存在しない。このため、後段フィルタ部133の処理はスキップされ、次に主処理部134の処理が実行される。
(3)主処理部134は、主処理部分r1aに対応する処理を実行する。具体的には、主処理部134は、JOIN部132によるJOIN結果によって得られた“Home.id”を用いて、“Set Home.pow=P.pow”を実行する。その結果、当該“Home.id=0001”で指定されるウィンドウ“Home(0001).pow”に“P.pow=1510”が設定される。
イベントデータ210に続いて、空調機60からイベントデータ220がサーバ100に入力された場合を考える。イベントデータ220のイベント種別は“A”なので、イベント種別“A”に対応するルールr2,r3が実行される。このとき、ルールr2,r3の最小項で示される各処理は、制御テーブル114aに基づいて次の順序で実行される。
まず、ルールr2について説明する。
(1)前段フィルタ部131は、条件判定部分r21に対応する条件判定の処理を実行する。イベントデータ310では、“A.temp=22”なので、条件判定部分r21の処理結果は偽である。したがって、イベントデータ220に対するルールr2の処理は前段フィルタ部131で終了する。
次に、ルールr3について説明する。
(1)前段フィルタ部131は、条件判定部分r31aに対応する条件判定の処理を実行する。ここで、条件判定部分r31aで記述される“A.temp>20 AND A.temp<=25”は、ルールr3の条件判定部分r31,r32を前段フィルタ用にマージしたものである。イベントデータ220では、“A.temp=22”なので、条件判定部分r31aの処理結果は真である。したがって、次のJOIN部132の処理が実行される。
(2)JOIN部132は、ルールd6aを実行する。ルールd6aは、ルールd6を最適化した後のJOIN処理を記述したルールである。ルールd6aの実行結果として“Home.id=0001”および“Home.maxpow=1500”が得られる。
(3)後段フィルタ部133は、JOIN部132によるJOIN結果によって得られた“Home.id”および“Home.maxpow”を用いて、“Home.pow>Home.maxpow”の条件判定部分r33を実行する。イベントデータ210の入力によって、“Home.id=0001”で指定されるウィンドウ“Home(0001).pow”の値は“1510”に設定されている。したがって、条件判定部分r33の処理結果は真である。よって、次の主処理部134の処理が実行される。
(4)主処理部134は、主処理部分r3aに対応する処理を実行する。具体的には、主処理部134は、空調機60の設定温度を2℃下げるように制御するためのイベントデータ310を生成する。サーバ100は、生成されたイベントデータ310を空調機60に送信する。
このように、定義ルール112aおよび処理ルール112bに含まれる各ルールを前段フィルタ、JOIN、後段フィルタおよび主処理に振り分けることで、JOINや主処理が無駄に実行されないようにイベントデータに対する処理の順序を制御することができる。
図21は、ルールセットの比較例(その1)を示す図である。ルールセット115は、ルールセット112と等価な処理を記述したものである。ルールセット115は、ルールr101,r102,r103,r104,r105を含む。
ルールr101は、イベント種別“P”のイベントデータを受信した時に、ルールd5に相当するJOIN処理を実行するように記述されたルールである。ルールr102は、イベント種別“A”のイベントデータを受信した時に、ルールd6に相当するJOIN処理を実行するように記述されたルールである。
ルールr103は、ルールr1と同じ処理を記述したルールである。ルールr104は、ルールr2と同じ処理を記述したルールである。ルールr105は、ルールr3と同じ処理を記述したルールである。
ルールの記述方法として、ルールセット115のように、ある条件(IF節)が満たされた場合に、後続する処理(THEN節)を実行するようにルールを記述することが考えられる。ところが、第2の実施の形態のルール振分を行わずに、ルールセット115に基づいてイベント処理を行おうとすると、JOIN処理が無駄に実行され得る。具体的には次の通りである。
例えば、イベント種別“P”のイベントデータを受信した場合、ルールr101を実行した後に、ルールr103を実行することになる。このとき、ルールr103の条件判定部分が偽であれば、ルールr103の(ルールr101のJOIN結果を用いる)後続の処理は実行されない。また、ルールr103よりも後の処理でイベント種別“P”に関するルールはない。すると、この場合、ルールr103ではJOIN処理が無駄に実行されたことになる。また、r101のJOIN処理は“Select *”になっているので、後段の処理で不要な値も取得してしまい、処理時間を要するだけでなく、メモリも余計に消費する。これらの課題は、イベント種別“A”のイベントデータを受信した場合も同様である。
特に、JOIN処理は処理自体の負荷が高く、JOIN処理を余計に実行してしまうことは各イベントに対する応答遅延に大きく影響し得る。
図22は、ルールセットの比較例(その2)を示す図である。ルールセット116は、ルールセット112と等価な処理を記述したものである。ルールセット116は、CEP用のツールであるESPERにおいて、所定のイベント処理言語(EPL:Event Processing Language)を用いてルールを記述したものである。ルールセット116は、ルールr111,r112,r113,r114,r115,r116を含む。
ルールr111は、ルールd1と同じ定義を記述したルールである。ルールr112は、ルールd2と同じ定義を記述したルールである。ルールr113は、ルールd4と同じ定義を記述したルールである。
ルールr114は、ルールd5,r1に相当する処理を1つにまとめて記述したルールである。ルールr114では2行目の“from”で指定される節が最初に評価される。具体的には、イベント種別“P”というイベントに対し、ルールd5に相当するJOIN処理を実行した後に、ルールr1に相当する処理を実行する。
ルールr115は、ルールr2と同じ処理を記述したルールである。
ルールr116は、ルールd6,r3に相当する処理を1つにまとめて記述したルールである。具体的には、イベント種別“A”というイベントに対し、ルールd6に相当するJOIN処理を実行した後に、ルールr3に相当する処理を実行する。
ルールの記述方法として、ルールセット116のような手法も考えられる。ところが、第2の実施の形態のルール振分を行わずに、ルールセット116に基づいてイベント処理を行おうとすると、JOIN処理が無駄に実行され得る。具体的には次の通りである。
例えば、ルールr114のような記述だと、イベント種別“P”に対してルールd5に相当するJOINが必ず実行される。しかし、その後の条件判定部分r11に相当する判定“P(pow>500) as p”が偽であれば、後続する主処理部分r1aに相当する処理“insert into HomePowerWindow select h.Home as homeId, p.pow as pow”は実行されない。すると、この場合、ルールr114ではJOIN処理が無駄に実行されたことになる。
また、例えば、ルールr116のような記述だと、イベント種別“A”に対してルールd6に相当するJOINが必ず先に実行される。しかし、その後の条件判定部分r31aに相当する判定“a.temp>20 and a.temp<=25”が偽であれば、後続する主処理部分r3aに相当する処理“select a.id, a.temp−2 as temp”は実行されない。すると、この場合、ルールr116ではJOIN処理が無駄に実行されたことになる。
ルールセット116のように、記述方法によっては無駄なJOINが生じ得るEPLも存在する。このようなEPLでは、イベント処理時に無駄なJOINが発生するか否かは、ルールを作成する者の配慮に委ねられてしまう。また、このようなEPLを用いる場合、ルール内に記述された手続を逐次実行するためのCEPエンジンによる処理負荷が高くなる可能性もある。
図23は、第2の実施の形態の件数集計表の例を示す図である。件数集計表400は、入力されるイベントデータに対し、第2の実施の形態のイベント処理方法を適用した場合の前段フィルタ、JOIN、後段フィルタおよび主処理における入力に対する出力件数を例示したものである。件数集計表400は、ルールセット115,116の何れかを用いて第2の実施の形態のルール振分を行わずにイベント処理を行った場合のイベントの処理件数も比較例として例示している。件数集計表400には、イベント、分布、%、入力、前段フィルタ、JOIN、後段フィルタ、主処理および出口処理の項目が示されている。
イベントの項目には、イベントの種別が表記されている。ここで例示するイベントの種別は、“P”、“A”の2つである。何れのイベントに係るイベントデータも100万件/秒の頻度で受信するものとする。なお、Aイベントの直下の行は、PイベントとAイベントとの合計についての処理件数を示す行である。PイベントとAイベントとは共に100万件/秒の頻度なので、両イベントを合計すると200万件/秒の頻度である。更に、当該合計を示す行の直下の行は、比較例(第2の実施の形態のルール振分を行わない場合)の処理件数を示す行である。
分布の項目には、各イベントについての値の分布が表記されている。Pイベントでは、消費電力量の分布を次のように区分している。すなわち、pow>1500(Wh)の範囲、500(Wh)<pow≦1500(Wh)の範囲およびpow≦500(Wh)の範囲である。Aイベントでは、温度の分布を次のように区分している。すなわち、temp>25(℃)の範囲、20(℃)<temp≦25(℃)の範囲およびtemp≦20(℃)の範囲である。
%の項目には、受信するイベントデータのうち、各分布に属するものの割合を百分率で示した値が表記されている。入力の項目には、各イベントの件数に対して分布ごとに入力される件数が1秒間当たり何件であるかを示す値が表記されている。
具体的には、Pイベントでは、pow>1500(Wh)に属するイベントデータが10%であり、入力件数が100万件×0.1=10万件/秒である。500(Wh)<pow≦1500(Wh)に属するイベントデータが20%であり、入力件数が100万件×0.2=20万件/秒である。pow≦500(Wh)に属するイベントデータが70%であり、入力件数が100万件×0.7=70万件/秒である。
Aイベントでは、temp>25(℃)に属するイベントデータが10%であり、入力件数が100万件×0.1=10万件/秒である。20(℃)<temp≦25(℃)に属するイベントデータが20%であり、入力件数が100万件×0.2=20万件/秒である。temp≦20(℃)に属するイベントデータが70%であり、入力件数が100万件×0.7=70万件/秒である。
なお、比較例については、PイベントおよびAイベントの両方が上記と同じ頻度で入力されるものとする。比較例についての入力件数は200万件/秒である。また、合計の行については、分布、および%の項目は“−”(ハイフン)を表記している。
前段フィルタ、JOIN、後段フィルタ、主処理および出口処理の項目には、各段階で処理の対象となり、処理結果として残るイベントの件数を示している。該当の処理が存在しない場合や、前段の処理によって後段の処理が実行されない箇所については、“−”(ハイフン)を表記している。
例えば、Pイベントに着目すると、各分布に対してルールr1の処理が次のように実行される。
(1)pow>1500(Wh)に属するイベントデータ10万件/秒に対し、前段フィルタで10万件/秒が処理されて10万件/秒について真となる。次にJOINで10万件/秒が処理されて10万件/秒についてJOIN結果を得る。次に主処理で10万件/秒が処理されて10万件/秒の主処理結果を得る。
(2)500(Wh)<pow≦1500(Wh)に属するイベントデータ20万件/秒に対し、前段フィルタで20万件/秒が処理されて20万件/秒について真となる。次にJOINで20万件/秒が処理されて20万件/秒についてJOIN結果を得る。次に主処理で20万件/秒が処理されて20万件/秒の主処理結果を得る。
(3)pow≦500(Wh)に属するイベントデータ70万件/秒に対し、前段フィルタで70万件/秒が処理されて0件/秒が真となる。すなわち、前段フィルタを通過するイベントデータは存在しない。このため、これらのイベントデータに対しては以降の処理は実行されない。
また、Aイベントに着目すると、各分布に対してルールr2,r3の処理が次のように実行される。
(1)temp>25(℃)に属するイベントデータ10万件/秒に対し、前段フィルタで10万件/秒が処理されて、ルールr2の条件判定部分r21に対し10万件/秒が真となる。次に主処理では主処理部分r2aにつき10万件/秒が処理されて10万件/秒の主処理結果を得る。出口処理として、主処理の結果に応じて10万件/秒の空調機の制御(レコメンドメッセージの表示)が行われる。
(2)20(℃)<temp≦25(℃)に属するイベントデータ20万件/秒に対し、前段フィルタでは20万件/秒が処理されて、ルールr3の条件判定部分r31aに対し20万件/秒が真となる。次にJOINで20万件/秒が処理されて20万件/秒についてJOIN結果を得る。次に後段フィルタでは20万件/秒が処理されて条件判定部分r33に対し2万件/秒が真となる。次に主処理では主処理部分r3aにつき2万件/秒が処理されて2万件/秒の主処理結果を得る。出口処理として、主処理の結果に応じて2万件/秒の空調機の制御(設定温度の2℃低下)が行われる。
(3)temp≦20(℃)に属するイベントデータ70万件/秒に対し、前段フィルタで70万件/秒が処理されて条件判定部分r21および条件判定部分r31aについて0件が真となる。すなわち、前段フィルタを通過するイベントデータは存在しない。このため、これらのイベントデータに対しては以降の処理は実行されない。
以上の件数をイベント頻度の合計に対してまとめると、前段フィルタによって、入力される200万件/秒のイベントが60万件/秒に絞り込まれる。その60万件/秒のうち、JOINを実行するものは50万件/秒である。更に、後段フィルタによって、ルールr3に関するJOIN件数20万件/秒に対して主処理を実行すべき件数が、2万件/秒に絞り込まれる。その結果、主処理を実行すべき件数の合計が42万件/秒にまで絞り込まれる。そのうち、ルールr2,r3に基づいて出口処理を行うものは12万件/秒である。
これに対し、比較例では、入力件数200万件/秒に対して、実行されるJOINの件数は、200万件/秒である。ルールセット115,116で説明したように、1つのPイベントに対して必ずJOINが1回実行されるし、1つのAイベントに対しても必ずJOINが1回実行されるからである。そして、各JOINに対して、各ルールで示される主処理を1回実行する。例えば、ルールセット115でいえば、当該主処理はルールr103(Pイベント)やルールr105(Aイベント)に相当する。
また、ルールセット116でいえば、Pイベントに対する当該主処理は、ルールr114の“P(pow>500) as p;”および“insert into HomePowerWindow select h.Home as homeId, p.pow as pow”に相当する。また、ルールセット116でいえば、Aイベントに対する当該主処理は、ルールr116の“where hpw.homeId=h.Home and a.temp>20 and a.temp<=25 and hpw.pow>h.Maxpow”および“select a.id, a.temp−2 as temp”に相当する。
更にルールが増えた場合に、ルールセット116のケースではルールごとに必要なJOIN処理を記述するため、1つのイベントに対して複数回のJOINを実行してしまうケースも生じる。
比較例においても、当該主処理の結果、最終的な出口処理は12万件/秒となる。
第2の実施の形態のルール振分を行うことで、ルール振分を行わない場合に比べて、JOIN処理を200万件/秒から50万件/秒に削減している。これは、前段フィルタによって、JOIN処理を実行すべきイベントを事前に絞り込むからである。また、主処理を実行するイベントを42万件/秒に削減している。これは、後段フィルタによって、主処理を実行すべきイベントを事前に絞り込むからである。
このようにして、サーバ100は、ルールセット112に対して実行する処理を効率的に削減することができる。その結果、イベントに対して実行される処理の数が軽減され、所定時間当たりに処理できるイベントの数が向上する。また、無駄な処理の発生による他のイベントの処理待ちが改善されるので、イベントの発生に対して処理が実行されるまでの遅延を軽減できる。特に、JOINのような負荷の高い処理を削減できるため、高速化への寄与は大きい。このようにして、CEPにおける応答速度の高速化を図れる。
また、ルール振分を行うことで、フィルタ処理とそれ以外の処理とを明確に分けた実装が可能となる。フィルタ処理部分を分けられるため、当該フィルタ処理部分(前段フィルタ部131および後段フィルタ部133)について、レジスタを用いて高速に処理するような専用のモジュール(条件判定手段)を用いて実装することも可能である。このため、イベントに対して高速な条件判断が可能なCEPエンジンを容易に実現し得る。
また、振分部120によって、ルールセット112に基づき自動的に制御テーブル114a(あるいは制御テーブル114)を作成する。このため、ルールセット115,116で例示したようにルールの作成者が処理効率の悪い(無駄にJOINを実行してしまうような)処理手順を記述したとしても、制御テーブル114a(あるいは制御テーブル114)に基づいてイベント処理を効率的に行うことができる。その結果、ルールの作成者に処理手順を意識したルールの記述を強いずに済む。よって、ルールの作成に伴う作成者の作業の省力化を図れる。
また、振分部120は、ルールセット112で示したように定義ルール112aおよび処理ルール112bの個別の入力を許容する。このため、ルールの作成者は、定義部分と処理部分とを明確に分類した記述が可能である。これによって、ルールの作成者は、一層効率的な記述が可能である。処理ルール112bで汎用的に用いられる内容を定義ルール112aに一括して記述できるからである。これにより、処理ルール112b内でのJOIN処理の定義なしに、JOIN処理の結果を用いた条件判定を処理ルール112bに記述することが可能となる。このため、記述するルールを低減でき、ルールの作成に伴う作成の作業の省力化を図れる。
また、処理ルール112bでは、1つのルールを“IF”および“THEN”などを用いて、条件部+処理部のように短冊状に記述することを許容する。このため、記述し易く、また、メンテナンスも行い易い処理ルールの記述が可能となる。
なお、ルールセット112だけでなく、ルールセット115,116についても振分部120への入力を許容する。振分部120は、ルールセット115,116に対しても、ルールセット112と同様にして、制御テーブル114aを作成することができる。例えば、ルールセット115であれば、ルールセット112と同様に“IF”や“THEN”などの定型句に基づいて条件判定部分、主処理部分およびJOIN処理などを判別できる。ルールセット116でも“from”や“insert”、“select”、“sql”、“where”などの定型句に基づいて条件判定部分、主処理部分およびJOIN処理などを判別できる。
更に、例え主処理の負荷が高かったとしても、処理数の削減によって、全体の処理性能は確保されるため、サーバの処理能力が比較的低くても、求める処理性能を達成できる可能性が高まる。したがって、サーバに求められる処理能力を抑えることができ、コスト面でも有利である。
また、第2の実施の形態の説明では、消費電力計測器50および空調機60からのイベントに対して空調機60の動作を制御する例を説明したが、携帯端末装置40、携帯電話機70および宅内電力管理装置80に対しても同様にしてイベント処理を実行できる。また、第2の実施の形態では、家電機器関連の制御を行う場合を例示したが、第2の実施の形態のイベント処理の方法は他の情報処理システムに適用することもできる。例えば、病院内で医療機器が発行するイベントに応じた処理を実行する情報処理システムが考えられる。また、例えば、工場などで業務用機器が発行するイベントに応じた処理を実行する情報処理システムが考えられる。
以上のように、第2の実施の形態のサーバ100によれば、イベントに対して効率的に処理を実行することができる。また、そのようなイベント処理を効率的に支援することができる。
[第3の実施の形態]
以下、第3の実施の形態を説明する。前述の第2の実施の形態との相違点を主に説明し、共通の事項の説明を省略する。
第2の実施の形態では、受信したイベントデータに対して、制御テーブル114aを参照しながら、処理順を制御し、各処理を実行していく場合を例示した。一方、イベント処理の高速化を図るために、制御テーブル114aの内容あるいは外部データをRAM102上に構造体(または、オブジェクト)および構造体間のリンクとして予め展開しておき、これを制御情報として参照しながらイベント処理を行うことが考えられる。第3の実施の形態では、そのための方法を説明する。
ここで、第3の実施の形態の情報処理システムおよび各装置は、図2で説明した第2の実施の形態の情報処理システムと同様である。また、第3の実施の形態のサーバのハードウェア例およびソフトウェア例は、図3,4,7で説明した第2の実施の形態のサーバ100のハードウェア例およびソフトウェア例と同様である。このため、第3の実施の形態の各装置を第2の実施の形態と同一の名称・符号を付して示す。
ただし、振分部120が制御テーブル114aの内容あるいは外部データを事前にRAM102上の構造体および構造体間のリンクとして展開しておく点が第2の実施の形態と異なる。また、処理部130が当該展開された構造体および構造体間のリンクに基づいて、イベント処理を行う点が第2の実施の形態と異なる。
図24は、第3の実施の形態のルール構造体の例を示す図である。ルール構造体500は、制御テーブル114aをRAM102上に展開する際に用いる構造体である。以下、ルール構造体500の各行に便宜的に付した行番号を用いて内容を説明する。
行番号“1”は、構造体“rule”の定義であることを示している。行番号“1”から行番号“7”までの間が、構造体“rule”の定義内容である。
行番号“2”の“char *rule;”は、ルール番号の定義である。RAM102上に展開された各ルール構造体が何れのルールに関するものであるかを管理し易いように便宜的に付されるものである。
行番号“3”の“char *type;”は、ルールのタイプの定義である。タイプは、前段フィルタ、JOIN、後段フィルタおよび主処理などを識別するための情報が登録される。
行番号“4”の“char *item;”は、ルール本体の定義である。ルール本体として、条件判定の処理を示す情報や、主処理を示す情報などが登録される。
行番号“5”の“RULE *to;”は、次に参照すべきルール構造体へのリンクを示すポインタである。
行番号“6”の“VALUE value[];”は、“item”内の処理に用いる補助情報を格納したバリュー構造体の定義である。
行番号“7”の“RULE”は、構造体“rule”を示す別名定義である。
図25は、第3の実施の形態のバリュー構造体の例を示す図である。バリュー構造体501は、ルール構造体500の補助情報をRAM102上に展開する際に用いる構造体である。以下、バリュー構造体501の各行に便宜的に付した行番番号を用いて内容を説明する。
行番号“1”は、構造体“value”の定義であることを示している。行番号“1”から行番号“4”までの間が、構造体“value”の定義内容である。
行番号“2”の“char *v;”は、補助情報の値である。
行番号“3”の“void *p;”は、当該補助情報の値に対応するルール構造体等へのリンクを示すポインタである。
行番号“4”の“VALUE”は、構造体“value”を示す別名定義である。
図26は、第3の実施の形態の制御テーブルの展開例を示す図である。図26では、ルール構造体500およびバリュー構造体501を用いて、制御テーブル114aおよび外部データをRAM102上に展開した場合のデータ構造を例示している。
ルール構造体511,512は、イベント種別の情報を格納した構造体である。ルール構造体511は、ルールr1に対応するイベント種別“P”を示している。ルール構造体512は、ルールr2,r3に対応するイベント種別“A”を示している。
例えば、ルール構造体511には、次の各値が格納されている。rule値は“0”である。複数の処理ルールで使用される可能性があるからである。type値は“Event”である。当該type値はイベント種別の構造体であることを示す。item値は“P”である。イベント種別“P”の構造体だからである。to値は、“1004:0000”である。これは、次に参照するルール構造体521の先頭アドレスを示すものであり、ルール構造体521へのリンクL1である。
ルール構造体512についても同様に、rule値は“0”である。type値は“Event”である。item値は“A”である。イベント種別“A”の構造体だからである。to値は“1005:0000”である。これは、次のルール構造体522へのリンクL10である。
ルール構造体521,522は、前段フィルタの情報を格納した構造体である。ルール構造体521は、制御テーブル114aにおけるルールr1(No.“r1”)の前段フィルタの情報を格納した構造体である。ルール構造体522は、制御テーブル114aにおけるルールr2,r3(No.“r2”,“r3”)の前段フィルタの情報を格納した構造体である。
例えば、ルール構造体521には、次の各値が格納されている。rule値は“r1”である。ルールr1のみに対応する前段フィルタだからである。type値は“PreFilter”である。当該type値は前段フィルタの構造体であることを示す。item値は“.pow[1]”である。イベント種別“P”のイベントデータに含まれる“pow”値に対する1種類の条件判定を含むからである。to値は“NULL”である。次のルール構造体へのリンクはバリュー構造体に格納されるからである。
ルール構造体521に対応するバリュー構造体(value[0])のv値は“>500”である。これは、上記“pow”値に対する具体的な比較値および比較方法を定義したものであり、ルールr1の条件判定部分r11に相当する。p値は“1006:0000”である。これは、v値による条件判定の結果が真の場合に参照する、次のルール構造体531へのリンクL2である。
また、ルール構造体522には、次の各値が格納されている。rule値は“0”である。ルールr2,r3の何れかで使用される可能性があるからである。type値は“PreFilter”である。item値は“.temp[2]”である。イベント種別“A”のイベントデータに含まれる“temp”値に対する2種類の条件判定を含むからである。to値は“NULL”である。次のルール構造体へのリンクはバリュー構造体に格納されるからである。
ルール構造体522に対応するバリュー構造体(value[0])の第1のv値は“>20&<=25”である。これは、ルールr3の条件判定部分r31aに相当する。第1のv値に対応する第1のp値は“1007:0000”である。これは、第1のv値による条件判定の結果が真の場合に参照する、次のルール構造体532へのリンクL30である。また、ルール構造体522に対応するバリュー構造体(value[1])の第2のv値は“>25”である。これは、ルールr2の条件判定部分r21に相当する。第2のv値に対応する第2のp値は“1011:0000”である。これは、第2のv値による条件判定の結果が真の場合に参照する、次のルール構造体553へのリンクL20である。
ルール構造体531,532は、JOINの情報(JOINキーと呼ぶ)を格納した構造体である。ルール構造体531は、制御テーブル114aにおけるルールr1のJOINキーを格納した構造体である。ルール構造体532は、制御テーブル114aにおけるルールr3のJOINキーを格納した構造体である。
例えば、ルール構造体531には、次の各値が格納されている。rule値は、“r1”である。type値は“JoinKey”である。当該type値はJOINキーの構造体であることを示す。item値は“.id[2]”である。ホームテーブル111上には消費電力計測器のid(powerの項目に相当)として2種類のidが登録されており、消費電力計測器からのイベントデータに当該2種類のidが含まれ得るからである。to値は“1008:0000”である。これは、次のルール構造体551へのリンクL5である。
ルール構造体531に対応するバリュー構造体の第1のv値は“0011”である。これは、消費電力計測器50のidである。第1のv値に対応する第1のp値は“1001:0000”である。これは、当該第1のv値を含むイベントデータを受信した場合に参照する、外部データオブジェクト601へのリンクL3である。また、ルール構造体531に対応するバリュー構造体の第2のv値は“0012”である。第2のv値に対応する第2のp値は“1002:0000”である。これは、当該第2のv値を含むイベントデータを受信した場合に参照する、外部データオブジェクト602へのリンクL4である。
また、ルール構造体532には、次の各値が格納されている。rule値は“r3”である。ルールr3のみに対応するJOINキーだからである。type値は“JoinKey”である。item値は“.id[2]”である。ホームテーブル111上には空調機のid(airconの項目に相当)として2種類のidが登録されており、空調機からのイベントデータに当該2種類のidが含まれ得るからである。to値は“1009:0000”である。これは、次のルール構造体541へのリンクL31である。
ルール構造体532に対応するバリュー構造体の第1のv値は“0021”である。これは、空調機60のidである。第1のv値に対応する第1のp値は“1001:0000”である。これは、当該第1のv値を含むイベントデータを受信した場合に参照する、外部データオブジェクト601へのリンクL32である。また、ルール構造体532に対応する第2のv値は“0022”である。第2のv値に対応する第2のp値は“1002:0000”である。これは、当該第2のv値を含むイベントデータを受信した場合に参照する、外部データオブジェクト602へのリンクL33である。
外部データオブジェクト601,602は、ホームテーブル111の各レコードをRAM102上に展開したオブジェクトである。外部データオブジェクト601,602のそれぞれがホームテーブル111の各項目に対応する変数Home.id、Home.power、Home.aircon、Home.maxpowを含み、各レコードの登録値を保持する。更に、外部データオブジェクト601,602は、ウィンドウに対応する項目(Home.pow)を含み、ウィンドウの登録値を保持する。外部データオブジェクト601は、ホームテーブル111のid“0001”のレコードに対応する。外部データオブジェクト602は、ホームテーブル111のid“0002”のレコードに対応する。
ルール構造体541は、ルールr3の後段フィルタの情報を格納した構造体である。例えば、ルール構造体541について、次の各値が格納されている。rule値は“r3”である。type値は“AftFilter”である。当該type値は後段フィルタの構造体であることを示す。item値は“Home.pow>Home.maxpow”である。これは、ルールr3の条件判定部分r33に相当する。to値は“1010:0000”である。これは、item値の条件判定の結果が真の場合に参照する、次のルール構造体552へのリンクL34である。
ルール構造体551,552,553は、主処理の情報を格納した構造体である。ルール構造体551は、制御テーブル114aにおけるルールr1の主処理の情報を格納した構造体である。ルール構造体552は、制御テーブル114aにおけるルールr3の主処理の情報を格納した構造体である。ルール構造体553は、制御テーブル114aにおけるルールr2の主処理の情報を格納した構造体である。
例えば、ルール構造体551には、次の各値が格納されている。rule値は“r1”である。type値は“Main”である。当該type値は主処理の構造体であることを示す。item値は“Set Home.pow=P.pow”である。これは、ルールr1の主処理部分r1aに相当する。to値は“NULL”である。次の参照先はないからである。
また、ルール構造体552には、次の各値が格納されている。rule値は“r3”である。type値は“Main”である。item値は“Cont A.temp−=2”である。これは、ルールr3の主処理部分r3aに相当する。to値は“NULL”である。
また、ルール構造体553には、次の各値が格納されている。rule値は“r2”である。ルールr2のみに対応する主処理だからである。type値は“Main”である。item値は“Send A.msg=“・・・””である。これは、ルールr2の主処理部分r2aに相当する。to値は“NULL”である。
このように、振分部120は、前段フィルタ、JOIN処理、後段フィルタおよび主処理を、各処理の内容と当該処理の結果に応じた次の処理を示す情報を示すポインタとを含む上記のデータ構造を用いて、RAM102上に展開する。
次に、第3の実施の形態の処理手順を説明する。ここで、第3の実施の形態の全体の処理の手順は、図15で説明した第2の実施の形態の処理の手順と同様である。ただし、ステップS12におけるルールおよび外部データのRAM102への展開の手順が第2の実施の形態と異なる。また、ステップS15におけるイベント処理の手順が第2の実施の形態と異なる。そこで、以下では、これらの各処理について詳細に説明する。
図27は、第3の実施の形態のルール展開の例を示すフローチャートである。以下、図27に示す処理をステップ番号に沿って説明する。
(ステップS101)振分部120は、記憶部110を参照してRAM102上に未展開の外部データがあるか否かを判定する。例えば、振分部120は、テーブル単位に未展開であるか否かを判定する。未展開の外部データがある場合、処理をステップS102に進める。未展開の外部データがない、すなわち、全ての外部データを展開済の場合、処理をステップS107に進める。
(ステップS102)振分部120は、記憶部110に記憶された制御テーブル114aに基づいて展開する項目を決定する。例えば、未展開の外部データとしてホームテーブル111が選択されているとする。この場合、制御テーブル114aのJOINの項目を参照すると、ホームテーブル111で用いられる項目は“Home.id”、“Home.maxpow”、“Home.aircon”、“Home.power”である。したがって、振分部120は、これらの項目を外部データオブジェクトに追加する。
(ステップS103)振分部120は、制御テーブル114aを参照して、外部データに対応するウィンドウの登録がある否かを判定する。ウィンドウがある場合、処理をステップS104に進める。ウィンドウがない場合、処理をステップS105に進める。具体的には、制御テーブル114aの状況(ウィンドウ)の項目を参照すると、ウィンドウ“Home.pow”が登録されている。この場合、振分部120は、ホームテーブル111に対応するウィンドウ“Home.pow”があると判定する。
(ステップS104)振分部120は、外部データオブジェクトの項目に関連するウィンドウの項目を追加する。例えば、ホームテーブル111の外部データオブジェクトに対して、ウィンドウ“Home.pow”に関する項目を追加する。
(ステップS105)振分部120は、外部データを参照して、未展開のレコードがあるか否かを判定する。未展開のレコードがある場合、処理をステップS106に進める。未展開のレコードがない場合、処理をステップS101に進める。
(ステップS106)振分部120は、外部データ内の未展開の1レコードを、ステップS102で決定した項目と、ステップS104で決定したウィンドウを有する1つの外部データオブジェクトとしてRAM102上に展開する。そして、処理をステップS105に進める。
(ステップS107)振分部120は、制御テーブル114aを参照して、未展開のルールがあるか否かを判定する。未展開のルールがある場合、処理をステップS108に進める。未展開のルールがない場合、すなわち、制御テーブル114aに含まれる全てのルールを展開済の場合、処理を終了する。
(ステップS108)振分部120は、未展開のルールを1つ抽出する。以降の説明において、本ステップS108で抽出された未展開のルールを単に“抽出されたルール”と称する。
(ステップS109)振分部120は、抽出されたルールに対応するイベント種別をルール構造体へ展開する。
(ステップS110)振分部120は、抽出されたルールに含まれる前段フィルタをルール構造体へ展開する。
(ステップS111)振分部120は、抽出されたルールに含まれるJOINをルール構造体へ展開する。
(ステップS112)振分部120は、抽出されたルールに含まれる後段フィルタをルール構造体へ展開する。
(ステップS113)振分部120は、抽出されたルールに含まれる主処理をルール構造体へ展開する。
このようにして、振分部120は、外部データの外部データオブジェクトへの展開を行う。また、振分部120は、制御テーブル114aの各ルールのルール構造体への展開を行う。次に、ステップS109〜S113におけるルール構造体への展開方法を詳細に説明する。まず、ステップS109におけるイベント種別のルール構造体への展開方法を説明する。
図28は、第3の実施の形態のイベント種別の展開例を示すフローチャートである。以下、図28に示す処理をステップ番号に沿って説明する。
(ステップS121)振分部120は、抽出されたルールに対応するイベント種別がルール構造体へ未展開のイベント種別であるか否かを判定する。未展開のイベント種別である場合、処理をステップS122に進める。展開済のイベント種別である場合、処理を終了する。
(ステップS122)振分部120は、ルール構造体の領域をRAM102上から獲得して当該領域の設定を初期化(例えば、ruleを“0”に設定)する。
(ステップS123)振分部120は、ルール構造体のtypeに“Event”を、itemにイベント名(イベント種別)を設定する。
このようにして、振分部120は、イベント種別のルール構造体511,512を作成する。なお、ステップS121の判定を行う理由は次の通りである。
例えば、ルールr2をルール構造体に展開した後に、ルールr3をルール構造体に展開しようとする場合、ルールr3の展開時にはイベント種別“A”についてのルール構造体512は作成済である。この場合に、振分部120は、ルール構造体512を2重に作成しないようにしている。
次に、図27のステップS110における前段フィルタのルール構造体への展開方法を説明する。
図29は、第3の実施の形態の前段フィルタの展開例を示すフローチャートである。以下、図29に示す処理をステップ番号に沿って説明する。
(ステップS131)振分部120は、記憶部110に記憶された制御テーブル114aを参照して、抽出されたルールに前段フィルタを示す情報の設定があるか否かを判定する。前段フィルタを示す情報の設定がある場合、処理をステップS132に進める。前段フィルタを示す情報がない場合、処理を終了する。
(ステップS132)振分部120は、当該前段フィルタが既存の前段フィルタであるか否かを判定する。既存の前段フィルタであるとは、当該前段フィルタをルール構造体に展開済であることを意味する。既存の前段フィルタでない場合、処理をステップS133に進める。既存の前段フィルタである場合、処理をステップS136に進める。振分部120は、既存の前段フィルタであるか否かを、展開済のイベント種別のルール構造体に設定されたitemと、当該イベント種別のルール構造体がリンクする展開済の前段フィルタのルール構造体に設定されたitemの値と、から判定する。例えば、ルールr2について展開済である場合、ルール構造体522を作成済である。この場合、ルール構造体512とルール構造体522とのリンクも形成済である。この状態で、ルールr3を展開しようとするとき、ルールr3と同一のイベント種別“A”のルール構造体512に対し、ルールr3の前段フィルタと同一のチェック項目“.temp”につきルール構造体522が作成済の状態である。したがって、この場合、振分部120は、ルールr3に含まれる前段フィルタが既存の前段フィルタであると判定する。
(ステップS133)振分部120は、ルール構造体の領域をRAM102上から獲得して当該領域の設定を初期化する。例えば、抽出されたルールの番号をruleに設定する。また、toを“NULL”に設定する。前段フィルタのルール構造体では、バリュー構造体でリンクを定義するからである。
(ステップS134)振分部120は、関連するイベント種別のtoに当該前段フィルタのルール構造体へのリンクを設定する。例えば、ルールr1であれば関連するイベント種別は“P”であるので、ルール構造体511のtoにルール構造体521へのリンクを設定する。また、例えば、ルールr2(または、ルールr3)であれば、関連するイベント種別は“A”であるので、ルール構造体512のtoにルール構造体522へのリンクを設定する。
(ステップS135)振分部120は、当該前段フィルタのルール構造体のtypeに“PreFilter”を設定する。また、itemにチェック項目を設定する。
(ステップS136)振分部120は、バリュー構造体に前段フィルタの条件判定の内容を設定する。ここで、ステップS132で既存の前段フィルタであると判定されてステップS136を実行する場合、振分部120は該当するルール構造体のruleを“0”に設定する。当該ルール構造体は、複数のルールで使用され得るからである。なお、バリュー構造体に新たな条件判定の内容を設定する場合には、RAM102から当該バリュー構造体用の領域を獲得して初期化した上で、条件判定の内容を設定する。
このようにして、振分部120は、前段フィルタのルール構造体521,522を作成する。なお、ステップS132の判定を行うことで、同じイベント種別の同じチェック項目について2つのルール構造体を作成することがなくなる。したがって、RAM102の領域を節約することができる。
また、ステップS136では、新たに条件判定の内容を設定する場合、既にバリュー構造体に設定されている他の条件判定の内容を考慮する。例えば、ルールr2について、先にルール構造体522が作成されている場合、既に前段フィルタの条件判定“.temp>25”が設定済である。この状態でルールr3について、前段フィルタの条件判定“.temp>20&temp<=25”を設定するとき、当該前段フィルタはルールr2の条件判定と重複しない。したがって、振分部120は、ルールr3の前段フィルタ用に新たにバリュー構造体の領域をRAM102から獲得して初期化を行い、条件“.temp>20&temp<=25”を設定する。
次に、図27のステップS111におけるJOINキーのルール構造体への展開方法を説明する。
図30は、第3の実施の形態のJOINキーの展開例を示すフローチャートである。以下、図30に示す処理をステップ番号に沿って説明する。
(ステップS141)振分部120は、記憶部110に記憶された制御テーブル114aを参照して、抽出されたルールにJOIN処理を示す情報の設定があるか否かを判定する。JOIN処理を示す情報の設定がある場合、処理をステップS142に進める。JOIN処理を示す情報の設定がない場合、処理を終了する。
(ステップS142)振分部120は、ルール構造体の領域をRAM102上から獲得して当該領域の設定を初期化する。例えば、抽出されたルールの番号をruleに設定する。
(ステップS143)振分部120は、抽出されたルールに前段フィルタがあるか否かを判定する。前段フィルタがある場合、処理をステップS144に進める。前段フィルタがない場合、処理をステップS145に進める。
(ステップS144)振分部120は、該当する前段フィルタのバリュー構造体のp値にステップS142で作成したルール構造体(JOINキー)へのリンクを設定する。例えば、JOINキーのルール構造体531でいえば、前段フィルタのルール構造体521に対応するバリュー構造体のp値に“1006:0000”を設定する。当該p値は、ルール構造体531へのリンクL2である。
(ステップS145)振分部120は、抽出されたルールに対応するイベント種別のルール構造体のtoにステップS142で作成したルール構造体(JOINキー)へのリンクを設定する。
(ステップS146)振分部120は、ステップS142で作成したルール構造体のtypeに“JoinKey”を、itemにJOIN対象の項目を設定する。例えば、ルールr1では、イベントデータに含まれるJOIN対象の項目は“P.id”である。したがって、itemに“.id”を登録する。
(ステップS147)振分部120は、以下に示すステップS148の処理を行っていない、未処理の外部データオブジェクトがあるか否かを判定する。未処理の外部データオブジェクトがある場合、処理をステップS148に進める。未処理の外部データオブジェクトがない場合、処理を終了する。
(ステップS148)振分部120は、新たに作成したルール構造体に対応するバリュー構造体の領域をRAM102上から獲得して初期化し、v値にJOIN対象の項目の取り得る値を設定する。また、p値に対応する外部データオブジェクトへのリンクを設定する。例えば、ルールr1でいえば、JOIN対象の項目である“P.id”の取り得る値は、“0011”および“0012”である。よって、振分部120は、ルール構造体531に対応するバリュー構造体のv値にこの2種類の値を設定する。そして、“P.id”に対応する“Home.power”に“0011”を含む外部データオブジェクトは外部データオブジェクト601である。よって、振分部120は、v値“0011”に対応するp値に“1001:0000”を設定する。これは、外部データオブジェクト601へのリンクL3である。同様に、v値“0012”に対応するp値に“1002:0000”を設定する。これは、外部データオブジェクト602へのリンクL4である。そして、処理をステップS147に進める。
このようにして、振分部120は、JOINキーのルール構造体531,532を作成する。
次に、図27のステップS112における後段フィルタのルール構造体への展開方法を説明する。
図31は、第3の実施の形態の後段フィルタの展開例を示すフローチャートである。以下、図31に示す処理をステップ番号に沿って説明する。
(ステップS151)振分部120は、記憶部110に記憶された制御テーブル114aを参照して、抽出されたルールに後段フィルタを示す情報の設定があるか否かを判定する。後段フィルタを示す情報の設定がある場合、処理をステップS152に進める。後段フィルタを示す情報の設定がない場合、処理を終了する。
(ステップS152)振分部120は、ルール構造体の領域をRAM102上から獲得して当該領域の設定を初期化する。例えば、抽出されたルールの番号をruleに設定する。
(ステップS153)振分部120は、関連するJOINキーのルール構造体のtoにステップS152で作成した後段フィルタのルール構造体へのリンクを設定する。例えば、後段フィルタのルール構造体541でいえば、JOINキーのルール構造体532のtoに“1009:0000”を設定する。当該toの値は、ルール構造体541へのリンクL31である。
(ステップS154)振分部120は、ステップS152で作成したルール構造体のtypeに“AftFilter”を、itemに後段フィルタの条件判定の内容を設定する。
このようにして、振分部120は、後段フィルタのルール構造体541を作成する。
次に、図27のステップS113における主処理のルール構造体への展開方法を説明する。
図32は、第3の実施の形態の主処理の展開例を示すフローチャートである。以下、図32に示す処理をステップ番号に沿って説明する。
(ステップS161)振分部120は、記憶部110に記憶された制御テーブル114aを参照して、抽出されたルールに主処理を示す情報の設定があるか否かを判定する。主処理を示す情報の設定がある場合、処理をステップS162に進める。主処理を示す情報の設定がない場合、処理を終了する。
(ステップS162)振分部120は、ルール構造体の領域をRAM102上から獲得して当該領域の設定を初期化する。例えば、抽出されたルールの番号をruleに設定する。また、例えば、toに“NULL”を設定する。
(ステップS163)振分部120は、抽出されたルールに後段フィルタがあるか否かを判定する。後段フィルタがある場合、処理をステップS164に進める。後段フィルタがない場合、処理をステップS165に進める。
(ステップS164)振分部120は、該当する後段フィルタのtoにステップS162で作成したルール構造体(主処理)へのリンクを設定する。例えば、主処理のルール構造体552であれば、後段フィルタのルール構造体541のtoに“1010:0000”を設定する。これは、ルール構造体552へのリンクL34である。そして、処理をステップS171に進める。
(ステップS165)振分部120は、抽出されたルールにJOINキーがあるか否かを判定する。JOINキーがある場合、処理をステップS166に進める。JOINキーがない場合、処理をステップS167に進める。
(ステップS166)振分部120は、該当するJOINキーのtoにステップS162で作成したルール構造体(主処理)へのリンクを設定する。例えば、主処理のルール構造体551であれば、JOINキーのルール構造体531のtoに“1008:0000”を設定する。これは、ルール構造体551へのリンクL5である。そして、処理をステップS171に進める。
(ステップS167)振分部120は、抽出されたルールに前段フィルタがあるか否かを判定する。前段フィルタがある場合、処理をステップS168に進める。前段フィルタがない場合、処理をステップS169に進める。
(ステップS168)振分部120は、該当する前段フィルタのバリュー構造体のp値にステップS162で作成したルール構造体(主処理)へのリンクを設定する。例えば、主処理のルール構造体553であれば、前段フィルタのルール構造体522に対応するバリュー構造体の第2のp値に“1011:0000”を設定する。これは、ルール構造体553へのリンクL20である。そして、処理をステップS171に進める。
(ステップS169)振分部120は、抽出されたルールに関連するイベント種別があるか否かを判定する。関連するイベント種別がある場合、処理をステップS170に進める。関連するイベント種別がない場合、処理をステップS171に進める。
(ステップS170)振分部120は、関連するイベント種別のルール構造体のtoにステップS162で作成したルール構造体(主処理)へのリンクを設定する。
(ステップS171)振分部120は、ステップS162で作成したルール構造体のtypeに“main”を、itemに主処理の内容を設定する。
このようにして、振分部120は、主処理のルール構造体551,552,553を作成する。
次に、第3の実施の形態のイベント処理の手順を説明する。第3の実施の形態のイベント処理では、リンクを辿りながら各ルール構造体を参照してイベント処理を実行する点が、第2の実施の形態のイベント処理と異なる。サーバ100は、図15のステップS15に代えて以下の処理を行う。
図33は、第3の実施の形態のイベント処理の例を示すフローチャートである。以下、図33に示す処理をステップ番号に沿って説明する。
(ステップS181)処理部130は、受信したイベントデータのイベント種別を取得する。処理部130は、当該イベント種別のルール構造体におけるtoからポインタを取得する。処理部130は、当該ポインタで示される次のルール構造体を参照する。
(ステップS182)処理部130は、参照先のルール構造体のtypeを判定する。typeが“PreFilter”の場合、処理をステップS183に進める。typeが“JoinKey”の場合、処理をステップS185に進める。typeが“AftFilter”の場合、処理をステップS187に進める。typeが“Main”の場合、処理をステップS189に進める。
(ステップS183)処理部130は、ルール構造体(前段フィルタ)のitemで指定されている項目についてイベントデータの値(イベント値)を取得し、イベント値に対応するバリュー構造体(value)があるか否かを判定する。itemで指定されたイベント値に対応するバリュー構造体がある場合、処理をステップS184に進める(前段フィルタを通過したイベント)。itemで指定されたイベント値に対応するバリュー構造体がない場合、当該イベントデータに対する処理を終了する(前段フィルタで除外されたイベント)。処理部130は、イベント値と当該ルール構造体に対応するバリュー構造体のv値とを対比することで、イベント値に対応するバリュー構造体があるか否かを判定できる。例えば、イベントデータ210を受信した場合を考える。ルール構造体521のitemで指定されている項目は“.pow”である。ルール構造体521に対応するバリュー構造体のv値は“>500”である。イベントデータ210の“pow”値は“1510”であり、“1510>500”を満たす。この場合、処理部130は、itemで指定されたイベント値に対応するバリュー構造体があると判定する。一方、イベント値がv値で示される条件判定の内容を満たさない場合は、itemで指定されたイベント値に対応するバリュー構造体がないと判定する。
(ステップS184)処理部130は、当該ルール構造体(前段フィルタ)のitemの値に対応するバリュー構造体のp値からポインタを取得する。処理部130は、当該ポインタで示される次のルール構造体を参照する。例えば、ルール構造体521であれば、イベント値がv値“>500”を満たすならば、当該v値に対応するp値(ポインタ)“1006:0000”を取得する。これは、ルール構造体531へのリンクL2である。処理部130は、リンクL2を辿ってルール構造体531を参照する。そして、処理をステップS182に進める。
(ステップS185)処理部130は、ルール構造体(JOINキー)のitemで指定されている項目について、イベント値を取得し、イベント値に対応するバリュー構造体があるか否かを判定する。itemで指定されたイベント値に対応するバリュー構造体がある場合、処理をステップS186に進める(JOIN対象が存在する有効なイベント)。itemで指定されたイベント値に対応するバリュー構造体がない場合、当該イベントデータに対する処理を終了する(JOIN対象が存在しない無効なイベント)。例えば、イベントデータ210を受信した場合を考える。ルール構造体531のitemで指定されている項目は“.id[2]”である。ルール構造体531に対応するバリュー構造体のv値は“0011”および“0012”である。イベントデータ210の“id”値は“0011”であり、v値の“0011”と一致する。この場合、処理部130は、itemで指定されたイベント値に対応するバリュー構造体があると判定する。一方、イベント値が何れのv値にも一致しない場合は、itemで指定されたイベント値に対応するバリュー構造体がないと判定する(JOIN対象が存在しない無効なイベントである)。
(ステップS186)処理部130は、当該ルール構造体(JOINキー)のitemの値に対応するバリュー構造体のp値から外部データオブジェクトへのポインタを取得する。処理部130は、当該ルール構造体のtoからポインタを取得する。処理部130は、外部データオブジェクトへのポインタを保持しながら、toから取得したポインタで示される次のルール構造体を参照する。例えば、ルール構造体531でイベント値(P.id)=v値=“0011”であれば、当該v値に対応するp値(ポインタ)“1001:0000”を取得する。これは、外部データオブジェクト601へのリンクL3である。また、処理部130は、ルール構造体531のto(ポインタ)“1008:0000”を取得する。これは、ルール構造体551へのリンクL5である。処理部130は、外部データオブジェクト601へのポインタを保持しながら、リンクL5を辿って、ルール構造体551を参照する。そして、処理をステップS182に進める。
(ステップS187)処理部130は、ルール構造体(後段フィルタ)のitemで指定されている条件判定の評価結果が真であるか否かを判定する。真である場合、処理をステップS188に進める(後段フィルタを通過したイベント)。偽である場合、処理を終了する(後段フィルタで除外されたイベント)。例えば、ルール構造体541であれば、itemに設定されている条件判定は“Home.pow>Home.maxpow”である。この場合、ルール構造体541はルール構造体531(JOINキー)から参照されるものであり、外部データオブジェクトへのリンクが保持されている。例えば、イベントデータ310を受信した場合には、外部データオブジェクト601へのリンクが保持されている。そして、外部データオブジェクト601には、“Home.pow”および“Home.maxpow”の各値が設定されている。よって、処理部130は、外部データオブジェクト601から各値を読み出して、当該条件判定を行うことができる。外部データオブジェクト601の例でいえば、“Home.pow=1510”>“Home.maxpow=1500”であり、当該条件判定の評価結果は真である。
(ステップS188)処理部130は、当該ルール構造体(後段フィルタ)のtoからポインタを取得する。処理部130は、当該ポインタで示される次のルール構造体を参照する。そして、処理をステップS182に進める。
(ステップS189)処理部130は、ルール構造体(主処理)のitemに設定されている処理を実行する。例えば、ルール構造体551であれば、itemに設定されている処理の内容は“Set Home.pow=P.pow”である。この場合、ルール構造体551はルール構造体531(JOINキー)から参照されるものであり、外部データオブジェクトへのリンクが保持されている。例えば、イベントデータ210を受信した場合には、外部データオブジェクト601へのリンクが保持されている。そして、外部データオブジェクト601には、“Home.pow”の項目が設けられている。よって、処理部130は、外部データオブジェクトの“Home.pow”にイベントデータ210に格納された“pow=1510”を設定することができる。処理部130は、ルール構造体552,553の場合も同様にitemに設定された処理の内容を実行する。ただし、ルール構造体552,553は、外部データオブジェクトを参照せずに実行可能である。
このようにして、処理部130は、RAM102上に展開されたルール構造体を順番に辿ることで、イベント処理を行う。
図34は、第3の実施の形態のイベント処理の例を示す図である。ここで、図34では、図26で例示した各ルール構造体についてitemの値を示している。例えば、item511aは、ルール構造体511のitemの値“P”である。item512aは、ルール構造体512のitemの値“A”である。item541aは、ルール構造体541のitemの値“Home.pow>Home.maxpow”である。item551aは、ルール構造体551のitemの値“Set Home.pow=P.pow”である。item552aは、ルール構造体552のitemの値“Cont A.temp−=2”である。item553aは、ルール構造体553のitemの値“Send A.msg=“・・・””である。
また、itemの値に対して、バリュー構造体のv値が存在する場合には、itemの値とv値とを組み合わせて(この組み合わせもitemと称している)図示している。例えば、item521aは、ルール構造体521のitemの値とv値との組み合わせ“.pow>500”である。
更に、1つのルール構造体のitemの値に対して、2つのv値が存在する場合には、itemの値とそれぞれのv値との組を図示している。
例えば、item522aは、ルール構造体522のitemの値と第1のv値との組み合わせ“.temp>20&.temp<=25”である。例えば、item522bは、ルール構造体522のitemの値と第2のv値との組み合わせ“.temp>25”である。
item531aは、ルール構造体531のitemの値と第1のv値との組み合わせ“.id=0011”である。item531bは、ルール構造体531のitemの値と第2のv値との組み合わせ“.id=0012”である。
item532aは、ルール構造体532のitemの値と第1のv値との組み合わせ“.id=0021”である。item532bは、ルール構造体532のitemの値と第2のv値との組み合わせ“.id=0022”である。
処理部130は、ルール構造体間のリンクを辿り、各itemを処理することでイベント処理を行う。例えば、消費電力計測器50からイベントデータ210を受信したとする。この場合、処理部130は、次のようにしてルールr1に対応する処理を実行する。
(1)イベントデータ210のイベント種別は“P”であり、ルール構造体511のitem511aに該当する。したがって、処理部130は、次のルール構造体521を参照する。
(2)イベントデータ210では、“P.pow=1510“>“500”であり、ルール構造体521において該当するitem521aが存在する。したがって、処理部130は、次のルール構造体531を参照する。
(3)イベントデータ210では、“P.id=0011”であり、ルール構造体531において該当するitem531aが存在する。したがって、処理部130は、外部データオブジェクト601へのリンクを保持し、次のルール構造体551を参照する。
(4)処理部130は、ルール構造体551のitem551aの処理を実行する。このとき、外部データオブジェクト601へのリンクは保持されている。また、イベントデータ210では、“P.pow=1510”である。したがって、処理部130は、外部データオブジェクト601のウィンドウに対応する項目“.pow”に“1510”を設定する(図34では設定する操作を点線矢印で示している)。
これによって、イベントデータ210に対するルールr1の処理が完了する。なお、図34では、イベント種別“P”、“P.id=0012”、“P.pow=1800”であるイベントデータを受信した場合について、上記と同様の手順によって関連付けられるitem間の関連線も図示されている。
続いて、空調機60からイベントデータ310を受信したとする。この場合、処理部130は、次のようにしてルールr2,r3に対応する処理を実行する。
(1)イベントデータ310のイベント種別は“A”であり、ルール構造体512のitem512aに該当する。したがって、処理部130は、次のルール構造体522を参照する。
(2)イベントデータ310では、“A.temp=22”であり、ルール構造体522において該当するitem522aが存在する。したがって、処理部130は、次のルール構造体532を参照する。なお、item522bは、“A.temp=22”には対応しないため、処理部130はルール構造体553の参照は行わない。すなわち、ルールr2に関しては前段フィルタで終了となる。
(3)イベントデータ310では、“A.id=0021”であり、ルール構造体532において該当するitem532aが存在する。したがって、処理部130は、外部データオブジェクト601へのリンクを保持し、次のルール構造体541を参照する。
(4)処理部130は、ルール構造体541のitem541aの条件判定を評価する。このとき、外部データオブジェクト601へのリンクは保持されている。したがって、処理部130は、外部データオブジェクト601から“Home.pow=1510”および“Home.maxpow=1500”を取得して、item541aを評価する。この場合、item541aの評価結果は真である。したがって、処理部130は、次のルール構造体552を参照する。
(5)処理部130は、ルール構造体552のitem552aの処理を実行する。当該処理の実行により、処理部130はイベントデータ310を生成し、空調機60に送信する。空調機60はイベントデータ310を受信すると、当該イベントデータ310の指示に基づいて、設定温度を2℃低減する。
これによって、イベントデータ310に対するルールr3の処理が完了する。なお、図34では、イベント種別“A”、“A.id=0022”であるイベントデータを受信した場合について、上記と同様の手順によって関連付けられるitem間の関連線も図示されている。
このように、第3の実施の形態では、外部データおよび制御テーブル114aをRAM102にルール構造体として展開し、当該ルール構造体に基づいてイベント処理を行う。このようにすれば、イベント処理を行う際に、JOIN処理の結果に相当する情報をルール構造体の参照によって得ることができる。すなわち、イベント処理の際にJOIN処理を行わなくてもよくなる。これにより、イベント処理をより高速化することができる。
このとき、制御テーブル114を最適化した後の制御テーブル114aをルール構造体として展開することで、余計な情報をRAM102上に保持しなくてよい。したがって、RAM102上の領域を節約することができるだけでなく、ルール構造体のリンクたどる手間も省けるため、処理部130も高速化できる。更に、同一のイベント種別に対する同一のチェック項目を同じルール構造体で管理し、具体的な値などの相違点のみをバリュー構造体で管理する。これにより、ルール構造体の数を抑えることができ、RAM102上の領域を節約することができるだけでなく、複数のルールを同時にチェック効果もあるため、処理部130も高速化できる。
更に、第3の実施の形態では、RAM102上に展開した外部データと併せて外部データに対応するウィンドウ(変数)を保持して、ルールおよび外部データと同時に(共通のポインタで)ルールから使用できるため、主処理の前段(フィルタ)で複数のイベントの相互作用に基いた判断を効率よく実行できる。これにより、従来は主処理部で実行していた複合イベント処理の一部(外部データと対応するウィンドウ処理)をフィルタ部で高速に実行可能とする効果がある。
なお、上述の機能は、コンピュータに所定のプログラムを実行させることで実現することもできる。当該プログラムは、コンピュータ読み取り可能な可搬型の記録媒体13に記録しておくことができる。当該プログラムを流通させるには、例えば、そのプログラムが記録された記録媒体13を配布する。または、そのプログラムをサーバコンピュータに格納しておき、ネットワーク経由でコンピュータに転送してもよい。コンピュータは、例えば、記録媒体13に記録されたプログラムまたはネットワークから取得したプログラムを、自装置の不揮発性の記憶媒体に格納する。そして、当該不揮発性の記憶媒体からプログラムを読み取り実行する。ただし、コンピュータは、取得したプログラムを、不揮発性の記憶媒体に格納せずに逐次、RAMに展開して実行することも可能である。本発明のプログラムは、コンピュータが備えるCPUなどのプロセッサによって実行される。
上記については単に本発明の原理を示すものである。更に、多数の変形や変更が当業者にとって可能であり、本発明は上記に示し、説明した正確な構成および応用例に限定されるものではなく、対応する全ての変形例および均等物は、添付の請求項およびその均等物による本発明の範囲とみなされる。