vendor/doctrine/orm/lib/Doctrine/ORM/Query/TreeWalkerChainIterator.php line 77

Open in your IDE?
  1. <?php
  2. /*
  3.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  4.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  5.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  6.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  7.  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  8.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  9.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  10.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  11.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  12.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  13.  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  14.  *
  15.  * This software consists of voluntary contributions made by many individuals
  16.  * and is licensed under the MIT license. For more information, see
  17.  * <http://www.doctrine-project.org>.
  18.  */
  19. namespace Doctrine\ORM\Query;
  20. use ArrayAccess;
  21. use Doctrine\ORM\AbstractQuery;
  22. use Iterator;
  23. use function key;
  24. use function next;
  25. use function reset;
  26. /**
  27.  * @template-implements Iterator<TreeWalker>
  28.  * @template-implements ArrayAccess<int, TreeWalker>
  29.  */
  30. class TreeWalkerChainIterator implements IteratorArrayAccess
  31. {
  32.     /** @var class-string<TreeWalker>[] */
  33.     private $walkers = [];
  34.     /** @var TreeWalkerChain */
  35.     private $treeWalkerChain;
  36.     /** @var AbstractQuery */
  37.     private $query;
  38.     /** @var ParserResult */
  39.     private $parserResult;
  40.     /**
  41.      * @param AbstractQuery $query
  42.      * @param ParserResult  $parserResult
  43.      */
  44.     public function __construct(TreeWalkerChain $treeWalkerChain$query$parserResult)
  45.     {
  46.         $this->treeWalkerChain $treeWalkerChain;
  47.         $this->query           $query;
  48.         $this->parserResult    $parserResult;
  49.     }
  50.     /**
  51.      * @return string|false
  52.      * @psalm-return class-string<TreeWalker>|false
  53.      */
  54.     public function rewind()
  55.     {
  56.         return reset($this->walkers);
  57.     }
  58.     /**
  59.      * @return TreeWalker|null
  60.      */
  61.     public function current()
  62.     {
  63.         return $this->offsetGet(key($this->walkers));
  64.     }
  65.     /**
  66.      * @return int
  67.      */
  68.     public function key()
  69.     {
  70.         return key($this->walkers);
  71.     }
  72.     /**
  73.      * @return TreeWalker|null
  74.      */
  75.     public function next()
  76.     {
  77.         next($this->walkers);
  78.         return $this->offsetGet(key($this->walkers));
  79.     }
  80.     /**
  81.      * {@inheritdoc}
  82.      */
  83.     public function valid()
  84.     {
  85.         return key($this->walkers) !== null;
  86.     }
  87.     /**
  88.      * {@inheritdoc}
  89.      */
  90.     public function offsetExists($offset)
  91.     {
  92.         return isset($this->walkers[$offset]);
  93.     }
  94.     /**
  95.      * @psalm-param array-key|null $offset
  96.      *
  97.      * @return TreeWalker|null
  98.      */
  99.     public function offsetGet($offset)
  100.     {
  101.         if ($this->offsetExists($offset)) {
  102.             return new $this->walkers[$offset](
  103.                 $this->query,
  104.                 $this->parserResult,
  105.                 $this->treeWalkerChain->getQueryComponents()
  106.             );
  107.         }
  108.         return null;
  109.     }
  110.     /**
  111.      * {@inheritdoc}
  112.      *
  113.      * @param string $value
  114.      * @psalm-param array-key|null $offset
  115.      */
  116.     public function offsetSet($offset$value)
  117.     {
  118.         if ($offset === null) {
  119.             $this->walkers[] = $value;
  120.         } else {
  121.             $this->walkers[$offset] = $value;
  122.         }
  123.     }
  124.     /**
  125.      * {@inheritdoc}
  126.      */
  127.     public function offsetUnset($offset)
  128.     {
  129.         if ($this->offsetExists($offset)) {
  130.             unset($this->walkers[$offset]);
  131.         }
  132.     }
  133. }