private function processCollectionUpdates(QueryWriter $queryWriter, UnitOfWork $uow) { foreach ($uow->getCollectionUpdates() as $coll) { $assoc = $coll->getMapping(); if (isset($assoc['embedded'])) { continue; } $owner = $coll->getOwner(); $ownerRef = strval($this->getDocReference($owner)); $fieldName = $assoc['fieldName']; switch ($assoc['association']) { case ClassMetadata::LINK_BAG_EDGE: if (!$assoc['indirect']) { // nothing to do, as insert / update / delete is handled by cascade operations continue; } if ($assoc['direction'] === 'out') { $rids = [$ownerRef, null]; $pos = 1; } else { $rids = [null, $ownerRef]; $pos = 0; } // add new edges foreach ($coll->getInsertDiff() as $key => $related) { $rids[$pos] = $this->getDocReference($related); $queryWriter->addCreateLightEdgeQuery($assoc['oclass'], $rids); } foreach ($coll->getDeleteDiff() as $related) { $rids[$pos] = $this->getDocReference($related); $queryWriter->addDeleteEdgeQuery($assoc['oclass'], $rids); } continue; case ClassMetadata::LINK_MAP: foreach ($coll->getInsertDiff() as $key => $doc) { $queryWriter->addCollectionMapPutQuery($ownerRef, $fieldName, $key, $uow->getDocumentRid($doc)); } foreach ($coll->getDeleteDiff() as $key => $doc) { $queryWriter->addCollectionMapDelQuery($ownerRef, $fieldName, $key); } continue; default: $rids = array_map(function ($doc) use($uow) { return $uow->getDocumentRid($doc); }, $coll->getInsertDiff()); if (count($rids) > 0) { $queryWriter->addCollectionAddQuery($ownerRef, $fieldName, implode(',', $rids)); } $rids = array_map(function ($doc) use($uow) { return $uow->getDocumentRid($doc); }, $coll->getDeleteDiff()); if (count($rids) > 0) { $queryWriter->addCollectionDelQuery($ownerRef, $fieldName, implode(',', $rids)); } continue; } } }