<br> This was a bug in one of the MVEL versions that is fixed. Can you update your MVEL jar to one of the latest releases? I think it is 2.0.12.<br><br> []s<br> Edson<br><br><div class="gmail_quote">2009/7/16 Steve Ronderos <span dir="ltr"><<a href="mailto:steve.ronderos@ni.com">steve.ronderos@ni.com</a>></span><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br><font face="sans-serif" size="2">Hello,</font>
<br>
<br><font face="sans-serif" size="2">Again, I'm working on converting my
project that used Drools 4.0.7 to 5.0.1.</font>
<br>
<br><font face="sans-serif" size="2">I've run across a problem with a rule
that accesses a map in the LHS using a variable as the key. When
MVEL tries to resolve this, it appears that it is not evaluating the variable
before accessing the map. I've modified the Shopping example from
the Drools 5.0.1 Examples to recreate the issue in a simpler setting.</font>
<br>
<br><font face="sans-serif" size="2">This is the rule (I removed all the
other rules for this example)</font>
<br><font face="Courier New" size="2"><b>rule</b> "Cart notification"</font>
<br><font face="Courier New" size="2"> <b>salience</b> 10</font>
<br>
<br><font face="Courier New" size="2"> <b>when</b></font>
<br><font face="Courier New" size="2"> $p : Product(
$productName : name)</font>
<br><font face="Courier New" size="2"> $c : Customer(
cart[$productName] == $p) </font>
<br><font face="Courier New" size="2"> <b>then</b></font>
<br><font face="Courier New" size="2"> System.out.println(
"Customer " + $<a href="http://c.name" target="_blank">c.name</a> + " has " + $<a href="http://p.name" target="_blank">p.name</a> + "
in cart");</font>
<br><font face="Courier New" size="2"><b>end</b> </font>
<br>
<br><font face="sans-serif" size="2">I added the following to the Customer
class:</font>
<br>
<br><font face="Courier New" size="2"><b>private</b> Map<String,Product>
cart = <b>new</b> HashMap<String, Product>();</font>
<br><font face="Courier New" size="2"><b>public</b> Map<String, Product>
getCart() {</font>
<br><font face="Courier New" size="2"> <b>return</b> cart;</font>
<br><font face="Courier New" size="2">}</font>
<br>
<br><font face="Courier New" size="2">and I modified the main method to be:</font>
<br>
<br><font face="Courier New" size="2"><b>public</b> <b>static</b> <b>final</b>
<b>void</b> main(String[] args) <b>throws</b> Exception {</font>
<br><font face="Courier New" size="2"> <b>final</b> KnowledgeBuilder
kbuilder = KnowledgeBuilderFactory.<i>newKnowledgeBuilder</i>();</font>
<br><font face="Courier New" size="2"> kbuilder.add( ResourceFactory.<i>newClassPathResource</i>(
"Shopping.drl", ShoppingExample.<b>class</b> ),</font>
<br><font face="Courier New" size="2">
ResourceType.<i>DRL</i>
);</font>
<br>
<br><font face="Courier New" size="2"> <b>final</b> KnowledgeBase
kbase = KnowledgeBaseFactory.<i>newKnowledgeBase</i>();</font>
<br><font face="Courier New" size="2"> kbase.addKnowledgePackages(
kbuilder.getKnowledgePackages() );</font>
<br>
<br><font face="Courier New" size="2"> <b>final</b> StatefulKnowledgeSession
ksession = kbase.newStatefulKnowledgeSession();</font>
<br>
<br><font face="Courier New" size="2"> Customer mark = <b>new</b>
Customer( "mark",</font>
<br><font face="Courier New" size="2">
0 );</font>
<br><font face="Courier New" size="2"> ksession.insert( mark
);</font>
<br>
<br><font face="Courier New" size="2"> Product shoes = <b>new</b>
Product( "shoes",</font>
<br><font face="Courier New" size="2">
60 );</font>
<br><font face="Courier New" size="2"> ksession.insert( shoes
);</font>
<br><font face="Courier New" size="2"> </font>
<br><font face="Courier New" size="2"> mark.getCart().put("shoes",
shoes);</font>
<br><font face="Courier New" size="2"> </font>
<br><font face="Courier New" size="2"> <u>ksession</u>.fireAllRules();</font>
<br><font face="Courier New" size="2">}</font>
<br>
<br><font face="sans-serif" size="2">So basically, I added a map to Customer,
inserted one item and made a rule that will use a variable as a key for
that map. </font>
<br><font face="sans-serif" size="2">What I would expect to happen is:</font>
<br><font face="sans-serif" size="2"> the Product pattern would match
the shoes Product that is inserted into the ksession, the $productName
variable would contain the value "shoes"</font>
<br><font face="sans-serif" size="2"> the Customer fact, mark, would
be matched with the second pattern in the rule because cart["shoes"]
should resolve to the shoes fact which is $p in the rule</font>
<br><font face="sans-serif" size="2"> The message should print</font>
<br>
<br><font face="sans-serif" size="2">What actually happens is an error message:</font>
<br>
<br><font face="Courier New" size="2">Exception in thread "main"
<u>org.drools.RuntimeDroolsException</u>: Exception executing predicate
cart[$productName] == $p</font>
<br><font face="Courier New" size="2"> at
org.drools.rule.PredicateConstraint.isAllowedCachedLeft(<u>PredicateConstraint.java:302</u>)</font>
<br><font face="Courier New" size="2"> at
org.drools.common.SingleBetaConstraints.isAllowedCachedLeft(<u>SingleBetaConstraints.java:138</u>)</font>
<br><font face="Courier New" size="2"> at
org.drools.reteoo.JoinNode.assertLeftTuple(<u>JoinNode.java:114</u>)</font>
<br><font face="Courier New" size="2"> at
org.drools.reteoo.SingleLeftTupleSinkAdapter.doPropagateAssertLeftTuple(<u>SingleLeftTupleSinkAdapter.java:117</u>)</font>
<br><font face="Courier New" size="2"> at
org.drools.reteoo.SingleLeftTupleSinkAdapter.createAndPropagateAssertLeftTuple(<u>SingleLeftTupleSinkAdapter.java:78</u>)</font>
<br><font face="Courier New" size="2"> at
org.drools.reteoo.LeftInputAdapterNode.assertObject(<u>LeftInputAdapterNode.java:142</u>)</font>
<br><font face="Courier New" size="2"> at
org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(<u>SingleObjectSinkAdapter.java:42</u>)</font>
<br><font face="Courier New" size="2"> at
org.drools.reteoo.ObjectTypeNode.assertObject(<u>ObjectTypeNode.java:185</u>)</font>
<br><font face="Courier New" size="2"> at
org.drools.reteoo.EntryPointNode.assertObject(<u>EntryPointNode.java:146</u>)</font>
<br><font face="Courier New" size="2"> at
org.drools.common.AbstractWorkingMemory.insert(<u>AbstractWorkingMemory.java:1046</u>)</font>
<br><font face="Courier New" size="2"> at
org.drools.common.AbstractWorkingMemory.insert(<u>AbstractWorkingMemory.java:1001</u>)</font>
<br><font face="Courier New" size="2"> at
org.drools.common.AbstractWorkingMemory.insert(<u>AbstractWorkingMemory.java:788</u>)</font>
<br><font face="Courier New" size="2"> at
org.drools.impl.StatefulKnowledgeSessionImpl.insert(<u>StatefulKnowledgeSessionImpl.java:216</u>)</font>
<br><font face="Courier New" size="2"> at
org.drools.examples.ShoppingExample.main(<u>ShoppingExample.java:32</u>)</font>
<br><font face="Courier New" size="2">Caused by: [Error: unable to resolve
method: java.util.HashMap.$productName() [arglength=0]]</font>
<br><font face="Courier New" size="2">[Near : {... Unknown ....}]</font>
<br><font face="Courier New" size="2">
^</font>
<br><font face="Courier New" size="2">[Line: 1, Column: 0]</font>
<br><font face="Courier New" size="2"> at
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(<u>ReflectiveAccessorOptimizer.java:906</u>)</font>
<br><font face="Courier New" size="2"> at
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getBeanProperty(<u>ReflectiveAccessorOptimizer.java:585</u>)</font>
<br><font face="Courier New" size="2"> at
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(<u>ReflectiveAccessorOptimizer.java:313</u>)</font>
<br><font face="Courier New" size="2"> at
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(<u>ReflectiveAccessorOptimizer.java:138</u>)</font>
<br><font face="Courier New" size="2"> at
org.mvel2.ast.ASTNode.getReducedValueAccelerated(<u>ASTNode.java:133</u>)</font>
<br><font face="Courier New" size="2"> at
org.mvel2.compiler.ExecutableAccessor.getValue(<u>ExecutableAccessor.java:37</u>)</font>
<br><font face="Courier New" size="2"> at
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getCollectionProperty(<u>ReflectiveAccessorOptimizer.java:633</u>)</font>
<br><font face="Courier New" size="2"> at
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(<u>ReflectiveAccessorOptimizer.java:319</u>)</font>
<br><font face="Courier New" size="2"> at
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(<u>ReflectiveAccessorOptimizer.java:138</u>)</font>
<br><font face="Courier New" size="2"> at
org.mvel2.ast.ASTNode.getReducedValueAccelerated(<u>ASTNode.java:133</u>)</font>
<br><font face="Courier New" size="2"> at
org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(<u>BinaryOperation.java:102</u>)</font>
<br><font face="Courier New" size="2"> at
org.mvel2.MVELRuntime.execute(<u>MVELRuntime.java:85</u>)</font>
<br><font face="Courier New" size="2"> at
org.mvel2.compiler.CompiledExpression.getValue(<u>CompiledExpression.java:104</u>)</font>
<br><font face="Courier New" size="2"> at
org.mvel2.MVEL.executeExpression(<u>MVEL.java:978</u>)</font>
<br><font face="Courier New" size="2"> at
org.drools.base.mvel.MVELPredicateExpression.evaluate(<u>MVELPredicateExpression.java:75</u>)</font>
<br><font face="Courier New" size="2"> at
org.drools.rule.PredicateConstraint.isAllowedCachedLeft(<u>PredicateConstraint.java:295</u>)</font>
<br><font face="Courier New" size="2"> ...
13 more</font>
<br>
<br><font face="sans-serif" size="2">Is this a bug in MVEL or Drools, or
am I using the map access incorrectly?</font>
<br>
<br><font face="sans-serif" size="2">Thanks,</font>
<br><font color="#888888"><font face="sans-serif" size="2"><br>
</font><font size="3">Steve Ronderos</font></font><br>_______________________________________________<br>
rules-users mailing list<br>
<a href="mailto:rules-users@lists.jboss.org">rules-users@lists.jboss.org</a><br>
<a href="http://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">http://lists.jboss.org/mailman/listinfo/rules-users</a><br>
<br></blockquote></div><br><br clear="all"><br>-- <br> Edson Tirelli<br> JBoss Drools Core Development<br> JBoss by Red Hat @ <a href="http://www.jboss.com">www.jboss.com</a><br>