[rules-users] About String..."==" same as ".equals"?

Edson Tirelli tirelli at post.com
Tue Jan 9 19:12:05 EST 2007


   Joel,

   No. Your mistake is on the mapping of objects x patterns. Let me show 
you an example:

   If you write a rule like this:

rule "expensive muzzarela"
when
     Cheese( type == "muzzarela", price > 50 )
then
   // so something
end

    You are saying the engine: "- match each SINGLE instance of Cheese 
that is BOTH type == "muzzarela" AND whose price is greater than 50".

    If you write a rule like this:

rule "one muzzarela and one expensive cheese"
when
   Cheese( type == "muzzarela" )
   Cheese( price > 50 )
then
   // do something
end

    You are saying the engine: "- match each PAIR of Cheese instances, 
where the FIRST instance is of type == "muzzarela" and the SECOND 
instance is of any cheese that has price greater than 50".

    Do you see the difference?
 
    So, if you do:

workingMemory.assert( new Cheese("muzzarela", 70) );
workingMemory.fireAllRules();

   Only the first rule will fire, because the second rule requires 2 
objects, one matching each constraint.

   If you do:

workingMemory.assert( new Cheese("muzzarela", 10) );
workingMemory.assert( new Cheese("brie", 70) );
workingMemory.fireAllRules();

   Only the second rule will fire, because the first rule requires that 
a single object match BOTH constraints.

   So, the above has nothing to do with variable bindings, but to make 
clear, you can bind variables to each of the patterns you write, but you 
can't use the same variable name for different patterns as each pattern 
will match a different object.

    Also, please note that top level AND operator is optional as it is 
already implicitly handled. So, the bellow rule is IDENTICAL to the one 
I wrote above:

rule "one muzzarela and one expensive cheese"
when
   Cheese( type == "muzzarela" ) AND
   Cheese( price > 50 )
then
   // do something
end

    I hope it clarified things a little bit. Let me know if you still 
have questions.

    []s
    Edson


Joel G. Rivera-González wrote:

