If you can work it into some sort of unit test, we’ll fix it ASAP. If you look at:
"Re: [rules-users] NullPointerException with LeftTupleIndexHashTable.remove()”
You’ll see there he created a large project, which we then on the dev mailing list showed
how to convert into a single self contained unit test. If you could follow that, it would
be appreciated and save us a lot of time.
Mark
On 27 Feb 2014, at 19:50, mikerod <mjr4184(a)gmail.com> wrote:
With both Drools v5.5.0.Final and v5.6.0.Final I observe a different
behavior
than in both v6.0.0.Final and v6.0.1.Final.
in certain rules with negation wrapped around nested constraints.
I have tried to make the simplest rules to demonstrate the situation.
With a kb consisting of the following rules, which I have comments on that
describe what I've
found with the situation:
```
// Enabling this rule, makes "negation_over_nested" and
// "negation_distributed_partially_sharing" fire;
// without it they do not.
//
// I think this is due to some shared structure
// in the underlying subnetwork (I believe this is referred to as a
"segment").
// Perhaps it makes them "linked" in when otherwise they are being missed.
/** *This is commented out, uncommenting causes different firing of other
rules*
rule shared_conjunct
when
(not (String() and Integer()))
then
System.out.println("shared_conjunct");
end
*/
// Won't fire with no wm facts UNLESS
// it shares (I think) a node/subnetwork/segment with constraints
// in a rule like "rule shared_conjunct" that DOES fire
rule negation_over_nested
when
not ( (String() and Integer())
or
(String() and Integer()))
then
System.out.println("negation_over_nested");
end
// Won't fire with no wm facts
rule negation_distributed_partially_no_sharing
when
(not (String() and Long()))
and
(not (String() and Long()))
then
System.out.println("negation_distributed_partially_no_sharing");
end
// Same situation as "negation_over_nested"
rule negation_distributed_partially_sharing
when
(not (String() and Integer()))
and
(not (String() and Integer()))
then
System.out.println("negation_distributed_partially_sharing");
end
// DOES fire with no wm inserts.
// DOES NOT need "shared_conjunct" to work
rule negation_distributed_fully
when
((not String()) or (not Integer()))
and
((not String()) or (not Integer()))
then
System.out.println("negation_distributed_fully");
end
```
---
This is the only 2 rules in the kb. Running a session, with no facts
inserted and then firing all rules.
---
Drools v5.x output
with "shared_conjuct" rule uncommented:
```
negation_distributed_fully
negation_distributed_fully
negation_distributed_fully
negation_distributed_fully
negation_distributed_partially_no_sharing
negation_distributed_partially_sharing
negation_over_nested
shared_conjunct
fired: 8
time elapsed: 0.0
done
```
with "shared_conjuct" rule commented out:
```
negation_distributed_fully
negation_distributed_fully
negation_distributed_fully
negation_distributed_fully
negation_distributed_partially_no_sharing
negation_distributed_partially_sharing
negation_over_nested
fired: 7
time elapsed: 0.0010
done
```
---
Drools v6.x output:
with "shared_conjuct" rule uncommented:
```
shared_conjunct
negation_over_nested
negation_distributed_partially_sharing
negation_distributed_fully
negation_distributed_fully
negation_distributed_fully
negation_distributed_fully
fired: 7
time elapsed: 0.0
done
```
with "shared_conjuct" rule commented out:
```
negation_distributed_fully
negation_distributed_fully
negation_distributed_fully
negation_distributed_fully
fired: 4
time elapsed: 0.0
done
```
I do note in the v6.x output, "negation_distributed_partially_no_sharing"
never fires, since it is specifically not sharing any
negated conjunt with the other rules. This seems to correlate with whether
or not these rules fire.
Also, I realize my terminology is slightly off. I think this is an issue
with rules having shared "segments", where
one of these segments that is shared is the negation subnetwork introduced
in "shared_conjunct".
I also note that "negation_distributed_fully" always fires, independent of
any potential "segment" sharing.
As I mentioned in a comment on "shared_conjuct", I'm thinking this relates
to the newer PHREAK algorithm vs the original ReteOO.
Is this expected? Is there something incorrect about the structure of the
negation rules?
Perhaps I have stumbled upon a defect?
I have not had time to do any sort of deeper debugging into the issue, if I
find out more info, I'll post it up here.
p.s. I know the types are not meaningful, this is just an example to show
the difference. I hope it accomplishes this goal.
--
View this message in context:
http://drools.46999.n3.nabble.com/Nested-negation-constraints-behavior-ch...
Sent from the Drools: User forum mailing list archive at
Nabble.com.
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users