On 08/06/2012, bdolbeare <bdolbeare(a)yahoo.com> wrote:
Can someone explain to me why these two rules behave differently? I
expected
that the second rule would produce the same output as the first but it
seems
to ignore the first half of the logical or expression. Is this because the
unification happens before the null checks occur?
It's a simple case of the "sorprise" ( sic ;-) ).
A rule containing the Conditional Element "or" is transformed into two
(or more, depending on the number of operands) rules running under the
same name. See the Expert manual.
-W
declare Foo
name : String
item : Item
end
declare Item
id : long
end
rule "insert stuff"
when
then
Item item1 = new Item(1);
Foo foo1 = new Foo("foo1", item1);
insert(foo1);
Foo foo3 = new Foo("foo3", null);
insert(foo3);
end
rule "Unification Test Rule"
when
f : Foo ( item != null, $item := item )
f2 : (
Foo ( item == null )
or Foo ( $item := item )
)
then
System.out.println(String.format("%s Fired:\n\tFoo: %s\n\t%s",
kcontext.getRule().getName(), f, f2));
end
rule "Unification Test Rule 2"
salience -10
when
f : Foo ( item != null, $item := item )
f2 : Foo ( ( item == null ) || ( item != null && $item := item ) )
then
System.out.println(String.format("%s Fired:\n\tFoo: %s\n\t%s",
kcontext.getRule().getName(), f, f2));
end
Unification Test Rule Fired:
Foo: Foo( name=foo1, item=Item( id=1 ) )
Foo( name=foo3, item=null )
Unification Test Rule Fired:
Foo: Foo( name=foo1, item=Item( id=1 ) )
Foo( name=foo1, item=Item( id=1 ) )
Unification Test Rule 2 Fired:
Foo: Foo( name=foo1, item=Item( id=1 ) )
Foo( name=foo1, item=Item( id=1 ) )
--
View this message in context:
http://drools.46999.n3.nabble.com/Unification-with-logical-or-question-tp...
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