Uploaded image for project: 'Drools'
  1. Drools
  2. DROOLS-178

NoSuchMethodError at runtime due to eval in query (BW chaining)

    XMLWordPrintable

Details

    • Bug
    • Resolution: Done
    • Critical
    • 5.5.1.Final, 6.0.0.Final
    • 5.5.0.Final
    • None
    • None
    • Hide

      Compile and start session from KB.

      rule "kickoff"
      salience 100
      when
      then
      for( Integer i: new Integer[]

      {3,4,5,12,13 }

      )

      { insert( i ); }

      end

      rule "find triple forward"
      when
      Integer( $a: intValue )
      Integer( $b: intValue > $a )
      Integer( $c: intValue > $b )
      eval( $a*$a + $b*$b == $c*$c )
      then
      System.out.println( "fwd: " + $a + " " + $b + " " + $c );
      end

      query isTriple( Integer $a, Integer $b, Integer $c )
      Integer( intValue == $a )
      Integer( intValue == $b && > $a )
      Integer( intValue == $c && > $b )
      eval( $a*$a + $b*$b == $c*$c )
      end

      rule "find triple backward"
      when
      isTriple( $a, $b, $c; )
      then
      System.out.println( "bwd: " + $a + " " + $b + " " + $c );
      end

      Show
      Compile and start session from KB. rule "kickoff" salience 100 when then for( Integer i: new Integer[] {3,4,5,12,13 } ) { insert( i ); } end rule "find triple forward" when Integer( $a: intValue ) Integer( $b: intValue > $a ) Integer( $c: intValue > $b ) eval( $a*$a + $b*$b == $c*$c ) then System.out.println( "fwd: " + $a + " " + $b + " " + $c ); end query isTriple( Integer $a, Integer $b, Integer $c ) Integer( intValue == $a ) Integer( intValue == $b && > $a ) Integer( intValue == $c && > $b ) eval( $a*$a + $b*$b == $c*$c ) end rule "find triple backward" when isTriple( $a, $b, $c; ) then System.out.println( "bwd: " + $a + " " + $b + " " + $c ); end
    • Hide

      The types of the query arguments has to be coherent with the declarations so either rewrite the query signature like:

      query isTriple( int $a, int $b, int $c )
      

      or change the patterns in the query itself like:

      Integer( this == $a )
      
      Show
      The types of the query arguments has to be coherent with the declarations so either rewrite the query signature like: query isTriple( int $a, int $b, int $c ) or change the patterns in the query itself like: Integer ( this == $a )

    Description

      An eval CW in a query used in a BW chaining rule compiles, but causes a NoSuchMethodError when executed.

      Exception in thread "main" java.lang.NoSuchMethodError:
      pythagoras.Rule_isTriple_17ac16f7237046ee9562afce35dfe174.eval0(III)Z
      at pythagoras.Rule_isTriple_17ac16f7237046ee9562afce35dfe174Eval0InvokerGenerated.evaluate(Unknown
      Source)
      at pythagoras.Rule_isTriple_17ac16f7237046ee9562afce35dfe174Eval0Invoker.evaluate(Unknown
      Source)
      at org.drools.rule.EvalCondition.isAllowed(EvalCondition.java:114)
      at org.drools.reteoo.EvalConditionNode.assertLeftTuple(EvalConditionNode.java:176)
      at org.drools.reteoo.SingleLeftTupleSinkAdapter.doPropagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:196)
      at org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:71)
      at org.drools.reteoo.JoinNode.propagateFromRight(JoinNode.java:159)
      at org.drools.reteoo.JoinNode.assertObject(JoinNode.java:148)
      at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:497)
      at org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:382)
      at org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:235)
      at org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:240)
      at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:350)
      at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:311)
      at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:903)
      at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:847)
      at org.drools.impl.StatefulKnowledgeSessionImpl.insert(StatefulKnowledgeSessionImpl.java:269)
      at pythagoras.Main.makeFacts(Main.java:94)

      Attachments

        Activity

          People

            mfusco@redhat.com Mario Fusco
            laune Wolfgang Laun (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: