MaterializedPathRepository.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <?php
  2. namespace Gedmo\Tree\Document\MongoDB\Repository;
  3. use Gedmo\Exception\InvalidArgumentException,
  4. Gedmo\Tree\Strategy,
  5. Gedmo\Tree\Strategy\ODM\MongoDB\MaterializedPath,
  6. Gedmo\Tool\Wrapper\MongoDocumentWrapper;
  7. /**
  8. * The MaterializedPathRepository has some useful functions
  9. * to interact with MaterializedPath tree. Repository uses
  10. * the strategy used by listener
  11. *
  12. * @author Gustavo Falco <comfortablynumb84@gmail.com>
  13. * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
  14. * @package Gedmo.Tree.Document.MongoDB.Repository
  15. * @subpackage MaterializedPathRepository
  16. * @link http://www.gediminasm.org
  17. * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
  18. */
  19. class MaterializedPathRepository extends AbstractTreeRepository
  20. {
  21. /**
  22. * Get tree query builder
  23. *
  24. * @return Doctrine\ODM\MongoDB\QueryBuilder
  25. */
  26. public function getTreeQueryBuilder()
  27. {
  28. return $this->getChildrenQueryBuilder();
  29. }
  30. /**
  31. * Get tree query
  32. *
  33. * @return Doctrine\ODM\MongoDB\Query\Query
  34. */
  35. public function getTreeQuery()
  36. {
  37. return $this->getTreeQueryBuilder()->getQuery();
  38. }
  39. /**
  40. * Get tree
  41. *
  42. * @return Doctrine\ODM\MongoDB\Cursor
  43. */
  44. public function getTree()
  45. {
  46. return $this->getTreeQuery()->execute();
  47. }
  48. /**
  49. * Get all root nodes query builder
  50. *
  51. * @return Doctrine\ODM\MongoDB\QueryBuilder
  52. */
  53. public function getRootNodesQueryBuilder($sortByField = null, $direction = 'asc')
  54. {
  55. return $this->getChildrenQueryBuilder(null, true, $sortByField, $direction);
  56. }
  57. /**
  58. * Get all root nodes query
  59. *
  60. * @return Doctrine\ODM\MongoDB\Query\Query
  61. */
  62. public function getRootNodesQuery($sortByField = null, $direction = 'asc')
  63. {
  64. return $this->getRootNodesQueryBuilder($sortByField, $direction)->getQuery();
  65. }
  66. /**
  67. * Get all root nodes
  68. *
  69. * @return Doctrine\ODM\MongoDB\Cursor
  70. */
  71. public function getRootNodes($sortByField = null, $direction = 'asc')
  72. {
  73. return $this->getRootNodesQuery($sortByField, $direction)->execute();
  74. }
  75. /**
  76. * Get children from node
  77. *
  78. * @return Doctrine\ODM\MongoDB\QueryBuilder
  79. */
  80. public function getChildrenQueryBuilder($node = null, $direct = false, $sortByField = null, $direction = 'asc')
  81. {
  82. $meta = $this->getClassMetadata();
  83. $config = $this->listener->getConfiguration($this->dm, $meta->name);
  84. $separator = preg_quote($config['path_separator']);
  85. $qb = $this->dm->createQueryBuilder()
  86. ->find($meta->name);
  87. if (is_object($node) && $node instanceof $meta->name) {
  88. $node = new MongoDocumentWrapper($node, $this->dm);
  89. $nodePath = preg_quote($node->getPropertyValue($config['path']));
  90. if ($direct) {
  91. $regex = sprintf('/^%s[^%s]+%s$/',
  92. $nodePath,
  93. $separator,
  94. $separator);
  95. } else {
  96. $regex = sprintf('/^%s.+/',
  97. $nodePath);
  98. }
  99. $qb->field($config['path'])->equals(new \MongoRegex($regex));
  100. } else if ($direct) {
  101. $qb->field($config['path'])->equals(new \MongoRegex(sprintf('/^[^%s]+%s$/',
  102. $separator,
  103. $separator)));
  104. }
  105. $qb->sort(is_null($sortByField) ? $config['path'] : $sortByField, $direction === 'asc' ? 'asc' : 'desc');
  106. return $qb;
  107. }
  108. /**
  109. * Get children query
  110. *
  111. * @return Doctrine\ODM\MongoDB\Query\Query
  112. */
  113. public function getChildrenQuery($node = null, $direct = false, $sortByField = null, $direction = 'asc')
  114. {
  115. return $this->getChildrenQueryBuilder($node, $direct, $sortByField, $direction)->getQuery();
  116. }
  117. /**
  118. * Get children
  119. *
  120. * @return Doctrine\ODM\MongoDB\Cursor
  121. */
  122. public function getChildren($node = null, $direct = false, $sortByField = null, $direction = 'asc')
  123. {
  124. return $this->getChildrenQuery($node, $direct, $sortByField, $direction)->execute();
  125. }
  126. /**
  127. * {@inheritDoc}
  128. */
  129. public function getNodesHierarchy($node, $direct, array $config, array $options = array())
  130. {
  131. $query = $this->getChildrenQuery();
  132. $query->setHydrate(false);
  133. return $query->toArray();
  134. }
  135. /**
  136. * {@inheritdoc}
  137. */
  138. protected function validate()
  139. {
  140. return $this->listener->getStrategy($this->dm, $this->getClassMetadata()->name)->getName() === Strategy::MATERIALIZED_PATH;
  141. }
  142. }