2017-12-28 4 views
0

ルール設定オブジェクトを使用して、ルール自体を外部設定できるルールシステムを設計しようとしています。具体的には、DRLルール定義の外部に、特定のタイプのルールに対するルールの起動間隔の最小値を設定する必要があります。

私のアプローチは、これまで事実としてValueRuleSpecをルールの構成を挿入することです:

rule "Any value detected" 
when 
    $r : ValueRuleSpec(mode == ValueRuleSpecMode.ANY(), $devices: devices) 
    $e : SensorEvent(deviceId memberOf $devices) from entry-point FMSensorEvents 
    not Activation(ruleSpec == $r, cause == $e) 
then 
    insert(new Activation($r, $e)); 
end 

$ rをValueRuleSpecオブジェクトはアクティベーションの間の秒数の最小値を含むプロパティtriggerEveryを持っています。どのように私が使用して、設定可能な時間ウィンドウでこれを行うことができ

not Activation(this before[60s, 0s] $e) 

:私はこのようなものを使用して$電子の前に特定の範囲内にあるアクティベーションオブジェクトの不在のために試験により、静的に行うことができることを知っています$ r.triggerEveryプロパティは秒数ですか?

+1

時間的演算子、すなわち、 'before'、' after'など、あります一時的な表現で参照される事象のタイムスタンプを含む特定の条件のための構文的砂糖だけである。 (演算子の定義はDroolsマニュアルにあります)。同じ関係を計算する静的メソッドのDRL関数を記述しながら、3番目の事実から来るパラメータを含めても、それほど難しいものではありません。タイムスタンプは、イベントが挿入されたときにJavaコードで設定されたイベントのフィールドとして持つ必要があります。 – laune

答えて

0

launeのアドバイスに基づいて自分の質問に答える。

キーワードの動作はdescribed in the manualのようにあるザ・前:と$ eventB が開始$ eventAが終了時間と時間の間の時間的距離 がある場合だけ

$eventA : EventA(this before[ 3m30s, 4m ] $eventB) 

前のパターンが一致します(3分30秒)と(4分)との間にある。 つまり:

3m30s <= $eventB.startTimestamp - $eventA.endTimeStamp <= 4m 

source code for the before evaluatorを見上げる私たちは同じことを見ることができます。

私はそれに応じて自分のコードを変更した、正しく動作するようですこれに基づき
@Override 
protected boolean evaluate(long rightTS, long leftTS) { 
    long dist = leftTS - rightTS; 
    return this.getOperator().isNegated()^(dist >= this.initRange && dist <= this.finalRange); 
} 

rule "Any value detected" 
when 
    $r : ValueRuleSpec(mode == ValueRuleSpecMode.ANY(), $devices: devices) 
    $e : SensorEvent(deviceId memberOf $devices) from entry-point FMSensorEvents 
    not Activation(ruleSpec == $r, cause == $e) 
    // no activation within past triggerEvery seconds for same device 
    not Activation(
     ruleSpec == $r, 
     deviceId == $e.deviceId, 
     start.time > ($e.start.time - ($r.triggerEvery * 1000)) 
    ) 
then 
    insert(new Activation($r, $e)); 
end