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

Edson Tirelli tirelli at post.com
Mon Jan 26 09:20:36 EST 2009


    Remember that the engine evaluates all your LHS CEs when you ASSERT the
facts, not when you FIRE the rules. So, you obviously need to set the global
before asserting your facts or you will get the nasty NPE that you saw.

    Pre rule tells you exactly that, because eval(true) is evaluated at
ASSERT time and activates the rule, but your System.out is only execute at
FIRE time, after your application set the global.

   []s
   Edson



2009/1/26 Przemysław Różycki <P.Rozycki at amg.net.pl>

> Of course, you can get rid of 'pre rule'. I forgot to delete it.
>
>
> Best regards,
> Przemek
>
> Przemysław Różycki pisze:
>
>> Hi,
>>
>> I mean, I checked the global and it was set.
>>
>> I'm attaching the code, that causes the problem (Java and DRL). You need
>> just to set a proper path to DRL file while setting file property in Java
>> file. I think, the global is set in proper way.
>> In DRL, depending which rule is commented/uncommented, the code works or
>> not.
>>
>> Best regards,
>> Przemek
>>
>> Jaroslaw Kijanowski pisze:
>>
>>> And did the stack trace change? Can you post more details (drl, java
>>> src)?
>>>
>>> Przemysław Różycki wrote:
>>>
>>>> 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
>>>>>
>>>>
>>>> _______________________________________________
>>>> 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
>>>
>>>  _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>



-- 
 Edson Tirelli
 JBoss Drools Core Development
 JBoss, a division of Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20090126/3a83c985/attachment.html 


More information about the rules-users mailing list