TimeInterval ウィンドウ
SPL 言語は、イベント時間間隔で指定されたウィンドウ・ペインにタプルを収集する timeInterval ウィンドウをサポートします。
- TimeInterval ウィンドウは、割り当てられたイベント時間値に基づいてタプルを処理します。
- 時間ベースのウィンドウ・ポリシーは、システム時間に基づくタンブリング・ウィンドウおよびスライディング・ウィンドウの排除とトリガーを指定します。
以下の例では、タプルが T(n) として n のタイム・スタンプ値で示されています。ウィンドウは、以下の SPL window 節で定義されます。
window InputPort0 : timeInterval, intervalDuration(10.0), creationPeriod(5.0), discardAge(15.0);
以下の間隔それぞれに対するウィンドウ・ペインが作成されます。
[0, ..., 10)
[5, ..., 15)
[10, ..., 20)
[15, ..., 25)
--------------------------------> event-time
ウィンドウに挿入される各タプルは、そのイベント時間が属する間隔に割り当てられます。タプルは複数のウィンドウ・ペインに割り当てられることがあります。例えば、タイム・スタンプ値が T(7) のタプルがウィンドウ・ペイン [0 .. 10) と [5 .. 15) に割り当てられます。
timeInterval ウィンドウがパーティション化されている場合、その各ウィンドウ・ペインはパーティション化されます。
ウィンドウの定義
TimeInterval ウィンドウは、TimeIntervalWindowOptions オブジェクトを使用して構成されます。 以下の例は、C++ で intervalDuration(10.0), creationPeriod(5.0), discardAge(15.0) のウィンドウ・オプションを作成する方法を示しています。
TimeIntervalWindowOptions().
setIntervalDuration(timestamp(10.0)).
setCreationPeriod(timestamp(5.0)).
setDiscardAge(timestamp(15.0));
TimeInterval ウィンドウのコンストラクターには、3 つのパラメーターがあります。つまり、このウィンドウが含まれるオペレーターへの参照、このウィンドウが接続されている入力ポートの索引、およびウィンドウ・オプションです。
TimeIntervalWindow(*this, 0,
SPL::TimeIntervalWindowOptions().
setIntervalDuration(timestamp(10.0)).
setCreationPeriod(timestamp(5.0)).
setDiscardAge(timestamp(15.0)));
タプルの挿入
詳しくは、タプルの挿入 を参照してください。イベント時間間隔がオーバーラップすると、タプルは複数のウィンドウ・ペインに挿入されます。クライアントは、ウィンドウ・ペインが破棄されたときに同じタプルを複数回削除しないようにするために、タプルへの共有ポインターのウィンドウ (TimeIntervalWindow<streams_boost::shared_ptr<Tuple> > など) を作成する必要があります。
ウォーターマークの通知
SPL ランタイムは、ウィンドウを含むオペレーターがウォーターマークを進めるときに、ウィンドウに通知を送信します。TimeIntervalWindowPane はオペレーターのウォーターマークがイベント時間間隔の終わりと等しいかそれより大きくなったときに windowTriggerEvent をトリガーし、最後のトリガー以降にタプルが挿入された場合には、ウォーターマークを受け取ったときに再びトリガーします。前のトリガー・イベント以降に更新されたパーティションのみが、再びトリガーされます。
ウィンドウ・イベント
クライアントはハンドラーを TimeIntervalWindow に登録しますが、イベントは個々のウィンドウ・ペインによってトリガーされます。クライアントは、以下のイベントのハンドラーを登録できます。
- beforeTupleInsertionEvent
- タプルがウィンドウ・ペインに割り当てられる前にトリガーされます。
- afterTupleInsertionEvent
- タプルがウィンドウ・ペインに割り当てられた後にトリガーされます。
- windowTriggerEvent
- ウィンドウ・ペインがトリガーするたびにトリガーされます。
- windowInitialFullEvent
- ウィンドウ・ペインの状態が Incomplete から Complete に遷移した直後にトリガーされます。
- windowCloseEvent
- ウィンドウ・ペインの状態が Complete から Closed に遷移した直後にトリガーされます。
イベントの実行順序
ウィンドウ・イベントの実行は、タンブリング・ウィンドウやスライディング・ウィンドウと同様に、ウィンドウ・オブジェクト上で行われる insert 呼び出しによってオフに設定されます。
- beforeTupleInsertionEvent および afterTupleInsertionEvent は、タプルの挿入によってオフに設定されます。
- windowTriggerEvent、windowInitialFullEvent、 windowCloseEvent はウォーターマーク通知によってオフに設定されます。ウォーターマークが最初にウィンドウ・ペインの間隔の終わりを過ぎると、ペインは最初に windowInitialFullEvent をトリガーし、その後に windowTriggerEvent をトリガーします。
パーティションおよびタプルの排除
timeInterval ウィンドウには、タプルまたはパーティションの排除ポリシーはありません。タプルの経過時間が discardAge 値を超えると、対応するウィンドウ・ペインはクローズされ、削除されます。C++ ウィンドウ・テンプレートが streams_boost::shared_ptr<Tuple> を使用してインスタンス化される場合、タプルはペインに参照されなくなると削除されます。
データ・アクセス
ウィンドウ・イベント・ハンドラーは、タンブリング・ウィンドウやスライディング・ウィンドウでのデータ・アクセスと同様に、ウィンドウ・ペインに保管されたタプルにアクセスすることができます。以下に、サンプルのトリガー・イベント・ハンドラーからのフラグメントを示します。
void MY_OPERATOR::onWindowTriggerEvent(
WindowEventType::WindowType & window,
WindowEventType::PartitionType const & partition)
{
using namespace SPL::Functions::EventTime;
// Access the pane's interval endpoint
SPL::TriggerInfoProvider * p = dynamic_cast<SPL::TriggerInfoProvider *>(&window);
if (p != NULL) {
SPL::int64 const intervalEnd2(int64TicksFromTimestamp(
p->getEndTime(), Milliseconds));
SPLAPPTRC(L_DEBUG, "Interval end is " << intervalEnd2 << " millis" ,
SPL_OPER_DBG);
}
. . .
// Iterate through the tuples of the partition
WindowType::DataType & data = window.getWindowData(partition);
WindowType::DataType::const_iterator it;
for (it = data.begin(); it != data.end(); it++) {
IPort0Type const & tuple = **it;
// access tuple attributes
. . .
}
}