The "second" event hasn't happened at the time the first has happened.
Thus, the negation (no Event coincides) *is* true.
Perhaps it helps to read "not" as "does not exist" (which is what it
actually stands for) when looking at the rule. Indeed, there *is* no
coinciding event at the time the Event is inserted.
-W
On 06/12/2013, IK81 <ml(a)kofler.me> wrote:
Yes, this was my assumption and it is also what I want. I don't
care if
code C1 is reported before C2 or vice versa. They just have to happen
within 1 minute.
However, the semantic of coincide in combination with not is unclear to
me. Why can the rule fire
at event insertion time when the engine does not know if the second
event will not happen without
waiting for an additional minute?
Ingo
On 2013-12-06 09:22, Wolfgang Laun wrote:
> Coincides is symmetric in time. You might want to use before or
> after.
> -W
>
>
> On 06/12/2013, IK81 <ml(a)kofler.me> wrote:
>> Dear all,
>>
>> I am currently stuck with a problem concerning the use of not and
>> conincide. I want to analyze a stream of error code events from a
>> set of
>> devices and detect the following situations. Every event has a
>> timestamp
>> (long), a device id (String) and an error code (String).
>>
>> What I want to detect is the following
>> - If I get two events, one with code C1 and one with C2 from a
>> single
>> device within 1 minute, it represents a special event combination.
>> The
>> order of their appearence is not relevant.
>> - If I just get C1 (without the C2 within the time frame), just
>> report
>> C1
>> - If I just get C2 (without the C1 within the time frame), just
>> report
>> C2
>>
>>
>> I can successfully detect the special event combination with the
>> following rule
>>
>> rule "Detect combination"
>> when
>> $e1 : Event ($d: device, code == "C1")
>> $e2 : Event (device == $d, code == "C2", this coincides [1m]
>> $e1)
>> then
>> ... do some output
>> end
>>
>>
>> Then I tried to implement the detection of C1 only as follows
>>
>> rule "Detect code C1"
>> when
>> $e1 : Event ($d: device, code == "C1")
>> not ( $e2 : Event (device == $d, code == "C2", this coincides [1m]
>> $e1))
>> then
>> ... do some other output
>> end
>>
>> My understanding of the rule is that it should fire, if I get the
>> event
>> with code C1 and there is no other event with error code C2 for the
>> same
>> device that happens within one minute before and after the C1 event.
>> To
>> my surprise, the rule fires immediately when I insert an event with
>> error code C1. Shouldn't the implementation wait at least 1 minute
>> to be
>> sure that no C2 error event will be inserted?
>>
>>
>> BTW this is how I insert the events in my test case:
>>
>> clock.advanceTime(70, TimeUnit.SECONDS);
>> FactHandle handle1 = ksession.insert( new Event(65000, "A",
"C1")
>> );
>> ksession.fireAllRules();
>> clock.advanceTime( 10, TimeUnit.SECONDS );
>> FactHandle handle2 = ksession.insert( new Event(75000, "A",
"C2")
>> );
>> ksession.fireAllRules();
>> clock.advanceTime( 2, TimeUnit.SECONDS );
>>
>> And this is mainly the output I get:
>>
>> detected code C1 @ 70000
>> event id=44b895e5-7287-404b-8204-3de5690b2360 timestamp=65000
>> device=A code=C1
>> detected combination @ 80000
>> event id=44b895e5-7287-404b-8204-3de5690b2360 timestamp=65000
>> device=A code=C1
>> event id=fc89715b-fc30-4b12-ab31-a3884dcd4886 timestamp=75000
>> device=A code=C2
>>
>> Any ideas concerning an alternative solution are highly welcomed.
>>
>> Thanks,
>> Ingo
>>
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users(a)lists.jboss.org
>>
https://lists.jboss.org/mailman/listinfo/rules-users
>>
> _______________________________________________
> rules-users mailing list
> rules-users(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users