Today I spent some time figuring out why our entity list cache was not
working as expected.  We had a PartyContent entity that was fetched in a
entity-and with use-cache="true".  However, when the PartyContent was
updated the cache was not properly flushed in the EntityList cache.  Here is
what I found:

1) Cache.remove(GenericEntity entity) is being called with the updated
GenericEntity.  This is used to call entityListCache.storeHook(entity, null)
and the signature expects to have oldvalue, newvalue.  Ultimately it
iterates through the conditions and attempts to programatically apply them
to the "old value".  If there is match that condition is removed from the
cache.  The trouble of course, is that it is using the new value which may
cause the condition to no longer match (as in our case).

2) During the comparison logic for the condition (above) the system
ultimately gets down to EntityJoinOperator.entityMatches(GenericEntity, lhs,
rhs).  This object has a "shortCircuitValue" (basically when should I stop
checking for this condition).  For our AND the short circuit value would be
"false" as in if I hit false on the left-hand-side there is no point in
checking the right-hand-side, lets leave now with FALSE.  The trouble was
the code looked like:

if (lhs.entityMatches(entity)) return shortCircuitValue;

instead of

if (lhs.entityMatches(entity) == shortCircuitValue) return
shortCircuitValue;

This pattern is in a few places, it was just wrong in this method and
mapMatches method (right below).

SO, I have a clear fix for #2 but my solution for #1 isn't great (I go fetch
the entity from the database so I can get the "old value").  I would like to
talk with someone with lots of caching experience here to make sure I am not
off base.  Also, wonder if there is a way to get the original version of the
GenericEntity without doing a re-fetch.  I was considering an solution where
the fields would be changed to a MapStack where the updated fields would be
on the top of the stack (always a stack of 2).

Thoughts?
-- 
View this message in context: 
http://www.nabble.com/EntityList-cache-issues-...-tp25179637p25179637.html
Sent from the OFBiz - Dev mailing list archive at Nabble.com.

Reply via email to