[rules-dev] Changing a fact's hashCode causes rules not to fire

Wolfgang Laun wolfgang.laun at gmail.com
Thu Jun 23 09:10:21 EDT 2011


On 23 June 2011 11:28, Mark Proctor <mproctor at codehaus.org> wrote:

> **
> On 23/06/2011 10:19, Wolfgang Laun wrote:
>
> Well, you are saying that if you are using references to fact objects in
> combination with constraints comparing such a reference to some other object
> any (overridden) hashCode method *must not refer to mutable fields* of
> that object.
>
> hashCode method *must not refer to mutable fields* of that object.
> That's not a good idea really. Hashcode's should refer to fields that you
> constrain on, as a general good rule. and those fields are normally mutable.
>

(Aside: Which may mean that all attributes of, say, an article - price,
storage quantity,... - should be part of the hash code, since those sure are
used in constraints?)


> I don't really know what more to say than...
> Nested accessors are "black box" if you modify a nested accessor you must
> notify the root object(s) that are inserted into the engine.
>
> If you want to write up some paragraphs talking people through how
> hashcode's and hashmap's work. Specifiically if you change the hashcode of
> an object that is in map you won't be able to find it in the map any more -
> which is what is happening to you. Notification effectively takes the root
> object out and put's it back in again, so it lives in the correct index.
>

So the warning must be written saying something like what I try to compose
below.

<warning>

   - There is a fact type A with a field b of class B and
   - patterns for A use constraints comparing b with "==" to some other
   object of type B and
   - B overrides hashCode using a field c of B and
   - this field is changed in an update of some object B.

In any situation like this, it is necessary to instruct the engine that any
fact of type A containing a reference to the changed fact B has changed.

In most real-world situation, this may not be possible. Then,

   - either avoid constraining on object references by replacing this with
   primary key field constraints,
   - or refrain from using c in hashCode.

</warning>


>
> This is why other engines don't support Objects as fields, you can only use
> values - strings, numbers etc.
>

Jess supports type OBJECT in a deftemplate without shadow facts, but then a
deftemplate does not override hashCode, and so the problem does not arise in
the first place.

-W


> For them it's worse though, they have to use techniques like shadow facts
> otherwise they get memory corruption - but shadow facts only work on direct
> values, and cannot shadow objects and nested fields. If you tried to do this
> stuff in other engines they would just get corrupted. It's only because we
> do a tree-graph based rete network for assymetrical retract that we can
> allow you to do this without corruption, but you must still notify the
> engine.
>
> Mark
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-dev/attachments/20110623/220ad43d/attachment.html 


More information about the rules-dev mailing list