[CODM-31] UnitOfWork#doDetach does not remove a document from the identityMap - uses incorrect index Created: 10/Aug/11  Updated: 15/Aug/11  Resolved: 15/Aug/11

Status: Resolved
Project: Doctrine CouchDB ODM
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Major
Reporter: Marnus Weststrate Assignee: Benjamin Eberlei
Resolution: Fixed Votes: 0
Labels: None


In UnitOfWork on line 656 the oid is used to index the identity map instead of the document id when detaching an object. This is probably due to an incomplete port from the ORM. The following change fixes the bug (I will make the change and request a merge):

656: if (isset($this->identityMap[$oid])) {

Should be:
656: if (isset($this->identityMap[$this->documentIdentifiers[$oid]])) {

Further suggestion

Since the document id is guaranteed to be unique would it not be better to do away with the oid completely? It seems the following would be a relatively cheap substitute for the current getDocumentIdentifier() implementation (excluding the check that it is managed which is also currently done in this method):

public function getDocumentIdentifier($document)
$class = $this->dm->getClassMetadata(get_class($document));
return $class->getIdentifierValue($document);

Then all the arrays in the UnitOfWork can be indexed using the document id and the above method can be called to obtain that wherever spl_object_hash is currently used to obtain the $oid. (Of course, if running spl_object_hash is faster than retrieving the doc id as I suggest above then the current implementation is better.)

Generated at Mon Nov 30 15:55:14 EST 2015 using JIRA 6.4.10#64025-sha1:5b8b74079161cd76a20ab66dda52747ee6701bd6.