<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">&lt;<a href="mailto:steve.ronderos@ni.com">steve.ronderos@ni.com</a>&gt;</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&#39;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&#39;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&#39;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> &quot;Cart notification&quot;</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(
&quot;Customer &quot; + $<a href="http://c.name" target="_blank">c.name</a> + &quot; has &quot; + $<a href="http://p.name" target="_blank">p.name</a> + &quot;
in cart&quot;);</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&lt;String,Product&gt;
cart = <b>new</b> HashMap&lt;String, Product&gt;();</font>
<br><font face="Courier New" size="2"><b>public</b> Map&lt;String, Product&gt;
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>(
&quot;Shopping.drl&quot;, 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( &quot;mark&quot;,</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( &quot;shoes&quot;,</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(&quot;shoes&quot;,
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 &quot;shoes&quot;</font>
<br><font face="sans-serif" size="2">  the Customer fact, mark, would
be matched with the second pattern in the rule because cart[&quot;shoes&quot;]
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 &quot;main&quot;
<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>