* @author Gediminas Morkevicius * @license MIT License (http://www.opensource.org/licenses/mit-license.php) */ class MaterializedPath extends AbstractMaterializedPath { /** * {@inheritdoc} */ public function removeNode($om, $meta, $config, $node) { $uow = $om->getUnitOfWork(); $wrapped = AbstractWrapper::wrap($node, $om); // Remove node's children $results = $om->createQueryBuilder() ->find($meta->name) ->field($config['path'])->equals(new \MongoRegex('/^'.preg_quote($wrapped->getPropertyValue($config['path'])).'.?+/')) ->getQuery() ->execute(); foreach ($results as $node) { $uow->scheduleForDelete($node); } } /** * {@inheritdoc} */ public function getChildren($om, $meta, $config, $originalPath) { return $om->createQueryBuilder() ->find($meta->name) ->field($config['path'])->equals(new \MongoRegex('/^'.preg_quote($originalPath).'.+/')) ->sort($config['path'], 'asc') // This may save some calls to updateNode ->getQuery() ->execute(); } /** * {@inheritdoc} */ protected function lockTrees(ObjectManager $om, AdapterInterface $ea) { $uow = $om->getUnitOfWork(); foreach ($this->rootsOfTreesWhichNeedsLocking as $oid => $root) { $meta = $om->getClassMetadata(get_class($root)); $config = $this->listener->getConfiguration($om, $meta->name); $lockTimeProp = $meta->getReflectionProperty($config['lock_time']); $lockTimeProp->setAccessible(true); $lockTimeValue = new \MongoDate(); $lockTimeProp->setValue($root, $lockTimeValue); $changes = array( $config['lock_time'] => array(null, $lockTimeValue), ); $ea->recomputeSingleObjectChangeSet($uow, $meta, $root); } } /** * {@inheritdoc} */ protected function releaseTreeLocks(ObjectManager $om, AdapterInterface $ea) { $uow = $om->getUnitOfWork(); foreach ($this->rootsOfTreesWhichNeedsLocking as $oid => $root) { $meta = $om->getClassMetadata(get_class($root)); $config = $this->listener->getConfiguration($om, $meta->name); $lockTimeProp = $meta->getReflectionProperty($config['lock_time']); $lockTimeProp->setAccessible(true); $lockTimeValue = null; $lockTimeProp->setValue($root, $lockTimeValue); $changes = array( $config['lock_time'] => array(null, null), ); $ea->recomputeSingleObjectChangeSet($uow, $meta, $root); unset($this->rootsOfTreesWhichNeedsLocking[$oid]); } } }