The best option might very well be to insert the item objects as well and to write
$doc: Document(issued==true) $job: Job(type==JobType.VALIDATE, item == $doc) -W On 11 October 2011 15:10, hsherlock <citad...@gmail.com> wrote: > 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 [Document]" > when > $job: Job(type==JobType.VALIDATE) > eval(($job.item instanceof Document)) > $doc: Document(issued==true) from $job.item > then > insert(new DocumentAlreadyIssuedFact()); > end > > rule "process [SENDING] on [Message]" > when > $job: Job(type==JobType.SEND) > eval(($job.item instanceof Message)) > $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-tp3412518p3412518.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 >
_______________________________________________ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users