[jboss-jira] [JBoss JIRA] (DROOLS-747) declared window, type length, do actually contain more than 1 object (with reteoo)
Matteo Mortari (JIRA)
issues at jboss.org
Mon Mar 23 04:29:19 EDT 2015
Matteo Mortari created DROOLS-747:
-------------------------------------
Summary: declared window, type length, do actually contain more than 1 object (with reteoo)
Key: DROOLS-747
URL: https://issues.jboss.org/browse/DROOLS-747
Project: Drools
Issue Type: Bug
Components: core engine
Affects Versions: 6.2.0.Final
Reporter: Matteo Mortari
Assignee: Mario Fusco
h5. Premise
I know reteoo is progressively being deprecated, but I think until is there is helpful for A/B testing of possible leaks comparing with phreak (like it happened during 610Final) so reporting this bug.
h5. Executive summary
Declaring a window of type length (1) should always contain 1 object.
h5. Details
With reference to attached reproducer.
Given the following knowledge base:
{code}
global java.util.concurrent.atomic.AtomicLong globalCounter;
declare Measurement
@role(event)
end
declare window lastMeasurement
Measurement() over window:length( 1 ) // from entry-point DEFAULT
end
rule "IFF the last Measurement that I know of, is of ID color, increment the counter"
no-loop
when
Measurement( id == "color" ) from window lastMeasurement
then
globalCounter.incrementAndGet();
end
{code}
The goal is: IFF the last Measurement that I know of, is of ID "color", increment the counter. Please notice you ought to separate the window being just on Measurement, in order to know the last Measurement regardless of the ID, and then you have a rule acting on the declared window, to check IFF this last Measurement, is actually of ID "color".
Now assuming you just have created the session and the following increment/insert/fire:
{code}
AtomicLong globalCounter = new AtomicLong(0);
session.setGlobal("globalCounter", globalCounter);
session.fireAllRules();
assertEquals("no data, still 0", 0, globalCounter.get());
LOG.info("Now running data");
clock.advanceTime(1, TimeUnit.MINUTES);
Measurement mRed= new Measurement("color", "red");
session.insert(mRed);
Measurement mGreen= new Measurement("color", "green");
session.insert(mGreen);
Measurement mBlue= new Measurement("color", "blue");
session.insert(mBlue);
session.fireAllRules();
LOG.info("Final checks");
assertEquals("win lenght =1 was: ", 1, globalCounter.get());
{code}
At the end you should have the global counter with value = 1, because we inserted 3 events of type Measurement, but the declared window lastMeasurement should reference only {{mBlue}}, which should be later picked by the rule because the ID is "color", and increment the counter by 1.
This works with phreak, it does not work with reteo.
phreak globalCounter = 1 : OK
reteoo globalCounter = 3 : FAIL.
Could you kindly advise, please?
Thanks
--
This message was sent by Atlassian JIRA
(v6.3.11#6341)
More information about the jboss-jira
mailing list