[jboss-jira] [JBoss JIRA] (DROOLS-688) coincides temporal operator issue when combined with not and duration

Matteo Mortari (JIRA) issues at jboss.org
Thu Jan 15 10:06:49 EST 2015


Matteo Mortari created DROOLS-688:
-------------------------------------

             Summary: coincides temporal operator issue when combined with not and duration
                 Key: DROOLS-688
                 URL: https://issues.jboss.org/browse/DROOLS-688
             Project: Drools
          Issue Type: Bug
    Affects Versions: 6.2.0.CR4, 6.1.0.Final
            Reporter: Matteo Mortari
            Assignee: Mark Proctor


_Premise_: this is assuming in case of Point/Point event comparison, the combination of {{after\[delta\]}} + {{before\[delta\]}} could be simplified into {{coincides\[delta\]}}. If not the case, there is still one case failing (using 6.2.0.CR4) and imho worth reporting.



h5. Executive summary
I would like to report two issues

_Main Issue_. Given the following condition in LHS:
{code:java}
not Yang( this after[10s] $yin, this before[10s] $yin ) 
{code}
I understood this could have been simplified into
{code:java}
not Yang( this coincides[10s] $yin )
{code} assuming Yang and $yin are both Point events (start coincides with end). The reproducer I will attach demonstrate IFF I put in the first form, it does work as expected and all test are passing; however if using the latter form, test would fail.

_Second issue_. Even assuming the first form, using version 6.2.0.CR4 would fail when using phreak and TimedRuleExectionOption because NETWORK_EVALUATOR.evaluateNetwork() in RuleExecutor would not terminate.



h5. Description

Reference is made to attached reproducer. Assume the following KB:
{code:java}
declare Yin
	@role(event)
end

declare Yang
	@role(event)
end

declare ErrorToken
	@role(event)
	origin : Yin
end

rule "Yin is missing Yang balance"
duration 10000
agenda-group "USERSPACE"
no-loop
when
  $yin : Yin()
  not ErrorToken(origin : $yin)
  not Yang( this after[10s] $yin, this before[10s] $yin ) // shouldn't this be equivalent to: not Yang( this coincides[10s] $yin ) ?
then
  System.out.println("Rule RHS: Yin is missing Yang balance");
  ErrorToken token = new ErrorToken();
  token.setOrigin($yin);
  insert(token);
end
{code}

In other words, if a Yin event is detected, there shall be a Yang event either 10s before or 10s after, otherwise an ErrorToken is inserted because of this missing balance.

Hence the test suite is aimed at verifying two main use-cases.
First use case, in case Yin is followed by a Yang, the balance is correct, hence no ErrorToken shall be issued:
{code:java}
advance(clock, 1, TimeUnit.MINUTES);
insert(session, new Yin());
fire(session);
assertEquals("I fired an Error too early", 0, session.getObjects(errorTokenFilter).size());

advance(clock, 1, TimeUnit.SECONDS);
insert(session, new Yang());
fire(session);
assertEquals("As I provided an Yang, there should be no errors", 0, session.getObjects(errorTokenFilter).size());
{code}

Second use case, in case Yin is issued and NO Yang is issued, an ErrorToken shall indeed be present signifying the first Yin has no balance
{code:java}
advance(clock, 1, TimeUnit.MINUTES);
insert(session, new Yin());
fire(session);
assertEquals("I fired an Error too early", 0, session.getObjects(errorTokenFilter).size());

advance(clock, 30, TimeUnit.SECONDS);
insert(session, new Yin());
fire(session);
assertEquals("Now I should be certain for the first Yin there should be 1 error", 1, session.getObjects(errorTokenFilter).size());
{code}

You can also check that even without inserting the second Yin, the test suite is passing all test as intended.



h5. Reproduce the problem.

_Main Issue_. Change the following condition in LHS:
{code:java}
not Yang( this after[10s] $yin, this before[10s] $yin ) 
{code}
into
{code:java}
not Yang( this coincides[10s] $yin )
{code}
which basically should signify: _There is missing a Yang in the temporal neighbourhood of 10s when Yin happened_. Now the test suite will fail the tests.

_Second issue_. Even assuming the first form, hence leaving UNchanged the KB as originally provided in the reproducer. Now go to the pom.xml and change drools-version property in order to be using version 6.2.0.CR4 . Then test suite would fail when using phreak and TimedRuleExectionOption because NETWORK_EVALUATOR.evaluateNetwork() in RuleExecutor would not terminate.


Can you kindly advise, please?
Thank you



--
This message was sent by Atlassian JIRA
(v6.3.11#6341)


More information about the jboss-jira mailing list