[rules-users] unsolved myth regarding transitive closure using insertlogical...

Simon Chen simonchennj at gmail.com
Tue Feb 22 16:46:36 EST 2011


On Tue, Feb 22, 2011 at 4:21 PM, Greg Barton <greg_barton at yahoo.com> wrote:
> Implementations of equals() and hashCode() should always agree:
>
> http://www.javapractices.com/topic/TopicAction.do?Id=28

Ah, I'm making a joke out of myself again... :-) Haven't really needed
to override equals() and hashCode() before, but now I know.
Thanks for the pointer.

-Simon

>
> --- On Tue, 2/22/11, Simon Chen <simonchennj at gmail.com> wrote:
>
>> From: Simon Chen <simonchennj at gmail.com>
>> Subject: Re: [rules-users] unsolved myth regarding transitive closure using insertlogical...
>> To: "Rules Users List" <rules-users at lists.jboss.org>
>> Date: Tuesday, February 22, 2011, 2:24 PM
>> On Sun, Feb 20, 2011 at 10:11 PM,
>> Mark Proctor <mproctor at codehaus.org>
>> wrote:
>> > On 21/02/2011 03:03, Simon Chen wrote:
>> >> On Sun, Feb 20, 2011 at 8:20 PM, Ansgar Konermann
>> >> <ansgar.konermann at googlemail.com>
>>  wrote:
>> >>> On 19.02.2011 16:01, Simon Chen wrote:
>> >>>> The example you gave seems to be the
>> one-hop case. For the two-hop
>> >>>> case, we need something like this
>> >>>>
>> >>>> when
>> >>>>      edge(a, b), reach(b, c), not
>> exists reach(a, c)
>> >>>> then
>> >>>>      insertLogical( reach(a,c) )
>> >>>>
>> >>>> So, where do you put your logical around?
>> It should include both
>> >>>> edge(a,b) and reach(b,c), right?
>> >>>>
>> >>>> Another thought, can we have something
>> like
>> >>>> testExistsAndInsertLogical() to replace
>> insertLogical()? But this may
>> >>>> be buggy, as the conditions are all met,
>> so the rule actually fired...
>> >>>>
>> >>> Hi,
>> >>>
>> >>> from my experience, insertLogical does exactly
>> what
>> >>> testExistsAndInsertLogical would suggest. If
>> the same object is already
>> >>> in the working memory, it keeps this object
>> and does not insert another
>> >>> instance. This behaviour is not stated
>> explicitly in the documentation,
>> >>> but I did a learning test a few weeks ago and
>> IIRC it clearly showed
>> >>> this behaviour (at least for 5.0.1). -- I
>> consider this behaviour a
>> >>> feature and would like it to be kept this
>> way.
>> >> I am using Drools 5.1.1, and I don't think
>> insertLogical prevents
>> >> duplicates automatically. This also boils down to
>> the question of how
>> >> Drools decides whether two objects are indeed the
>> same. For strings
>> >> and integers, it is straightforward, but not much
>> so for complex
>> >> objects. Is there a way to pass in a comparison
>> function?
>> > InsertLogical operates on equality mode, that is
>> determined by the
>> > pojo's equals() method implementation. If an object
>> already exists that
>> > is equal, it will use that and the justification
>> counter for that
>> > existing object is increased.
>>
>> Mark,
>>
>> I did a bit debugging using the drools source code, which
>> is neatly
>> written btw. I now know what caused my problem. When
>> logically
>> inserting an object, the current implementation would
>> compare the
>> object with saved EqualityKeys in the
>> TruthMaintenanceSystem. The
>> comparison is done through hashCode(), not equals(). So, a
>> duplicate
>> (by value) object can be inserted, because the hashcode is
>> different.
>>
>> I am not sure if this is a design decision, but I would
>> rather using
>> equals() here. I overrode the hashCode() implementation of
>> my objects,
>> and it is working now...
>>
>> Thanks.
>> -Simon
>>
>> >
>> > Mark
>> >>> With this, all which is necessary to implement
>> transitive closure is to
>> >>> remove the contradicting part of the
>> precondition to avoid oscillation.
>> >>> If it turns out that insertLogical does not
>> perform a "does fact already
>> >>> exist" check and thus might potentially insert
>> duplicates, put exists( )
>> >>> around the two preconditions and also use
>> "exists( reach(x,y) )" to
>> >>> check whether y is reachable from x.
>> >> I don't quite follow. Can you elaborate with an
>> actual rule?
>> >>
>> >> Thanks!
>> >> -Simon
>> >>
>> >>> Kind regards
>> >>>
>> >>> Ansgar
>> >>>
>> _______________________________________________
>> >>> rules-users mailing list
>> >>> rules-users at lists.jboss.org
>> >>> https://lists.jboss.org/mailman/listinfo/rules-users
>> >>>
>> >> _______________________________________________
>> >> rules-users mailing list
>> >> rules-users at lists.jboss.org
>> >> https://lists.jboss.org/mailman/listinfo/rules-users
>> >>
>> >>
>> >
>> >
>> > _______________________________________________
>> > rules-users mailing list
>> > rules-users at lists.jboss.org
>> > https://lists.jboss.org/mailman/listinfo/rules-users
>> >
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>




More information about the rules-users mailing list