You explanation is very reasonable:
the engine assumes anything within $p may be changed by modify($p), although
$p.address is not changed actually.
However, I tried these rules myself and both rules were fired. Why?
According to the document, only one of the rules should fire; the other's
activation should be cancelled because the engine assumes $p has changed,
which may mismatch the other rule, right?.
The following are the output and my rules. The only difference between my
rules and the document's is that my rules don't belong to any
ruleflow-group.
==== Program Output of Inserting a "new Person()" and Firing All Rules.
BEGIN====
Rule 'Apply discount' fired. Person: Person{name[Tom],
address[Address{state[NC], city[Raleigh]}], region[null], discount[0.9]}
Rule 'Assign to sales region 1' fired. Person: Person{name[Tom],
address[Address{state[NC], city[Raleigh]}], region[sales region 1],
discount[0.9]}
==== Program Output of Inserting a "new Person()" and Firing All Rules.
END====
==== The Rules I Tested. BEGIN ====
package hello.rules
import java.util.*
import java.math.*
import hello.model.Address;
import hello.model.Person;
rule "Assign to sales region 1"
lock-on-active true
when
$p : Person()
$a : Address( state=="NC") from $p.address
then
modify ($p) { setRegion("sales region 1") }
System.out.println("Rule 'Assign to sales region 1' fired. Person:
"+$p);
end
rule "Apply discount"
lock-on-active true
when
$p : Person()
$a : Address( city=="Raleigh") from $p.address
then
modify ($p) { setDiscount((float)0.9) }
System.out.println("Rule 'Apply discount' fired. Person: "+$p);
end
==== The Rules I Tested. END ====
==== The Person and Address. BEGIN ====
public class Person
{
private String name;
private Address address;
private String region;
private float discount;
public String getRegion() {
return region;
}
public void setRegion(String region) {
this.region = region;
}
public float getDiscount() {
return discount;
}
public void setDiscount(float discount) {
this.discount = discount;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString()
{
return String.format("Person{name[%s], address[%s], region[%s],
discount[%s]}",
name, address.toString(), region, discount);
}
}
public class Address
{
private String state;
private String city;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString()
{
return String.format("Address{state[%s], city[%s]}", state, city);
}
}
==== The Person and Address END ====
--
View this message in context:
http://drools-java-rules-engine.46999.n3.nabble.com/Why-Using-from-Always...
Sent from the Drools - User mailing list archive at
Nabble.com.