> i see...
> when 3.2 will be available?
> :-)
>
> ok...
> so i'm writing the rules the wrong way?
> i need to put the and's on the same line separated by ','?
> i if wanted to the it the way i wrote the rules i would have to put a 
> different name to each of the objects right? (mto1:MegaTransferObject 
> mto2:MegaTransferObject, ect)
>
> this is a little complicated and i dindt saw it on the 
> documentation...where i can read about it?
> i will rewrite the rules to match the right way...
>
> thanks...
>
>
>
>
>  
> Joel G. Rivera-Gonzalez
> PRT
>
> "The first 90% of a project takes 90% of the time, the last 10% takes 
> the other 90% of the time" - Murphy's Law
>
>
> ----- Original Message ----
> From: Edson Tirelli <tirelli at post.com>
> To: Rules Users List <rules-users at lists.jboss.org>
> Sent: Tuesday, January 9, 2007 6:44:22 PM
> Subject: Re: [rules-users] About String..."==" same as ".equals"?
>
>    Joel,
>
>    If it is the same object that you are trying to match against all of
> those constraints, just list all your constraints separated by ',' 
> (comma):
>
> rule "dtv_discount_request"
> when
>      mto : MegaTransferObject( orders_FkOrderTypeId ==
> Constants.NEW_COMPLETED_ORDER_TYPE,
>                                ct:other_ChannelType ->  ( !
> ct.equalsIgnoreCase(Constants.CHANNEL_TYPE_RESELLER)),
>                                orders_FkChannelId !=
> Constants.ISP_CHANNEL_ID_PRW,
>                                orders_FkChannelId !=
> Constants.ISP_CHANNEL_ID_TLD,
>                                orders_FkChannelId !=
> Constants.ISP_CHANNEL_ID_AOL,
>                                other_HasDtvDiscountRequest == false,
>                                pl:phoneList_GovernmentAccount -> ( (pl
> == null) || ( pl.equals(Constants.FLAG_NO)) ),
>                                cp:customerProfile_DtvDiscount -> ( (cp
> == null) || ( cp.equals(Constants.FLAG_NO)) ),
>                                oa:other_AccountType -> ( ( oa == null)
> || ( oa.equals( Constants.PHONE_TYPE_RESIDENTIAL)) ) )
> then
>         menu.add(new String[]{Constants.SERVICE_ASSURANCE_TREE_MENU_DSL,
> Constants.SERVICE_ASSURANCE_MENU_DTV_DISCOUNT_REQUEST});
> end
>
>
>     Just remember:
>
> * you must have one and only one pattern for each single object you want
> to match in each rule, i.e., the mapping between patterns and object
> instances is always one-to-one.
>
> * constraints are separated by ',' (comma), and ',' has an implicit
> meaning of AND between constraints
>
> * version 3.0.x does not support OR between constraints, so the way
> around it is to use predicates like I demonstrated above. Version 3.2
> already has support for connective OR constraints.
>
>     I hope it helps.
>
>     []s
>     Edson
>
>
> Joel G. Rivera-González wrote:
>
> > i see...that would works...but now if you add stuff and make a rule
> > that look like this, the binding will not work...
> >
> > rule "dtv_discount_request"
> >     when
> >         MegaTransferObject(orders_FkOrderTypeId ==
> > Constants.NEW_COMPLETED_ORDER_TYPE) and
> >         not MegaTransferObject(ct:other_ChannelType ->  
> > (ct.equalsIgnoreCase(Constants.CHANNEL_TYPE_RESELLER))) and
> >         (not MegaTransferObject(orders_FkChannelId ==
> > Constants.ISP_CHANNEL_ID_PRW) and
> >         not MegaTransferObject(orders_FkChannelId ==
> > Constants.ISP_CHANNEL_ID_TLD) and
> >         not MegaTransferObject(orders_FkChannelId ==
> > Constants.ISP_CHANNEL_ID_AOL)) and
> >         (MegaTransferObject(phoneList_GovernmentAccount == null) or
> > MegaTransferObject(phoneList_GovernmentAccount == 
> Constants.FLAG_NO)) and
> >         (MegaTransferObject(customerProfile_DtvDiscount == null) or
> > MegaTransferObject(customerProfile_DtvDiscount == 
> Constants.FLAG_NO)) and
> >         (MegaTransferObject(other_AccountType == null) or
> > MegaTransferObject(other_AccountType ==
> > Constants.PHONE_TYPE_RESIDENTIAL)) and
> >         MegaTransferObject(other_HasDtvDiscountRequest == false)
> >     then
> >         menu.add(new
> > String[]{Constants.SERVICE_ASSURANCE_TREE_MENU_DSL,
> > Constants.SERVICE_ASSURANCE_MENU_DTV_DISCOUNT_REQUEST});
> > end
> >  
> > i was trying to bre creative and add megaTO: before all the
> > MegaTransferObject and it gave me the compilation error you
> > mention...but only after the third megaTO:
> >
> >
> > Joel G. Rivera-Gonzalez
> > PRT
> >
> > "The first 90% of a project takes 90% of the time, the last 10% takes
> > the other 90% of the time" - Murphy's Law
> >
> >
> > ----- Original Message ----
> > From: Edson Tirelli <tirelli at post.com>
> > To: Rules Users List <rules-users at lists.jboss.org>
> > Sent: Tuesday, January 9, 2007 4:39:57 PM
> > Subject: Re: [rules-users] About String..."==" same as ".equals"?
> >
> >    Joel,
> >
> >    I just noticed in your last rule you do the binding to the same
> > variable:
> >
> > >         megaTO:MegaTransferObject(other_AccountType == "RMS")
> > >         megaTO:MegaTransferObject(other_HasDtvDiscountRequest == 
> false)
> >
> >    I thought that feature was already disabled... :( it should give you
> > an error of duplicate variable declaration! is it not raising an error
> > when compiling the rule??
> >
> >    The correct way of doing it if it is the same object is getting both
> > constraints in the same pattern:
> >
> > megaTO: MegaTransferObject( other_AccountType == "RMS",
> > other_HasDtvDiscountRequest == false)
> >
> >    So, rules 1 and 2 are correct in not firing, since you would need 2
> > different objects to match the 2 patterns in them.
> >    The mapping between patterns and objects is "one-to-one".
> >
> >    []s
> >    Edson
> >  
> >
> >
> > Joel G. Rivera-González wrote:
> >
> > > 1. i downloaded the latest release from the download page...
> > > 2. just one MTO...the returning arrayList should have arround 10 
> values.
> > >
> > > will do an example and (class and ruleFile) and send it to your 
> email...
> > >
> > > thanks
> > >  
> > > Joel G. Rivera-Gonzalez
> > > PRT
> > >
> > > "The first 90% of a project takes 90% of the time, the last 10% takes
> > > the other 90% of the time" - Murphy's Law
> > >
> > >
> > > ----- Original Message ----
> > > From: Edson Tirelli <tirelli at post.com>
> > > To: Rules Users List <rules-users at lists.jboss.org>
> > > Sent: Tuesday, January 9, 2007 3:29:26 PM
> > > Subject: Re: [rules-users] About String..."==" same as ".equals"?
> > >
> > >
> > >    Joel,
> > >
> > >    Your rules seems to be correct.
> > >    Questions:
> > >
> > > 1. What JBRules version are you using?
> > >
> > > 2. How many MTO instances are you asserting in the working memory, 
> that
> > > would match each Pattern in your rule?
> > >
> > >    It may be an issue with "or". Can you provide a self contained test
> > > for me to investigate?
> > >
> > >    Thank you
> > >       Edson
> > >
> > > Joel G. Rivera-González wrote:
> > >
> > > > i have to be doing something wrong...but it make no sense...
> > > > a MegaTransferObject is asserted.
> > > >
> > > > case1: No rules fired.
> > > > rule "dtv_discount_request"
> > > >     when
> > > >         MegaTransferObject(other_AccountType == null) or
> > > >         MegaTransferObject(other_AccountType ==
> > > > Constants.PHONE_TYPE_RESIDENTIAL)
> > > >         MegaTransferObject(other_HasDtvDiscountRequest == false)
> > > >     then
> > > >         menu.add(new
> > > > String[]{Constants.SERVICE_ASSURANCE_TREE_MENU_DSL,
> > > > Constants.SERVICE_ASSURANCE_MENU_DTV_DISCOUNT_REQUEST});
> > > > end
> > > >
> > > > case 2: no rule fired.
> > > >
> > > > rule "dtv_discount_request"
> > > >     when
> > > >         MegaTransferObject(other_AccountType == null) or
> > > >         MegaTransferObject(other_AccountType == "RMS")
> > > >         MegaTransferObject(other_HasDtvDiscountRequest == false)
> > > >     then
> > > >         menu.add(new
> > > > String[]{Constants.SERVICE_ASSURANCE_TREE_MENU_DSL,
> > > > Constants.SERVICE_ASSURANCE_MENU_DTV_DISCOUNT_REQUEST});
> > > > end
> > > >
> > > > case 3: rule fired
> > > >  
> > > > rule "dtv_discount_request"
> > > >     when
> > > >         megaTO:MegaTransferObject(other_AccountType == "RMS")
> > > >         megaTO:MegaTransferObject(other_HasDtvDiscountRequest ==
> > false)
> > > >     then
> > > >         menu.add(new
> > > > String[]{Constants.SERVICE_ASSURANCE_TREE_MENU_DSL,
> > > > Constants.SERVICE_ASSURANCE_MENU_DTV_DISCOUNT_REQUEST});
> > > > end
> > > >
> > > > i really dont get it...
> > > > i must not be getting something...
> > > > help...
> > > >
> > > >
> > > > Joel G. Rivera-Gonzalez
> > > > PRT
> > > >
> > > > "The first 90% of a project takes 90% of the time, the last 10% 
> takes
> > > > the other 90% of the time" - Murphy's Law
> > > >
> > > >
> > > > ----- Original Message ----
> > > > From: Edson Tirelli <tirelli at post.com>
> > > > To: Rules Users List <rules-users at lists.jboss.org>
> > > > Sent: Tuesday, January 9, 2007 7:26:35 AM
> > > > Subject: Re: [rules-users] About String..."==" same as ".equals"?
> > > >
> > > >
> > > >    Joel,
> > > >
> > > >    This is the correct syntax and it works (at least we didn't get a
> > > > report for it not working yet):
> > > >
> > > > Object(variable == Constants.value)
> > > >
> > > >    Can you please elaborate about the problem you are having in 
> order
> > > > for us to help solving it? If it is a bug we need to fix.
> > > >
> > > >    Thank you,
> > > >       Edson
> > > >
> > > > Joel G. Rivera-González wrote:
> > > >
> > > > > most (if not all) of my rules will have conditions like this:
> > > > > Object(variable == Constants.value)
> > > > > this is not working...
> > > > > BUT if i change the Constants.value to corresponding value 
> from the
> > > > > constants class it will work...
> > > > > is there any other way other than this Object(a:variable->  
> > > > > (a.equals(Constants.value)) to do it?
> > > > >
> > > > >
> > > > >
> > > > >  
> > > > > Joel G. Rivera-Gonzalez
> > > > > PRT
> > > > >
> > > > > "The first 90% of a project takes 90% of the time, the last 10%
> > takes
> > > > > the other 90% of the time" - Murphy's Law
> > > > >
> > > >
> > >
> > 
> >------------------------------------------------------------------------
> > > > >
> > > > >_______________________________________________
> > > > >rules-users mailing list
> > > > >rules-users at lists.jboss.org
> > > > >https://lists.jboss.org/mailman/listinfo/rules-users
> > > > >  
> > > > >
> > > >
> > > >
> > > > --
> > > > Edson Tirelli
> > > > Software Engineer - JBoss Rules Core Developer
> > > > Office: +55 11 3124-6000
> > > > Mobile: +55 11 9218-4151
> > > > JBoss, a division of Red Hat @ www.jboss.com <http://www.jboss.com>
> > <http://www.jboss.com> <http://www.jboss.com>
> > > <http://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
> > > >  
> > > >
> > >
> > >
> > > --
> > > Edson Tirelli
> > > Software Engineer - JBoss Rules Core Developer
> > > Office: +55 11 3124-6000
> > > Mobile: +55 11 9218-4151
> > > JBoss, a division of Red Hat @ www.jboss.com 
> <http://www.jboss.com> <http://www.jboss.com>
> > <http://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
> > >  
> > >
> >
> >
> > --
> > Edson Tirelli
> > Software Engineer - JBoss Rules Core Developer
> > Office: +55 11 3124-6000
> > Mobile: +55 11 9218-4151
> > JBoss, a division of Red Hat @ www.jboss.com <http://www.jboss.com> 
> <http://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
> >  
> >
>
>
> -- 
> Edson Tirelli
> Software Engineer - JBoss Rules Core Developer
> Office: +55 11 3124-6000
> Mobile: +55 11 9218-4151
> JBoss, a division of Red Hat @ www.jboss.com <http://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
>  
>


-- 
 Edson Tirelli
 Software Engineer - JBoss Rules Core Developer
 Office: +55 11 3124-6000
 Mobile: +55 11 9218-4151
 JBoss, a division of Red Hat @ www.jboss.com





More information about the rules-users mailing list