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

Przemysław Różycki P.Rozycki at amg.net.pl
Fri Jan 23 10:33:01 EST 2009


Yes, I did. This was the first thing I've checked.

Best regards,
Przemek

Jaroslaw Kijanowski pisze:
> Did you set the global on your session?
> 
> http://downloads.jboss.com/drools/docs/4.0.7.19894.GA/html_single/index.html#d0e948 
> 
> 
> Cheers
> 
> Przemysław Różycki wrote:
>> 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,
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
> 
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users




More information about the rules-users mailing list