[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