EntityDateFilterCondition causes the entity cache to return false matches
-------------------------------------------------------------------------
Key: OFBIZ-3880
URL: https://issues.apache.org/jira/browse/OFBIZ-3880
Project: OFBiz
Issue Type: Bug
Reporter: Scott Gray
The EntityDateFilterCondition can cause problems when used as a condition in
cache queries because it does not internally store the right hand side of the
query (i.e. the moment in time to filter against). The result is that all
instances using the same field names (e.g. "fromDate" and "thruDate") are
considered equal by the equals(Object) method regardless of the moment in time
that they ultimately end up querying.
The end result of this is that the if a value is cached against an
EntityCondition and that condition contains a EntityDateFilterCondition then
that value could be returned even if would not satisfy the same condition
queried against the database.
Concrete example:
- You query for PartyRelationship records using an EntityDateFilterCondition
and use the cache
- Some time passes and one of the previously returned PartyRelationship records
has expired i.e. thruDate has been set and passed
- If you now run the same query again then the expired PartyRelationship record
will be returned in the results from the cache even though you have filtered by
date
Obviously the cache shouldn't be being used in combination with an
EntityDateFilterCondition anyway (in its current state at least) since it is
impossible to ever retrieve the value from the cache once that moment in time
has passed (assuming this bug were fixed). But this problem is somewhat
obscure and it is too easy for a developer to combine the date filter and the
cache accidentally or without fully thinking it through.
Proposed fix is to store the moment in time that the condition tests against in
the object and use it in equals(Object) and hasCode(), should be set during
init() and cleared during reset().
But really I don't even understand the purpose of this class, it uses a regular
EntityCondition internally and we could probably just move the code that does
the real work (makeCondition(...)) into EntityCondition as a utility method or
even into EntityUtil and then discard this class entirely.
Thoughts welcome.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.