[rules-users] Getting facts from external source using 'from' and parametrized method call

Przemysław Różycki P.Rozycki at amg.net.pl
Wed Jan 21 06:42:58 EST 2009


Sorry for responsing myself, but I'm still working on it and found that 
when factSource is a fact, not global, the rule works very well. I mean, 
this rule works fine:

rule "My Rule"
   when
     $factSrc : FactSource(  )
     $fact : Fact(  ) from $factSrc.getSomeFacts("a","b","c")
   then
     // do something
end

so what's the difference between invocation on global object and 
invocation on fact object? Why the first one doesn't work and the second 
one works?

Best regards,
Przemek


Przemysław Różycki pisze:
> Hi,
> 
> could I ask for some advice, please, how to use a parametrized method 
> call to get some data using 'from' element in LHS.
> 
> To be more precise, I would like to do something like this:
> 
> rule "My Rule"
>   when
>     $fact : Fact(  ) from factSource.getSomeFacts("a","b","c")
>   then
>     // do something
> end
> 
> where factSource is for example some global and 
> getSomeFacts(String,String,String) is a parametrized method that returns 
> some array of Fact objects.
> 
> Unfortunately, when I try to launch the following rule I have an error:
> 
> Exception in thread "main" org.mvel.PropertyAccessException: unable to 
> resolve property: factSource.getSomeFacts("a","b","c")
>     at 
> org.mvel.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:295) 
> 
>     at 
> org.mvel.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(ReflectiveAccessorOptimizer.java:110) 
> 
>     at 
> org.mvel.ast.VariableDeepPropertyNode.getReducedValueAccelerated(VariableDeepPropertyNode.java:26) 
> 
>     at 
> org.mvel.ast.PropertyASTNode.initializePropertyNode(PropertyASTNode.java:70) 
> 
>     at 
> org.mvel.ast.PropertyASTNode.getReducedValueAccelerated(PropertyASTNode.java:24) 
> 
>     at org.mvel.MVELRuntime.execute(MVELRuntime.java:90)
>     at org.mvel.CompiledExpression.getValue(CompiledExpression.java:111)
>     at org.mvel.MVEL.executeExpression(MVEL.java:252)
>     at 
> org.drools.base.dataproviders.MVELDataProvider.getResults(MVELDataProvider.java:55) 
> 
>     at org.drools.reteoo.FromNode.assertTuple(FromNode.java:68)
>     at 
> org.drools.reteoo.SingleTupleSinkAdapter.createAndPropagateAssertTuple(SingleTupleSinkAdapter.java:55) 
> 
>     at 
> org.drools.reteoo.LeftInputAdapterNode.assertObject(LeftInputAdapterNode.java:116) 
> 
>     at 
> org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:22) 
> 
>     at 
> org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:162)
>     at org.drools.reteoo.Rete.assertObject(Rete.java:175)
>     at 
> org.drools.reteoo.ReteooRuleBase.assertObject(ReteooRuleBase.java:192)
>     at 
> org.drools.reteoo.ReteooWorkingMemory$WorkingMemoryReteAssertAction.execute(ReteooWorkingMemory.java:181) 
> 
>     at 
> org.drools.common.AbstractWorkingMemory.executeQueuedActions(AbstractWorkingMemory.java:1312) 
> 
>     at 
> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:915) 
> 
>     at 
> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:883) 
> 
>     at 
> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:684) 
> 
>     at com.sample.DroolsTest6.main(DroolsTest6.java:29)
> Caused by: java.lang.NullPointerException
>     at 
> org.mvel.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:530) 
> 
>     at 
> org.mvel.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:261) 
> 
>     ... 21 more
> 
> Documentation says:
> 
> "The from Conditional Element allows users to specify a source for 
> patterns to reason over. This allows the engine to reason over data not 
> in the Working Memory. This could be a sub-field on a bound variable or 
> the results of a method call."
> 
> so I assume that it is possible to do what I want. If not, could I ask 
> for an advice of some workaround, please?
> 
> Best regards,




More information about the rules-users mailing list