[rules-dev] SumIntegerAccumulateFunction not possible?

Edson Tirelli tirelli at post.com
Sat Aug 11 11:25:06 EDT 2007


   Hey Geoffrey,

   Lets talk about short term and long term.

* Long term: we may need to find a way to support primitives. Right now,
primitives are wrapped to simplify custom function developments.

* Short term: knowing that all primitives are wrapped, we always recommend
you to use Number instead of the concrete wrapper classes implementations.

     public void accumulate(Object context,
                            Object value) {
         SumIntegerAccumulateFunction.SumData data = (
SumIntegerAccumulateFunction.SumData) context;
         data.total += ((Number) value).intValue();
     }

    Now, the explanation: to add flexibility to the users writing rules with
your function, we support expressions that are MVEL evaluated and the result
is sent to the function implementation. So, in your example, if the user
wanted to sum the double of the distances, he could write instead:

     $totalDistance : Integer() from accumulate(
        Hop($distance : distance),
        sumInteger( $distance * 2 )
     );

    So, what goes between () is really any valid mvel expression and as
such, MVEL decides what is the wrapper class to return the result.
Apparently, it is returning a Long for integer type numbers.

    Being brief, it is flexible, powerful and expressive, but it may require
some refactorings in the future to improve performance, if it becomes an
issue.

    Hope it helps.

       Edson


2007/8/11, Geoffrey De Smet <ge0ffrey.spam at gmail.com>:
>
> It looks like the value objects of the accumulate framework are always
> Long's - even when they are Integers?
>
>
> Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast
> to java.lang.Integer
>         at
> org.drools.base.accumulators.SumIntegerAccumulateFunction.accumulate(
> SumIntegerAccumulateFunction.java:36)
>         at
> org.drools.base.accumulators.JavaAccumulatorFunctionExecutor.accumulate(
> JavaAccumulatorFunctionExecutor.java:79)
>
>
>
> Here's the piece of code:
>
>      public void accumulate(Object context,
>                             Object value) {
>          SumIntegerAccumulateFunction.SumData data =
> (SumIntegerAccumulateFunction.SumData) context;
>          data.total += ((Integer) value).intValue(); // breaks
>      }
>
>
> Here's the drl:
>
>    when
>      $totalDistance : Integer() from accumulate(
>         Hop($distance : distance),
>         sumInteger($distance)
>      );
>
>
> Here's the Hop object:
>
>      public int getDistance() {
>          ...
>      }
>
> Look ma, no longs :) Still a ClassCastException on them though.
> I must be missing something really obvious?
>
> --
> With kind regards,
> Geoffrey De Smet
>
> _______________________________________________
> rules-dev mailing list
> rules-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-dev
>



-- 
  Edson Tirelli
  Software Engineer - JBoss Rules Core Developer
  Office: +55 11 3529-6000
  Mobile: +55 11 9287-5646
  JBoss, a division of Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-dev/attachments/20070811/d3641069/attachment.html 


More information about the rules-dev mailing list