Bill,
The new version works fine with nested conditional elements and allow
for any level of nesting. You simply must be very careful with OR as the
semantics of OR in a rules engine are not exactly the same as most
people are used to in imperative programming.
Also, the syntax you showed bellow is not correct (but maybe it was
simply a typo in the e-mail).
Maybe if you can write your "intent" or a sample rule (in english)
you are trying to implement it is easier to help.
[]s
Edson
Bill Zhang wrote:
Edson,
Thanks for the reply. The rule you authored worked fine on my new
Drools build from SVN.
However, I did notice that the following pattern matching is not working:
$p: Person(
(Person(some comparison logic) or Person(some comparison logic) )
and
(Person(some comparison logic) or Person(some comparison logic) )
)
Looks like althugh "or" is allowed, the new version does not use
"and"
within pattern matching. Am I right or did I do something wrong?
Thanks,
Bill
On 2/19/07, Edson Tirelli <tirelli(a)post.com> wrote:
> Bill,
>
> Unfortunatelly we are working hard to get all features finished in
> time for the release and the documentation will only be done right
> before release unless we get some help from community. So, maybe if you
> (or anyone else) think you can help with that, we would gladly provide
> you with info that when written down would be usefull both for your
> users/team and to other drools users.
>
> You need to use bound variables when you want to do an OR (||)
> between constraints of different fields inside a single Pattern. So, in
> your example, as you want to do:
>
> lastOrderPrice > 300 OR totalOrderNumber >2
>
> For the same Person object, it means you need to do either:
>
> Person( $lop: lastOrderPrice, $ton: totalOrderNumber, ( $lop > 300 ||
> $ton >2 ))
>
> Or using a predicate without the bound variables:
>
> $p: Person( ($p.getLastOrderPrice() > 300 || $p.getTotalOrderNumber() >
> 2 ) )
>
> Or use an eval (that I think is the least efficient way):
>
> $p: Person()
> eval( $p.getLastOrderPrice() > 300 || $p.getTotalOrderNumber() > 2 )
>
> From the above options, I would go with the first.
> Unfortunatelly, there is no semantics currently defined for the
> syntax you used:
>
> Person( lastOrderPrice > 300 || totalOrderNumber >2 )
>
> We may eventually do it in the future, but for now (Mark can confirm
> that), we don't have resources to add it to the next major release
> (again, unless community comes in to help).
>
> []s
> Edson
>
>
>
>
> Bill Zhang wrote:
>
> > That's it, Edson. I'll give it a try and I'll let you know whether
I
> > make it.
> >
> > Edson, I will appreciate if you can point to me where is the most
> > recent syntax document. Thanks.
> >
> > I am not sure why I need to use bound variables ($lop:
> > lastOrderPrice). Can I write it in the following:
> >
> > rule ...
> > when
> > $person : ( Person( age > 35 | <25,
> > zipCode == "23546" | ==
"68570",
> > ( lastOrderPrice > 300 ||
> > totalOrderNumber >2 ))
> > or
> > Person( lastOrderCategory == "098" | ==
"109",
> > zipCode == "74567" | ==
"23756" ) )
> > then
> > $person.setStatus( "KT" );
> > end
> >
> >
> >
> > Thanks to everyone helping me. This is really a great community.
> >
> > On 2/19/07, Edson Tirelli <tirelli(a)post.com> wrote:
> >
> >>
> >> Bill,
> >>
> >> Your statement bellow can be written in 3.1M1 as:
> >>
> >> rule ...
> >> when
> >> $person : ( Person( age > 35 | <25,
> >> zipCode == "23546" | ==
"68570",
> >> $lop: lastOrderPrice,
> >> $ton: totalOrderNumber,
> >> ( $lop > 300 || $ton >2 ))
> >> or
> >> Person( lastOrderCategory == "098" | ==
"109",
> >> zipCode == "74567" | ==
"23756" ) )
> >> then
> >> $person.setStatus( "KT" );
> >> end
> >>
> >> []s
> >> Edson
> >>
> >> Bill Zhang wrote:
> >>
> >> > Hi Alex,
> >> >
> >> > Thank you for confirming this. Writing such a builder may take us a
> >> > lot of time because our business user is used to free style
> >> > Pascal-like authoring using quite complex logic. For example,
> >> >
> >> > IF
> >> > (
> >> > (
> >> > (Person.Age > 35 OR Person.Age < 25) AND
> >> > (Person.ZipCode =23546 or Person.ZipCode = 68590)
> >> > )
> >> > and
> >> > (
> >> > (Person.LastOrderPrice > 300 OR
> >> > (Person.TotalOrderNumber > 2)
> >> > )
> >> > )
> >> > OR
> >> > (
> >> > (
> >> > (Person.LastOrderCategory in ("098", "109") ) AND
> >> > (Person.ZipCode =74567 or Person.ZipCode = 23765)
> >> > )
> >> > and
> >> > (
> >> > (Person.LastOrderPrice > 1000 OR
> >> > (Person.TotalOrderNumber > 1)
> >> > )
> >> > )
> >> > ...
> >> >
> >> > THEN Person.Status = "KT";
> >> >
> >> > Before I set out to write the builder, I would like to know whether
> >> > the new syntax can handle the above logic? Also, where can I find
> >> > document for the new syntax?
> >> >
> >> > I am also trying to find some existing open source Java library to
> >> > "flatten out" these complex logic - to break these complex
logic to
> >> > atomic ones that can be handled by Drools. Do you have any
> >> > recommendation?
> >> >
> >> > Thanks a lot for your help.
> >> >
> >> > Bill Y.
> >> >
> >> >
> >> >
> >> >
> >> > On 2/19/07, Alexander Varakin <avarakin(a)optonline.net> wrote:
> >> >
> >> >> We built a Rule Builder which creates drl with all possible
> >> >> combinations. In any case, drl syntax is not exactly business user
> >> >> friendly, so having such builder is not a bad idea.
> >> >> Simple Rule Builder can be implemented as an Excel spreadsheet,
> which
> >> >> can be easily parsed using POI library and then drl file produced.
> >> >>
> >> >> Steven Williams wrote:
> >> >> > Hi Bill,
> >> >> >
> >> >> > To implement your rules in 3.0.5 you would need to implement
> a rule
> >> >> > for each combination of age and zipCode.
> >> >> >
> >> >> > $a : Person(age > 35 zipCode == 23546)
> >> >> > then
> >> >> > $a.setStatus("KT");
> >> >> >
> >> >> > $a : Person(age < 25, zipCode == 23546 )
> >> >> > then
> >> >> > $a.setStatus("KT");
> >> >> >
> >> >> > $a : Person(age > 35, zipCode == 68590)
> >> >> > then
> >> >> > $a.setStatus("KT");
> >> >> >
> >> >> > etc..
> >> >> >
> >> >> > Steve
> >> >> >
> >> >> > On 2/19/07, *Bill Zhang* <billzhang2006(a)gmail.com
> >> >> > <mailto:billzhang2006@gmail.com>> wrote:
> >> >> >
> >> >> > So Alex, if I only want to use the old syntax that is in
> >> >> production,
> >> >> > there is no way to implement my seemingly simple logic
> >> >> conditioning?
> >> >> >
> >> >> > Thanks for your help.
> >> >> >
> >> >> > On 2/18/07, Alexander Varakin < avarakin(a)optonline.net
> >> >> > <mailto:avarakin@optonline.net>> wrote:
> >> >> > > As far as I know this syntax is new and is available
in
> SVN
> >> >> > only, you
> >> >> > > will have to wait till 3.1 is released or take source
from
> >> SVN
> >> >> > and build it.
> >> >> > >
> >> >> > > Bill Zhang wrote:
> >> >> > > > Hi Steven,
> >> >> > > >
> >> >> > > > Thank you very much for your help. Really
appreciate.
> >> >> > > >
> >> >> > > > I still got the same error, Unexpected token
'|'. I
> did not
> >> >> > see "|" in
> >> >> > > > the document, only saw "||", which is
supposed to be
> >> used with
> >> >> > > > columns.
> >> >> > > >
> >> >> > > > Ye
> >> >> > > >
> >> >> > > > On 2/18/07, Steven Williams <
> >> stevenw(a)objectconsulting.com.au
> >> >> > <mailto:stevenw@objectconsulting.com.au>> wrote:
> >> >> > > >> Hi Bill,
> >> >> > > >>
> >> >> > > >> I think it should be:
> >> >> > > >>
> >> >> > > >> $a : Person(age > 35 | < 25, zipCode
== 23546 | ==
> 68590)
> >> >> > > >>
> >> >> > > >> Edson, Mark or Michael can probably confirm
or
> correct the
> >> >> > above syntax.
> >> >> > > >>
> >> >> > > >> Make sure you are running of the latest
trunk.
> >> >> > > >>
> >> >> > > >> cheers
> >> >> > > >> Steve
> >> >> > > >>
> >> >> > > >>
> >> >> > > >> On 2/18/07, Bill Zhang
<billzhang2006(a)gmail.com
> >> >> > <mailto:billzhang2006@gmail.com>> wrote:
> >> >> > > >> >
> >> >> > > >> > I tried:
> >> >> > > >> >
> >> >> > > >> > $a : Person(age > 35 || age < 25,
zipCode == 23546
> || ==
> >> >> 68590)
> >> >> > > >> >
> >> >> > > >> > Errors:
> >> >> > > >> > org.drools.rule.InvalidRulePackage :
unknown:39:30
> >> >> > > >> Unexpected token '||'
> >> >> > > >> > unknown:39:40 mismatched token:
> >> >> > > >>
[@246,1040:1041='<=',<47>,39:40];
> >> >> > > >> > expecting type '('
> >> >> > > >> > unknown:39:92 mismatched token:
> >> >> > > >>
[@258,1092:1092='<',<46>,39:92];
> >> >> > > >> > expecting type '('
> >> >> > > >> >
> >> >> > > >> > I also tried
> >> >> > > >> >
> >> >> > > >> > $a : Person(age > 35 | age < 25,
zipCode == 23546
> | ==
> >> >> 68590)
> >> >> > > >> >
> >> >> > > >> > Pretty much the same error.
> >> >> > > >> >
> >> >> > > >> > Based on the document, "||"
is only valid for
> columns...
> >> >> > > >> >
> >> >> > > >> >
> >> >> > > >> > On 2/17/07, Bill Zhang
<billzhang2006(a)gmail.com
> >> >> > <mailto:billzhang2006@gmail.com>> wrote:
> >> >> > > >> > > Thank you Steve. But I got syntax
error using the
> >> >> following.
> >> >> > > >> > >
> >> >> > > >> > > On 2/17/07, Steven Williams
> >> >> > <stevenw(a)objectconsulting.com.au
> >> >> > <mailto:stevenw@objectconsulting.com.au>> wrote:
> >> >> > > >> > > > In trunk I think you can use
connective
> constraints:
> >> >> > > >> > > >
> >> >> > > >> > > > $a : Person(age > 35 |
< 25, zipCode == 23546
> | ==
> >> >> 68590)
> >> >> > > >> > > > then
> >> >> > > >> > > >
$a.setStatus("KT");
> >> >> > > >> > > >
> >> >> > > >> > > >
> >> >> > > >> > > >
> >> >> > > >> > > >
> >> >> > > >> > > > On 2/18/07, Bill Zhang <
billzhang2006(a)gmail.com
> >> >> > <mailto:billzhang2006@gmail.com>> wrote:
> >> >> > > >> > > > >
> >> >> > > >> > > > > Hello,
> >> >> > > >> > > > >
> >> >> > > >> > > > > I am a new Drools user
trying to convert the
> >> >> > following simple
> >> >> > > >> logic
> >> >> > > >> into
> >> >> > > >> > > > DRL:
> >> >> > > >> > > > >
> >> >> > > >> > > > > IF (Person.Age > 35
OR Person.Age < 25) AND
> >> >> > (Person.ZipCode =
> >> >> > > >> 23546
> >> >> > > >> or
> >> >> > > >> > > > > Person.ZipCode = 68590)
> >> >> > > >> > > > > THEN
> >> >> > > >> > > > > Person.Status =
"KT";
> >> >> > > >> > > > >
> >> >> > > >> > > > > I found that it is not
easy to convert the
> above
> >> >> > logic into
> >> >> > > >> ONE DRL
> >> >> > > >> rule.
> >> >> > > >> > > > >
> >> >> > > >> > > > > I tried something like
this
> >> >> > > >> > > > >
> >> >> > > >> > > > > when
> >> >> > > >> > > > > $a: Person(age>35) or
Person (age<25)
> >> >> > > >> > > > > $b:
Person(Zipcode==23456) or Person
> (ZipCode ==
> >> >> 68590)
> >> >> > > >> > > > > $c: $a and $b
> >> >> > > >> > > > > Then
> >> >> > > >> > > > >
$c.setStatus("KT")
> >> >> > > >> > > > >
> >> >> > > >> > > > > But looks like I can not
use
> >> >> > > >> > > > > $c: $a and $b
> >> >> > > >> > > > > becaue in Drools, you
can only bind variable to
> >> >> > column, not
> >> >> > > >> to other
> >> >> > > >> > > > varaibles.
> >> >> > > >> > > > >
> >> >> > > >> > > > > Please advise how to do
this. I would
> imagine this
> >> >> > should be
> >> >> > > >> quite
> >> >> > > >> > > > > simple, maybe I missed
something quite obvious.
> >> >> > > >> > > > >
> >> >> > > >> > > > > I know that I can write
custom Java method
> to do
> >> >> > this, but if
> >> >> > > >> I do
> >> >> > > >> > > > > that, I suppose I lose
the power of RETEOO
> pattern
> >> >> > matching
> >> >> > > >> (pattern
> >> >> > > >> > > > resuing,
> >> >> > > >> > > > > etc.). So I prefer not
to do that.
> >> >> > > >> > > > >
> >> >> > > >> > > > > I also understand I can
break the above logic
> >> into 4
> >> >> > rules
> >> >> > > >> and that
> >> >> > > >> > > > > would be quite easy, but
our business user
> is not
> >> >> used to
> >> >> > > >> think in
> >> >> > > >> > > > > that way. Also, we have
more complex logic than
> >> the
> >> >> > above. So
> >> >> > > >> what I
> >> >> > > >> > > > > want is to see if there
is a way to convert
> this
> >> >> > > >> > > > > kind of logic in ONE DRL
rule.
> >> >> > > >> > > > >
> >> >> > > >> > > > > Thanks in advance.
> >> >> > > >> > > > >
> >> >> > > >> > > > > Bill
> >> >> > > >> > > > >
_______________________________________________
> >> >> > > >> > > > > rules-users mailing
list
> >> >> > > >> > > > >
rules-users(a)lists.jboss.org
> >> >> > <mailto:rules-users@lists.jboss.org>
> >> >> > > >> > > > >
> >> >> > > >>
https://lists.jboss.org/mailman/listinfo/rules-users
> >> >> > > >> > > > >
> >> >> > > >> > > >
> >> >> > > >> > > >
> >> >> > > >> > > >
> >> >> > > >> > > > --
> >> >> > > >> > > > Steven Williams
> >> >> > > >> > > >
> >> >> > > >> > > > Supervising Consultant
> >> >> > > >> > > >
> >> >> > > >> > > > Object Consulting
> >> >> > > >> > > > Office: 8615 4500 Mob: 0439
898 668 Fax: 8615
> 4501
> >> >> > > >> > > >
stevenw(a)objectconsulting.com.au
> >> >> > <mailto:stevenw@objectconsulting.com.au>
> >> >> > > >> > > >
www.objectconsulting.com.au
> >> >> > <
http://www.objectconsulting.com.au>
> >> >> > > >> > > >
> >> >> > > >> > > > consulting | development |
training | support
> >> >> > > >> > > > our experience makes the
difference
> >> >> > > >> > > >
_______________________________________________
> >> >> > > >> > > > rules-users mailing list
> >> >> > > >> > > > rules-users(a)lists.jboss.org
> >> >> > <mailto:rules-users@lists.jboss.org>
> >> >> > > >> > > >
>
https://lists.jboss.org/mailman/listinfo/rules-users
> >> >> > > >> > > >
> >> >> > > >> > > >
> >> >> > > >> > >
> >> >> > > >> >
_______________________________________________
> >> >> > > >> > rules-users mailing list
> >> >> > > >> > rules-users(a)lists.jboss.org
> >> >> > <mailto:rules-users@lists.jboss.org>
> >> >> > > >> >
https://lists.jboss.org/mailman/listinfo/rules-users
> >> >> > > >> >
> >> >> > > >>
> >> >> > > >>
> >> >> > > >>
> >> >> > > >> --
> >> >> > > >> Steven Williams
> >> >> > > >>
> >> >> > > >> Supervising Consultant
> >> >> > > >>
> >> >> > > >> Object Consulting
> >> >> > > >> Office: 8615 4500 Mob: 0439 898 668 Fax:
8615 4501
> >> >> > > >> stevenw(a)objectconsulting.com.au
> >> >> > <mailto:stevenw@objectconsulting.com.au>
> >> >> > > >>
www.objectconsulting.com.au
> >> >> <
http://www.objectconsulting.com.au>
> >> >> > > >>
> >> >> > > >> consulting | development | training |
support
> >> >> > > >> our experience makes the difference
> >> >> > > >>
_______________________________________________
> >> >> > > >> rules-users mailing list
> >> >> > > >> rules-users(a)lists.jboss.org
> >> >> <mailto:rules-users@lists.jboss.org>
> >> >> > > >>
https://lists.jboss.org/mailman/listinfo/rules-users
> >> >> > > >>
> >> >> > > >>
> >> >> > > > _______________________________________________
> >> >> > > > rules-users mailing list
> >> >> > > > rules-users(a)lists.jboss.org
> >> >> <mailto:rules-users@lists.jboss.org>
> >> >> > > >
https://lists.jboss.org/mailman/listinfo/rules-users
> >> >> >
<
https://lists.jboss.org/mailman/listinfo/rules-users>
> >> >> > > >
> >> >> > >
> >> >> > > _______________________________________________
> >> >> > > rules-users mailing list
> >> >> > > rules-users(a)lists.jboss.org
> >> <mailto:rules-users@lists.jboss.org>
> >> >> > >
https://lists.jboss.org/mailman/listinfo/rules-users
> >> >> > >
> >> >> > _______________________________________________
> >> >> > rules-users mailing list
> >> >> > rules-users(a)lists.jboss.org
> >> <mailto:rules-users@lists.jboss.org>
> >> >> >
https://lists.jboss.org/mailman/listinfo/rules-users
> >> >> >
> >> >> >
> >> >> >
> >> >> >
> >> >> > --
> >> >> > Steven Williams
> >> >> >
> >> >> > Supervising Consultant
> >> >> >
> >> >> > Object Consulting
> >> >> > Office: 8615 4500 Mob: 0439 898 668 Fax: 8615 4501
> >> >> > stevenw(a)objectconsulting.com.au
> >> >> <mailto:stevenw@objectconsulting.com.au>
> >> >> >
www.objectconsulting.com.au
<
http://www.objectconsulting.com.au>
> >> >> >
> >> >> > consulting | development | training | support
> >> >> > our experience makes the difference
> >> >> >
> >> >>
> >>
> ------------------------------------------------------------------------
> >> >> >
> >> >> > _______________________________________________
> >> >> > rules-users mailing list
> >> >> > rules-users(a)lists.jboss.org
> >> >> >
https://lists.jboss.org/mailman/listinfo/rules-users
> >> >> >
> >> >>
> >> >> _______________________________________________
> >> >> rules-users mailing list
> >> >> rules-users(a)lists.jboss.org
> >> >>
https://lists.jboss.org/mailman/listinfo/rules-users
> >> >>
> >> > _______________________________________________
> >> > rules-users mailing list
> >> > rules-users(a)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
> >>
> >>
> >> _______________________________________________
> >> rules-users mailing list
> >> rules-users(a)lists.jboss.org
> >>
https://lists.jboss.org/mailman/listinfo/rules-users
> >>
> > _______________________________________________
> > rules-users mailing list
> > rules-users(a)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
>
>
> _______________________________________________
> rules-users mailing list
> rules-users(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/rules-users
>
_______________________________________________
rules-users mailing list
rules-users(a)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 @