"Polymorphic bindings" are not supported, the fact that it's not
reported at compilation time,
but only throws an exception at runtime, is a bad bug (I'll open a ticket)

This said, you can split your rule in two rules - which is what Drools
would do anyway:

rule r1 when $x : Foo() then .. end
rule r2 when $x : Bar() then .. end

I'd also encourage you to follow java conventions, using capital letters
for declared types.

And there may be various alternatives to "describe why a rule fired",
both in and out the RHS of a rule.
To cite some, using AgendaEventListeners or "drools.getActivation()" in
the RHS.
Davide


On 06/04/2013 05:12 PM, bdolbeare wrote:
> We have a need to support binds for conditional or elements so that we can
> describe why a rule fired in the then clause of a rule.  The following DRL
> is a simple example of what we are trying to do.  There are two versions of
> our rule in the DRL:
>
> *rule "WORKING:  find with or"*:  works but only because the first variable
> we try to bind in the or expression is of type "target" which is a super
> class of the other elements in the or expression.  
>
> *rule "BROKEN:  find with or"*:  causes a class cast exception when the
> "bar" pattern is matched because the then clause tries to store the bar
> object in handle "x" which it thinks is of type "foo".  
>
> Is there a way to define the object type for the bind variable?  
>
> Is there any other way to make something like this work?
>  
>
>
> package tests
>
> import org.apache.log4j.Logger;
>
> global Logger log
>
> declare target
>       notreal : boolean 
> end
>
> declare foo extends target
>       foovalue : String
> end
>
> declare bar extends target
>       barvalue : String
> end  
>
> rule "insertdata"
>       when
>       then
>               insert(new foo(false, "a"));            
>               insert(new bar(false, "b"));            
> end
>
> rule "WORKING:  find with or"
>       when
>       ( or x: target(notreal) 
>       x: foo(foovalue == "a") 
>       x: bar(barvalue == "b")
>       )
>       then
>               log.info("i found object: " + x);
> end
>
> rule "BROKEN:  find with or"
>       when
>       ( or
>       x: foo(foovalue == "a") 
>       x: bar(barvalue == "b")
>       )
>       then
>               log.info("i found object: " + x);
> end
>
>
>
> Exception executing consequence for rule "find with or" in tests:
> java.lang.ClassCastException: tests.bar cannot be cast to tests.foo
>       at
> org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)
>       at 
> org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1283)
>       at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1209)
>       at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1442)
>       at
> org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:710)
>       at
> org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:674)
>       at
> org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:230)
>       at
> org.drools.impl.StatelessKnowledgeSessionImpl.execute(StatelessKnowledgeSessionImpl.java:278)
>       at tests.DroolsTest.testStateless(DroolsTest.java:120)
>       at tests.DroolsTest.runTest(DroolsTest.java:74)
>       at tests.DroolsTest.main(DroolsTest.java:59)
> Caused by: java.lang.ClassCastException: tests.bar cannot be cast to
> tests.foo
>       at
> tests.Rule_find_with_or_411ee1c99de54340945b2b707ad0a576DefaultConsequenceInvoker.evaluate(Unknown
> Source)
>       at 
> org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1273)
>       ... 9 more
>
>
>
> --
> View this message in context: 
> http://drools.46999.n3.nabble.com/ClassCastException-due-to-binding-tp4024115.html
> Sent from the Drools: User forum mailing list archive at Nabble.com.
> _______________________________________________
> rules-users mailing list
> [email protected]
> https://lists.jboss.org/mailman/listinfo/rules-users
>

_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to