[rules-users] Why Using "from" Always Return A New Fact?
Mark Proctor
mproctor at codehaus.org
Thu Jan 20 15:59:56 EST 2011
On 20/01/2011 16:28, Greg Barton wrote:
> When you say "owning 100% of the language syntax" does that include the RHS? Just curious.
yes.
Mark
> GreG
>
> On Jan 19, 2011, at 22:04, Edson Tirelli<ed.tirelli at gmail.com> wrote:
>
>> As of Drools 5.1.1, drools looks at the expression in "from" as a
>> black box. Every time it is executed, drools creates a new fact handle
>> to wrap the result(s). Since the lock and no-loop features are based
>> on the fact handles, the sometimes undesired interaction occurs. We
>> may be able to improve this in drools 6, when we will have the engine
>> owning 100% of the language syntax, that will enable us to run better
>> expression analisys than we can do today.
>>
>> Edson
>>
>> Em quarta-feira, 19 de janeiro de 2011,
>> hyjshanghai<hyjshanghai at gmail.com> escreveu:
>>> 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-Return-A-New-Fact-tp2286393p2292029.html
>>> Sent from the Drools - User mailing list archive at Nabble.com.
>>> _______________________________________________
>>> rules-users mailing list
>>> rules-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>> --
>> Edson Tirelli
>> JBoss Drools Core Development
>> JBoss by Red Hat @ www.jboss.com
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
More information about the rules-users
mailing list