MaterializedPath.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <?php
  2. namespace Gedmo\Tree\Strategy\ODM\MongoDB;
  3. use Gedmo\Tree\Strategy\AbstractMaterializedPath;
  4. use Doctrine\Common\Persistence\ObjectManager;
  5. use Gedmo\Mapping\Event\AdapterInterface;
  6. /**
  7. * This strategy makes tree using materialized path strategy
  8. *
  9. * @author Gustavo Falco <comfortablynumb84@gmail.com>
  10. * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
  11. * @package Gedmo.Tree.Strategy.ODM.MongoDB
  12. * @subpackage MaterializedPath
  13. * @link http://www.gediminasm.org
  14. * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
  15. */
  16. class MaterializedPath extends AbstractMaterializedPath
  17. {
  18. /**
  19. * {@inheritdoc}
  20. */
  21. public function removeNode($om, $meta, $config, $node)
  22. {
  23. $uow = $om->getUnitOfWork();
  24. $pathProp = $meta->getReflectionProperty($config['path']);
  25. $pathProp->setAccessible(true);
  26. // Remove node's children
  27. $results = $om->createQueryBuilder()
  28. ->find($meta->name)
  29. ->field($config['path'])->equals(new \MongoRegex('/^'.preg_quote($pathProp->getValue($node)).'.?+/'))
  30. ->getQuery()
  31. ->execute();
  32. foreach ($results as $node) {
  33. $uow->scheduleForDelete($node);
  34. }
  35. }
  36. /**
  37. * {@inheritdoc}
  38. */
  39. public function getChildren($om, $meta, $config, $originalPath)
  40. {
  41. return $om->createQueryBuilder()
  42. ->find($meta->name)
  43. ->field($config['path'])->equals(new \MongoRegex('/^'.preg_quote($originalPath).'.+/'))
  44. ->sort($config['path'], 'asc') // This may save some calls to updateNode
  45. ->getQuery()
  46. ->execute();
  47. }
  48. /**
  49. * {@inheritedDoc}
  50. */
  51. protected function lockTrees(ObjectManager $om, AdapterInterface $ea)
  52. {
  53. $uow = $om->getUnitOfWork();
  54. foreach ($this->rootsOfTreesWhichNeedsLocking as $oid => $root) {
  55. $meta = $om->getClassMetadata(get_class($root));
  56. $config = $this->listener->getConfiguration($om, $meta->name);
  57. $lockTimeProp = $meta->getReflectionProperty($config['lock_time']);
  58. $lockTimeProp->setAccessible(true);
  59. $lockTimeValue = new \MongoDate();
  60. $lockTimeProp->setValue($root, $lockTimeValue);
  61. $changes = array(
  62. $config['lock_time'] => array(null, $lockTimeValue)
  63. );
  64. $uow->scheduleExtraUpdate($root, $changes);
  65. $ea->setOriginalObjectProperty($uow, $oid, $config['lock_time'], $lockTimeValue);
  66. }
  67. }
  68. /**
  69. * {@inheritedDoc}
  70. */
  71. protected function releaseTreeLocks(ObjectManager $om, AdapterInterface $ea)
  72. {
  73. $uow = $om->getUnitOfWork();
  74. foreach ($this->rootsOfTreesWhichNeedsLocking as $oid => $root) {
  75. $meta = $om->getClassMetadata(get_class($root));
  76. $config = $this->listener->getConfiguration($om, $meta->name);
  77. $lockTimeProp = $meta->getReflectionProperty($config['lock_time']);
  78. $lockTimeProp->setAccessible(true);
  79. $lockTimeValue = null;
  80. $lockTimeProp->setValue($root, $lockTimeValue);
  81. $changes = array(
  82. $config['lock_time'] => array(null, null)
  83. );
  84. $uow->scheduleExtraUpdate($root, $changes);
  85. $ea->setOriginalObjectProperty($uow, $oid, $config['lock_time'], $lockTimeValue);
  86. unset($this->rootsOfTreesWhichNeedsLocking[$oid]);
  87. }
  88. }
  89. }