Ah, I thought the LHS was parsed into mvel by default. OK, my bad.
--- On Sun, 3/1/09, Edson Tirelli <tirelli(a)post.com> wrote:
From: Edson Tirelli <tirelli(a)post.com>
Subject: Re: [rules-users] Creating objects in WHEN clause
To: greg_barton(a)yahoo.com
Date: Sunday, March 1, 2009, 6:19 PM
Hold on. :) We are talking about Drools, not java.
When you write a pattern:
SomeClass( foo < $otherFoo )
Drools will use its own implementation of
"<" to make the comparison. It
does not delegate that to java and so it must work. If does
not work, it may
be a bug, but our tests work for that:
http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-core/src...
Take a look at testObject().
[]s
Edson
2009/3/1 Greg Barton <greg_barton(a)yahoo.com>
> Oh, you dun thrown down the gauntlet now. :)
>
> The following will not compile with java6:
>
> public class ComparableFu {
>
> static class Foo implements
Comparable<Foo> {
>
> private int foo;
>
> public Foo(int foo) {
> this.foo = foo;
> }
>
> public int compareTo(Foo other) {
> if(other.foo < foo) {
> return -1;
> } else if(other.foo == foo) {
> return 0;
> } else {
> return 1;
> }
> }
> }
>
> public static void main(String[] args) {
> System.out.println(new Foo(1) < new
Foo(2)); //Baaaaad!
> }
> }
>
> Methinks the overloading of comparison operators for
Comparables is an mvel
> feature.
>
> --- On Sun, 3/1/09, Edson Tirelli
<tirelli(a)post.com> wrote:
>
> > From: Edson Tirelli <tirelli(a)post.com>
> > Subject: Re: [rules-users] Creating objects in
WHEN clause
> > To: greg_barton(a)yahoo.com, "Rules Users
List" <
> rules-users(a)lists.jboss.org>
> > Date: Sunday, March 1, 2009, 12:46 PM
> > Just a comment:
> >
> > "There is no operator overloading in java,
so the
> > "<" operator must act on a
> > numerical primitive. (int, double, etc.) "
> >
> > This is not true. Comparison operators will
work on any
> > "comparable"
> > type. So if Quantity implements Comparable
interface, it
> > must work.
> > Otherwise it is a bug.
> >
> > Although, remember that Drools always makes
type
> > coercion from the right
> > to the left value, so, for that to actually work:
> >
> > Person( height < $2m )
> >
> > "height" must be comparable to $2m.
> >
> > []s
> > Edson
> >
> >
> > 2009/2/26 Greg Barton
<greg_barton(a)yahoo.com>
> >
> > > The problem is the "Person( height <
$2m
> > )" part. There is no operator
> > > overloading in java, so the "<"
operator
> > must act on a numerical primitive.
> > > (int, double, etc.) $2m is a Quantity. As
for why
> > this doesn't error out,
> > > I'm not sure, but it certainly won't
execute.
> > (Unless mvel has some
> > > capabilities I'm not aware of.)
> > >
> > > Try
> > >
> > > Person( height < $2m.height )
> > >
> > > ...as long as Person.height and
Quantity.height are
> > both numerical types.
> > >
> > > If you want to specifically call compareTo()
you
> > should use an eval block:
> > >
> > > WHEN
> > > $meter:UoM( ) from
> > UoMs.get("length","m")
> > > $2m:Quantity() from
Quantities.get(2,$meter)
> > > $p: Person()
> > > eval($p.getHeight().compareTo($2m))
> > >
> > > However, even if this works, I hope
you're not
> > going to be putting too much
> > > data through rules like this. The way
it's
> > currently constructed it
> > > completely circumvents all of drools'
indexing
> > ability. :) The power of
> > > rules comes from tracking the changes in a
set of
> > objects, and firing rules
> > > based on only the changes observed. (That
set is the
> > working memory.) The
> > > "from" keyword allows you to have
rules that
> > draw objects from outside
> > > working memory, but you pay for that
convenience: the
> > cost is not being able
> > > to track changes. As a result, objects
gathered using
> > "from" must be
> > > reconsidered even if they haven't
changed (i.e.
> > every time the condition is
> > > encountered) because drools has no way of
knowing if
> > they've changed or not.
> > >
> > > So, after this long winded spiel, here's
my
> > suggestion: get the rule(s) to
> > > work using "from" but also try
inserting the
> > Quantity object in working
> > > memory. If you're processing enough
data with the
> > rules you will notice a
> > > difference.
> > >
> > > --- On Thu, 2/26/09, David Boaz
> > <davidb(a)dbmotion.com> wrote:
> > >
> > > > From: David Boaz
<davidb(a)dbmotion.com>
> > > > Subject: Re: [rules-users] Creating
objects in
> > WHEN clause
> > > > To: rules-users(a)lists.jboss.org
> > > > Date: Thursday, February 26, 2009, 9:13
AM
> > > > Thanks for your all help.
> > > > with your help, my rule looks now as:
> > > > WHEN $meter:UoM( ) from
> > > >
UoMs.get("length","m")
> > > > $2m:Quantity() from
> > Quantities.get(2,$meter)
> > > > Person( height < $2m )
> > > >
> > > > My Quantity class implements Comparable
> > interface. When
> > > > running the rule on
> > > > a good dataset (where I expect the rule
to fire),
> > the rule
> > > > fails with no
> > > > error. in addition, the
compareTo(Object o)
> > method is not
> > > > called (the
> > > > debugger doesn't stop in this
method).
> > > >
> > > > Can you please help?
> > > > Thanks, David
> > >
> > >
> > >
> > >
_______________________________________________
> > > rules-users mailing list
> > > rules-users(a)lists.jboss.org
> > >
https://lists.jboss.org/mailman/listinfo/rules-users
> > >
> >
> >
> >
> > --
> > Edson Tirelli
> > JBoss Drools Core Development
> > JBoss, a division of Red Hat @
www.jboss.com
>
>
>
>
--
Edson Tirelli
JBoss Drools Core Development
JBoss, a division of Red Hat @
www.jboss.com