[rules-users] [rules-dev] [BAD Bug] incorrect evaluation of LHS using Integer/Number intValue

Mario Fusco mario.fusco at gmail.com
Mon Jan 21 04:34:37 EST 2013


I just fixed this bug on the master and backported it on the 5.5.x branch.
Wolfgang, thanks again for your help.

Mario

On Sun, Jan 20, 2013 at 9:23 AM, Wolfgang Laun <wolfgang.laun at gmail.com>wrote:

> Below is another couple of test cases, showing that the problem is not due
> a getter that isn't called get* - it's a more general problem. As far as I
> can tell this rule pattern, expecting to fire in ascending order of
> Fact.prop, is broken in 5.5.0:
>
> rule "Rule xx"
> when
>     $fact: Fact( $prop: prop )
>     not Fact(prop < $prop)
> then
>     System.out.println("Fact.prop: " + $prop);
>     retract($fact);
> end
>
> // Test case using String
>
> rule init
> salience 9999
> when
> then
>     insert( "AAA" );
>     insert( "DDD" );
>     insert( "EEE" );
>     insert( "CCC" );
>     insert( "BBB" );
> end
>
> rule "Rule 05"
> when
>     $s : String()
>     not String( this < $s)
> then
>     System.out.println("String found with value: " + $s );
>     retract($s);
> end
>
> // Test case using declared type
> declare Fact
>   prop : long
> end
>
> rule init
> salience 999
> when
> then
>     insert( new Fact( 1 ) );
>     insert( new Fact( 5 ) );
>     insert( new Fact( 6 ) );
>     insert( new Fact( 4 ) );
>     insert( new Fact( 2 ) );
> end
>
> rule "Rule 06"
> salience 100
> when
>     $fact : Fact( $prop: prop )
>     not Fact( prop < $prop )
> then
>     System.out.println("Fact.prop: " + $prop);
>     retract($fact);
> end
>
> On 20/01/2013, Wolfgang Laun <wolfgang.laun at gmail.com> wrote:
> > [Sorry - the previous email "escaped" before I was complete.]
> >
> > This is a self-contained DRL demonstrating the erroneous handling of
> > a condition involving Integer.intValue (same: Number.intValue), not
> > and retract, which is meant to sort the integers. This fails with 5.5.0,
> > but works correctly with 5.4.0 and previous versions.
> >
> > rule init
> > salience 9999
> > when
> > then
> >     insert( Integer.valueOf( 10 ) );
> >     insert( Integer.valueOf( 50 ) );
> >     insert( Integer.valueOf( 60 ) );
> >     insert( Integer.valueOf( 40 ) );
> >     insert( Integer.valueOf( 20 ) );
> > end
> >
> > rule "Rule 04"
> > when
> >     $number : Integer( $i: intValue )
> >     not Integer(intValue < $i)
> > then
> >     System.out.println("Number found with value: " + $number.intValue());
> >     retract($number);
> > end
> >
> >>
> >> On 17/01/2013, Wolfgang Laun <wolfgang.laun at gmail.com> wrote:
> >>> This BAD bug was introduced on the way from 5.4.0 to 5.5.0 (and seems
> >>> to have sneaked into 6.0.0 as well).
> >>>
> >>> Only 5.4.0 and predecessors work as expected.
> >>>
> >>> Damage control? How far can 5.5.0 be trusted?
> >>>
> >>>
> >>> On 17/01/2013, John Smith <ffirstt.llastt at gmail.com> wrote:
> >>>> I am new to Drools and am trying to get the sample program to work.
> >>>> This
> >>>> sample is given in the drools documentation
> >>>>
> http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert-docs/html_single/index.html#d0e9542
> .
> >>>> This drool rule is expected to sort integers. I just changed the
> >>>> numbers
> >>>> from what are given in the sample and they do not get sorted as
> >>>> expected.
> >>>> Tried using drools version 5.5.0, 5.5.1 and the master 6.0.0, but got
> >>>> the
> >>>> same wrong results.
> >>>>
> >>>> Following is the main code:
> >>>>     package com.sample;
> >>>>
> >>>>     public class Example2 {
> >>>>       public static void main(String[] args) throws Exception {
> >>>>         Number[] numbers = new Number[] { wrap(5), wrap(6), wrap(4),
> >>>> wrap(1), wrap(2) };
> >>>>         new RuleRunner().runRules(new String[] { "Example3.drl" },
> >>>> numbers);
> >>>>       }
> >>>>
> >>>>       private static Integer wrap(int i) {
> >>>>         return new Integer(i);
> >>>>       }
> >>>>     }
> >>>>
> >>>>  The RuleRunner class is the same as given in the example and I do not
> >>>> think
> >>>> I should give that here, since it will clutter the question. It simply
> >>>> creates the KnowledgeBase, stateful session, inserts the facts as
> given
> >>>> in
> >>>> the 'numbers' array above and then calls fireAllRules method on the
> >>>> session.
> >>>>
> >>>> The rule file (Example3.drl) is:
> >>>>
> >>>>
> >>>>  rule "Rule 04"
> >>>>      dialect "mvel"
> >>>>    when
> >>>>      $number : Number()
> >>>>      not Number(intValue < $number.intValue)
> >>>>    then
> >>>>      System.out.println("Number found with value: " +
> >>>> $number.intValue());
> >>>>      retract($number);
> >>>>  end
> >>>>
> >>>>
> >>>> The output I get is as follows:
> >>>> Loading file: Example3.drl
> >>>> Inserting fact: 5
> >>>> Inserting fact: 6
> >>>> Inserting fact: 4
> >>>> Inserting fact: 1
> >>>> Inserting fact: 2
> >>>> Number found with value: 1
> >>>> Number found with value: 4
> >>>> Number found with value: 2
> >>>> Number found with value: 5
> >>>> Number found with value: 6
> >>>>
> >>>> Not the correct expected ascending sorted order.
> >>>>
> >>>> What might I be doing wrong? I cannot imagine that the drools rule
> >>>> engine
> >>>> would be broken at this basic level.
> >>>>
> >>>>
> >>>>
> >>>> --
> >>>> View this message in context:
> >>>>
> http://drools.46999.n3.nabble.com/Drools-Expert-does-not-sort-integers-correctly-tp4021606.html
> >>>> Sent from the Drools: User forum mailing list archive at Nabble.com.
> >>>> _______________________________________________
> >>>> rules-users mailing list
> >>>> rules-users at lists.jboss.org
> >>>> https://lists.jboss.org/mailman/listinfo/rules-users
> >>>>
> >>>
> >>
> >
> _______________________________________________
> rules-dev mailing list
> rules-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20130121/9ef88d00/attachment-0001.html 


More information about the rules-users mailing list