Which version of Drools are you using?

   Latest Drools versions changed the behavior of "from" to deal with it as
you mentioned. So it will not raise ClassCastException. Instead:

$doc: Document(...) from $job.item  // only matches if the returned item is
a Document

$msg: Message(...) from $job.item // only matches if the returned item is a
Message

   I think 5.2 was the first version released with this change, but need to
double check. For sure 5.3 works like that.

   Edson


2011/10/11 hsherlock <citad...@gmail.com>

> I have a following scenario in which a complex logic (distributed over
> multiple .DRL files) need to process incoming jobs as fast as possible. A
> job definition looks something like describing what to do (type), what to
> process (item) with some additional data supplied (args).
>
> enum JobType
> {
>        VALIDATE,
>        SEND
> }
>
> class Job
> {
>        String type;
>        Object item;
>        Object[] args;
> }
>
> In order to implement the processing I need to put the business logic into
> rules which fire depending on the kind of processing requested and type of
> the item passed:
>
> rule "process [VALIDATION] on [Document]"
>        when
>                $job: Job(type==JobType.VALIDATE)
>                $doc: Document(issued==true) from $job.item
>        then
>                insert(new DocumentAlreadyIssuedFact());
> end
>
> rule "process [SENDING] on [Message]"
>        when
>                $job: Job(type==JobType.SEND)
>                $msg: Message() from $job.item
>        then
>                //do the sending
> end
>
> Unfortunately this does not work and results in ClassCastException being
> thrown, because it looks that Drools tries to cast any passed item to the
> class expected by the particular rule. In my opinion behaviour one can
> expect from Drools here is to first match the item class to the one
> expected
> by the rule and on success to perform the type casting.
> Is it a Drools bug or a missing feature?
>
> So after stidying the documention and example code I found only one way to
> workaround this – by using eval and instanceof which should have its
> performance implications due to extensive use of the eval.
>
> rule "process [VALIDATION] on [Message]"
>        when
>                $job: Job(type==”validate”)
>                $msg: Message() from $job.item
>        then
>                //do the validation
> end
>
> rule "process [SENDING] on [Message]"
>        when
>                $job: Job(type==”send”)
>                $msg: Message() from $job.item
>        then
>                //do the sending
> end
>
> Such an implementation works, but I see it as some form of workaround as my
> feeling is that it will not allow the optimizations of Drools to shine.
>
> Please recommend more effective and elegant way of implementing this.
>
> Thank you in advance
>
> --
> View this message in context:
> http://drools.46999.n3.nabble.com/Typecasting-problem-tp3412494p3412494.html
> Sent from the Drools: User forum mailing list archive at Nabble.com.
>
> _______________________________________________
> rules-users mailing list
> rules-users@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@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to