Regarding the problem with dates, even when using java beans, what
options would I have other than accepting the limitations of that
syntax sugar or to provide a static method, casting and converting
arguments, returning a boolean, and call this using an inline eval.
If I'm not
mistaken, in drools 5 you can declare (and even define)
functions which can be called without eval(). So you'd provide that
static method, declare it in DRL & at least get rid of eval().
Also, I think there's a smoother syntax to acces maps, the mvel page
explains it. Short version this["foo"] -> foo. Or something.
Thanks again,
Leo.
2009/11/8 Edson Tirelli <ed.tirelli(a)gmail.com>:
> Wolfgang,
>
> As you know, there are a ton of problems when you go down the "date"
> route. Probably the reason java never had a decent built-in date framework
> (fingers crossed for JSR-310).
>
> Anyway, back to the point, the syntax sugar for string-based strings is a
> really simple way for people to use really simple dates in their rules. But,
> yes, with that, you can't define which calendar, timezone, daylight savings,
> etc, rules should use. It will just use the defaults for the JVM instance.
> You will probably never see *me* using that. But there are people that just
> want something that simple and in this case, it is there.
>
> MVEL page is:
>
>
http://mvel.codehaus.org/
>
> I don't think that mvel has anything specific to dates, but I might be
> wrong.
>
> The only thing "not available" in Drools are the control structures
> (if/while/etc) that we disable explicitly.
>
> Edson
>
> 2009/11/8 Wolfgang Laun <wolfgang.laun(a)gmail.com>
>> For the sake of clarification: Are you saying that there is, or should be,
>> some magic which would make a constraint like
>> Map ( this["departureDate"] == "07-Jan-2009" )
>> behave as a comparison between two java.util.Date values if the LHS Object
>> is of this type? And also if it is a GregorianCalendar object?
>>
>> Since even you are "not sure" regarding MVEL: What is the definite
>> reference for MVEL in Drools? I have a vague recollection of reading
>> somewhere that not all of MVEL is available...
>>
>> -W
>>
>>
>> 2009/11/8 Edson Tirelli <ed.tirelli(a)gmail.com>
>>> Ok, without discussing the merits of using (or not) maps, the reason
>>> you are having problems with dates is that the "string-based" date
is syntax
>>> sugar in Drools parser/compiler. Although, when you create expressions using
>>> nested accessors or [] for collection/map element access, drools wraps the
>>> whole thing into an "eval" and delegates to MVEL. We do some
transformations
>>> to bridge the gap between drools operators and mvel operators, but I
don't
>>> think drools has anything to "transform" the string-based date
into
>>> something mvel understands.
>>>
>>> Having said that, we should probably add this functionality to the
>>> "MVELDumper" class for better integration. Would you please open a
jira for
>>> that? Also, patches are welcome in case someone would like to help. This is
>>> an isolated part of the code and easy to understand.
>>>
>>> Meanwhile, best you can do is avoid the use of this Map syntax +
>>> string-based dates, or write your expressions directly in a way the mvel
>>> understands (not sure mvel has a special syntax for dates).
>>>
>>> Same explanation for the NPE.
>>>
>>> Edson
>>>
>>> 2009/11/8 Leonardo Gomes <leonardo.f.gomes(a)gmail.com>
>>>> Hi Wolfgang,
>>>>
>>>> Here's the context:
>>>>
>>>> We're replacing a very basic home-made rule engine with drools.
Today,
>>>> fact data can be added dynamically b/c for all rules our fact is
>>>> nothing more than a Map and we can register new fact data through an
>>>> UI where you say what's the key and what's the type of the
value.
>>>> Rules can also be created dynamically and operate against those newly
>>>> created attributes of my fact.
>>>>
>>>> Incoming requests are key / value structures and we have a service
>>>> that will look at the list of registered fact data and try to find
>>>> that information in the incoming request by looking for the keys and
>>>> getting the corresponding values, then populating the Map I just
>>>> talked about which will be injected in the working memory for
>>>> evaluation against our rules.
>>>>
>>>> That's why, in Drools, I need to have my rules accessing data from a
>>>> Map. By using MVEL, as I said, it works fine with strings, integers
>>>> and list of strings, but I'm having problems with dates and would
like
>>>> some advice on that case.
>>>>
>>>> Here's another example of things that work:
>>>>
>>>> rule "test rule"
>>>> when
>>>> Map ( this["airportCode"] == "GIG"
>>>> , this["numberOfPassengers"] > 1
>>>> , this["class"] in
("BUSINESS", "FIRST CLASS") )
>>>> then
>>>> m.addMessage("rule matched");
>>>> end
>>>>
>>>> And here's where I have problems,
>>>>
>>>> Map ( this["departureDate"] ) == "07-Jan-2009" )
>>>>
>>>>
>>>> Thanks a lot,
>>>> Leo.
>>>>
>>>>
>>>>
>>>> On Sun, Nov 8, 2009 at 10:56 AM, Wolfgang Laun
<wolfgang.laun(a)gmail.com>
>>>> wrote:
>>>>> On Sat, Nov 7, 2009 at 6:00 PM, Leonardo Gomes
>>>>> <leonardo.f.gomes(a)gmail.com>
>>>>> wrote:
>>>>>> Hello,
>>>>>>
>>>>>> I'm feeding my working memory with Maps (unfortunately, this
is a
>>>>>> requirement and I can't use beans).
>>>>>>
>>>>> Before people start racking their brains to overcome all the
resulting
>>>>> difficulties: Could you please explain what this requirement is
meant
>>>>> to
>>>>> achieve?
>>>>> -W
>>>>>
>>>>>
>>>>>> To access the values in this maps I use the following MVEL
expression
>>>>>> :
>>>>>>
>>>>>> Map ( this["airportCode"] ==
"GIG"
>>>>>> , this["numberOfPassengers"]
> "1"
>>>>>> , this["class"] memberOf
("BUSINESS", "FIRST")
>>>>>> )
>>>>>>
>>>>>> And it works fine, except for dates where I get a
ClassCastException,
>>>>>> even tough I'm using the right pattern:
>>>>>>
>>>>>> Map ( this["departureDate"] >
"07-Nov-2009" ) --- fails
>>>>>>
>>>>>> Is there anything I need to do to make the dynamic cast of dates
>>>>>> work,
>>>>>> in this particular case?
>>>>>>
>>>>>> --
>>>>>>
>>>>>> Morever, I get NPEs if there's no value for a given key. For
example,
>>>>>> the expression Map ( this ["name"] ==
'Leonardo' ) would fail if
>>>>>> there's no entry with "name" as the key.
>>>>>>
>>>>>> Any help is welcome!
>>>>>>
>>>>>> Thanks in advance,
>>>>>> Leo.
>>>>>> _______________________________________________
>>>>>> rules-users mailing list
>>>>>> rules-users(a)lists.jboss.org
>>>>>>
https://lists.jboss.org/mailman/listinfo/rules-users
>>>>>
>>>> _______________________________________________
>>>> rules-users mailing list
>>>> rules-users(a)lists.jboss.org
>>>>
https://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(a)lists.jboss.org
>>>
https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users(a)lists.jboss.org
>>
https://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(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/rules-users
>
>
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users