[rules-users] Condition syntax to access Map

Mark Proctor mproctor at codehaus.org
Fri Jul 29 09:52:06 EDT 2011


On 29/07/2011 14:28, Edson Tirelli wrote:
>
>    Yes, that is exactly what I think. Pattern matching constraints are 
> like query parameters. They need to exist and evaluate to true in 
> order to match. So, for this to match:
>
> a.b.c == null
>
>    a needs to exist and be non-null, b needs to exist and be non-null, 
> c needs to exist and be null. So it is not just NP safe navigation... 
> it is an existence test at the same time. So for maps
>
> a[x].b[y].c[z] == null
>
>    The keys x, y and z need to exist, and c[z] must have a value of 
> null. That is what the expression above is asking for, in my 
> understanding.
>
>    This presents no loss of completeness to the language, as you can 
> still test non-existence of keys if that is what you want, but the 
> most common case you are looking for the opposite and it becomes much 
> simpler to write rules that way.
>
> > So, a builder option to turn this on is allright with me.
>
>    We can probably do that and have a configuration option to turn 
> this feature on/off.
I'm strongly against configuration options in this case, we decide on 
one way and stick with it. We already have too many configurations and a 
casual person looking at the code could introduce a bug as they weren't 
aware of what configuratino was on for null safety.

I think part of the problem here is we are mixing domains, between 
script evaluation and relational constraints. There is a reason why 
other rule engines don't do nested accessors :) (ignoring the technical 
issues too).

Mark

Mark
>
>    Edson
>
>
> 2011/7/29 Mark Proctor <mproctor at codehaus.org 
> <mailto:mproctor at codehaus.org>>
>
>     Lets forget that these are nested accessors and the problems they
>     bring. Lets look at what they would be if they were real relations:
>
>
>     On 29/07/2011 08:55, Wolfgang Laun wrote:
>>     Whoa! See below...
>>
>>     2011/7/28 Edson Tirelli <ed.tirelli at gmail.com
>>     <mailto:ed.tirelli at gmail.com>>
>>
>>
>>            I think we need to differentiate paradigms here. When
>>         using rules, contrary to imperative code, what we are doing
>>         is pattern matching.
>>
>>         X( a.b.c == <value> )
>>
>>            In the above case, we are looking for Xs that make that
>>         whole constraint true (i.e. match). If a or b are null, the
>>         whole expression will be false, does not matter the value of
>>         c or the value it is being compared against.
>>
>>
>>     (Edson: Only if you define it so. The logical implication of c
>>     being null in an absent a.b (i.e., a.b==null) could very well be
>>     that "a.b.c does not exist", and you can't claim that a.b.c
>>     exists if a.b. doesn't!
>>
>>     Is there no house at some address?
>>         (city.street[name].house[number] == null)  # true => no such
>>     house
>     $c : City()
>     $s : Street( city == $c, street = "name" )
>            House( number ==  null)
>
>     The above is identical logic to the more convenient form of nested
>     accessors, it's the proper relational form. In this case if there
>     was no Street, it wouldn't match.
>
>
>
>>
>>     This test data with false when null: Vienna/TirelliStrasse/42
>>     returns "false", hence there /is/ such a house. But we don't have
>>     a Tirelli Street in Vienna (yet)!
>>
>>     Confer this to Perl's
>>         ! exists $city{-streets}{"Tirelli"}[42]
>>     )
>>
>>         Raising a null pointer exception, IMO, brings no advantage at
>>         all to the table... on the contrary, makes writing rules more
>>         difficult.
>>
>>
>>     Edson, Mark,... please do recall the times where you have had an
>>     NPE in the code in a boolean expression? How painful would it
>>     have been if Java would have returned "false", continuing to
>>     cover a coding error made elsewhere?
>>
>>     Why don't other languages tolerate "null" silently? (Perl, the
>>     most pragmatic of all, doesn't - it has introduced an operator I
>>     can use or not.)
>>
>>     I have no problem when folks want to take shortcuts and live la
>>     dolce vita, but
>>     <em>I don't want to be led into the bog without my consent.</em>
>>
>>     So, a builder option to turn this on is allright with me.
>>
>>
>>            Another example we had in the past:
>>
>>         class Circle implements Shape
>>         class Square implements Shape
>>
>>         rule X
>>         when
>>             Circle() from $shapes
>>         ...
>>
>>            In the above example, $shapes is a list and the rule is
>>         clearly looking for Circles. If there are Squares in there,
>>         they will just not match. Raising a ClassCastException like
>>         it would happen in an imperative language brings no advantage
>>         to the table, IMO.
>>
>>
>>     This is an entirely different matter than the previous one. I see
>>     no reason whatsoever, not to define this "from" as working with
>>     an implicit filter.
>>
>>     -W
>>
>>
>>            So, IMO, all property navigation should be null pointer
>>         safe in the LHS of the rules.
>>
>>            This is not what happens today, but I think it should be
>>         fixed.
>>
>>            Edson
>>
>>
>>
>>         2011/7/28 Vincent LEGENDRE <vincent.legendre at eurodecision.com
>>         <mailto:vincent.legendre at eurodecision.com>>
>>
>>             Hi all,
>>
>>             I agree with W. : NPE should be the default, and "null"
>>             cases behaviour should be planned by programmers.
>>             But I am not sure about using a new operator in rules
>>             (and do the update in Guvnor ...).
>>             Why not using some drools annotations on the getter
>>             specifying the behaviour of an eval on a null value
>>             returned by this getter ?
>>             And may be these annotation could be added to an existing
>>             POJO via the declared type syntax (just like event role
>>             in fusion) ?
>>
>>             Vincent.
>>
>>             _______________________________________________
>>             rules-users mailing list
>>             rules-users at lists.jboss.org
>>             <mailto:rules-users at lists.jboss.org>
>>             https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>>
>>
>>         -- 
>>           Edson Tirelli
>>           JBoss Drools Core Development
>>           JBoss by Red Hat @ www.jboss.com <http://www.jboss.com>
>>
>>         _______________________________________________
>>         rules-users mailing list
>>         rules-users at lists.jboss.org <mailto:rules-users at lists.jboss.org>
>>         https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>>
>>
>>     _______________________________________________
>>     rules-users mailing list
>>     rules-users at lists.jboss.org  <mailto:rules-users at lists.jboss.org>
>>     https://lists.jboss.org/mailman/listinfo/rules-users
>
>
>     _______________________________________________
>     rules-users mailing list
>     rules-users at lists.jboss.org <mailto:rules-users at lists.jboss.org>
>     https://lists.jboss.org/mailman/listinfo/rules-users
>
>
>
>
> -- 
>   Edson Tirelli
>   JBoss Drools Core Development
>   JBoss by Red Hat @ www.jboss.com <http://www.jboss.com>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20110729/19aa8133/attachment.html 


More information about the rules-users mailing list