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.

Reply via email to