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@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@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

_______________________________________________
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

_______________________________________________
rules-users mailing list
rules-users@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