2011/7/5 Michael Anstis <michael.anstis@gmail.com>
Won't that just make the rule activate after 3 minutes?

That's the idea - only then will you know that there is no B within 3 minutes after A. If there is a B after A, the rule condition is false and the rule does not fire.
 

rule AnoB

when
    $a: A( status == "waiting for B" )
    not B( this after [3m] $a )


I think this is true the moment another A arrives; Drools has no way of knowing that the 3m extend into the future.

-W
 
then
    modify( $a ){ setStatus( "no B within 3m after me" ) }
end

Is this any good?

Also "untested" ;)

 

2011/7/5 Wolfgang Laun <wolfgang.laun@gmail.com>
Try a rule with a timer:

rule AnoB
timer( int: 3m )
when
    $a: A( status == "waiting for B" )
    not B( this after $a )
then
    modify( $a ){ setStatus( "no B within 3m after me" ) }
end

Untested.
-W



On 5 July 2011 13:00, wendy <w.mungovan@yahoo.com> wrote:
Hi,
 I'm having trouble writing an absence pattern.  What I'm trying to do is
detect when there is an A followed by no Bs for 3+minutes.  I don't care if
there is more than one A.  What I'm running into is that when I try to use
'over window:time' the time within drools is the end time of the window.  So
this means I need to write the no Bs for 3+ min first:

not( $b: B() over window:time(3m))

then try to find the A before it:

$now: Long() from RuleUtilityFunctions.getSessionClockTime()
$a: A( this before [3m] $now)

then I should have to check to make sure that I don't have any Bs between
$a's time and the start of the no B window:

not( B( time >= $a.time,
          time <= $now))

This is not working.  I think that it has something to do with my function
to get the session clock time (RuleUtilityFunctions.getSessionClockTime())
and how things get evaluated within the Rete engine.  Because it does not
seem like $now is getting re-evaluated on future calls that pass the $b
condition.  If I replace $now with the call to getSessionClockTime()
everything just seems to get weird.

I've tried to write the rule forward too.  Look for A followed by no B but
that does not seem to work because A is matched at the current time and the
rule triggers because there is no B because the future B data has not be
inserted into working memory yet.

What is the right way to write this rule?   Is there a way to get the start
and end time of the time window that met the over window:time() condition?

Thank you,
Wendy


--
View this message in context: http://drools.46999.n3.nabble.com/Absence-Pattern-question-tp3140377p3140377.html
Sent from the Drools: User forum mailing list archive at Nabble.com.
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users


_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users



_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users