[rules-users] Using variables as map keys in MVEL in LHS
Steve Ronderos
steve.ronderos at ni.com
Thu Jul 16 16:39:47 EDT 2009
Thanks Edson, worked like a charm!
Steve Ronderos
rules-users-bounces at lists.jboss.org wrote on 07/16/2009 09:09:31 AM:
> [image removed]
>
> Re: [rules-users] Using variables as map keys in MVEL in LHS
>
> Edson Tirelli
>
> to:
>
> Rules Users List
>
> 07/16/2009 09:11 AM
>
> Sent by:
>
> rules-users-bounces at lists.jboss.org
>
> Please respond to Rules Users List
>
>
> 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.
>
> []s
> Edson
> 2009/7/16 Steve Ronderos <steve.ronderos at ni.com>
>
> Hello,
>
> Again, I'm working on converting my project that used Drools 4.0.7 to
5.0.1.
>
> 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.
>
> This is the rule (I removed all the other rules for this example)
> rule "Cart notification"
> salience 10
>
> when
> $p : Product( $productName : name)
> $c : Customer( cart[$productName] == $p)
> then
> System.out.println( "Customer " + $c.name + " has " + $p.name
> + " in cart");
> end
>
> I added the following to the Customer class:
>
> private Map<String,Product> cart = new HashMap<String, Product>();
> public Map<String, Product> getCart() {
> return cart;
> }
>
> and I modified the main method to be:
>
> public static final void main(String[] args) throws Exception {
> final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.
> newKnowledgeBuilder();
> kbuilder.add( ResourceFactory.newClassPathResource(
> "Shopping.drl", ShoppingExample.class ),
> ResourceType.DRL );
>
> final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
> kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
>
> final StatefulKnowledgeSession ksession =
> kbase.newStatefulKnowledgeSession();
>
> Customer mark = new Customer( "mark",
> 0 );
> ksession.insert( mark );
>
> Product shoes = new Product( "shoes",
> 60 );
> ksession.insert( shoes );
>
> mark.getCart().put("shoes", shoes);
>
> ksession.fireAllRules();
> }
>
> 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.
> What I would expect to happen is:
> the Product pattern would match the shoes Product that is inserted
> into the ksession, the $productName variable would contain the value
"shoes"
> 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
> The message should print
>
> What actually happens is an error message:
>
> Exception in thread "main" org.drools.RuntimeDroolsException:
> Exception executing predicate cart[$productName] == $p
> at org.drools.rule.PredicateConstraint.isAllowedCachedLeft(
> PredicateConstraint.java:302)
> at org.drools.common.SingleBetaConstraints.isAllowedCachedLeft(
> SingleBetaConstraints.java:138)
> at org.drools.reteoo.JoinNode.assertLeftTuple(JoinNode.java:114)
> at
> org.drools.reteoo.SingleLeftTupleSinkAdapter.doPropagateAssertLeftTuple(
> SingleLeftTupleSinkAdapter.java:117)
> at
>
org.drools.reteoo.SingleLeftTupleSinkAdapter.createAndPropagateAssertLeftTuple
> (SingleLeftTupleSinkAdapter.java:78)
> at org.drools.reteoo.LeftInputAdapterNode.assertObject(
> LeftInputAdapterNode.java:142)
> at
org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(
> SingleObjectSinkAdapter.java:42)
> at org.drools.reteoo.ObjectTypeNode.assertObject(
> ObjectTypeNode.java:185)
> at org.drools.reteoo.EntryPointNode.assertObject(
> EntryPointNode.java:146)
> at org.drools.common.AbstractWorkingMemory.insert(
> AbstractWorkingMemory.java:1046)
> at org.drools.common.AbstractWorkingMemory.insert(
> AbstractWorkingMemory.java:1001)
> at org.drools.common.AbstractWorkingMemory.insert(
> AbstractWorkingMemory.java:788)
> at org.drools.impl.StatefulKnowledgeSessionImpl.insert(
> StatefulKnowledgeSessionImpl.java:216)
> at
org.drools.examples.ShoppingExample.main(ShoppingExample.java:32)
> Caused by: [Error: unable to resolve method: java.util.HashMap.
> $productName() [arglength=0]]
> [Near : {... Unknown ....}]
> ^
> [Line: 1, Column: 0]
> at
> org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(
> ReflectiveAccessorOptimizer.java:906)
> at
>
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getBeanProperty(
> ReflectiveAccessorOptimizer.java:585)
> at
>
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(
> ReflectiveAccessorOptimizer.java:313)
> at
>
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(
> ReflectiveAccessorOptimizer.java:138)
> at
org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:133)
> at org.mvel2.compiler.ExecutableAccessor.getValue(
> ExecutableAccessor.java:37)
> at
>
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getCollectionProperty
> (ReflectiveAccessorOptimizer.java:633)
> at
>
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(
> ReflectiveAccessorOptimizer.java:319)
> at
>
org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(
> ReflectiveAccessorOptimizer.java:138)
> at
org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:133)
> at org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(
> BinaryOperation.java:102)
> at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85)
> at org.mvel2.compiler.CompiledExpression.getValue(
> CompiledExpression.java:104)
> at org.mvel2.MVEL.executeExpression(MVEL.java:978)
> at org.drools.base.mvel.MVELPredicateExpression.evaluate(
> MVELPredicateExpression.java:75)
> at org.drools.rule.PredicateConstraint.isAllowedCachedLeft(
> PredicateConstraint.java:295)
> ... 13 more
>
> Is this a bug in MVEL or Drools, or am I using the map access
incorrectly?
>
> Thanks,
>
> Steve Ronderos
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> http://lists.jboss.org/mailman/listinfo/rules-users
>
>
>
> --
> Edson Tirelli
> JBoss Drools Core Development
> JBoss by Red Hat @ www.jboss.com
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> http://lists.jboss.org/mailman/listinfo/rules-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20090716/c668878d/attachment.html
More information about the rules-users
mailing list