PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.36.0
MailPoet – Newsletters, Email Marketing, and Automation v5.36.0
5.36.1 5.36.0 5.35.1 5.35.0 5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / vendor-prefixed / doctrine / orm / src / Tools / Pagination / Paginator.php
mailpoet / vendor-prefixed / doctrine / orm / src / Tools / Pagination Last commit date
Exception 9 months ago CountOutputWalker.php 9 months ago CountWalker.php 9 months ago LimitSubqueryOutputWalker.php 9 months ago LimitSubqueryWalker.php 9 months ago Paginator.php 9 months ago RootTypeWalker.php 9 months ago RowNumberOverFunction.php 9 months ago WhereInWalker.php 9 months ago index.php 9 months ago
Paginator.php
178 lines
1 <?php
2 declare (strict_types=1);
3 namespace MailPoetVendor\Doctrine\ORM\Tools\Pagination;
4 if (!defined('ABSPATH')) exit;
5 use ArrayIterator;
6 use Countable;
7 use MailPoetVendor\Doctrine\Common\Collections\Collection;
8 use MailPoetVendor\Doctrine\ORM\Internal\SQLResultCasing;
9 use MailPoetVendor\Doctrine\ORM\NoResultException;
10 use MailPoetVendor\Doctrine\ORM\Query;
11 use MailPoetVendor\Doctrine\ORM\Query\Parameter;
12 use MailPoetVendor\Doctrine\ORM\Query\Parser;
13 use MailPoetVendor\Doctrine\ORM\Query\ResultSetMapping;
14 use MailPoetVendor\Doctrine\ORM\QueryBuilder;
15 use IteratorAggregate;
16 use ReturnTypeWillChange;
17 use Traversable;
18 use function array_key_exists;
19 use function array_map;
20 use function array_sum;
21 use function assert;
22 use function is_string;
23 class Paginator implements Countable, IteratorAggregate
24 {
25 use SQLResultCasing;
26 public const HINT_ENABLE_DISTINCT = 'paginator.distinct.enable';
27 private $query;
28 private $fetchJoinCollection;
29 private $useOutputWalkers;
30 private $count;
31 public function __construct($query, $fetchJoinCollection = \true)
32 {
33 if ($query instanceof QueryBuilder) {
34 $query = $query->getQuery();
35 }
36 $this->query = $query;
37 $this->fetchJoinCollection = (bool) $fetchJoinCollection;
38 }
39 public function getQuery()
40 {
41 return $this->query;
42 }
43 public function getFetchJoinCollection()
44 {
45 return $this->fetchJoinCollection;
46 }
47 public function getUseOutputWalkers()
48 {
49 return $this->useOutputWalkers;
50 }
51 public function setUseOutputWalkers($useOutputWalkers)
52 {
53 $this->useOutputWalkers = $useOutputWalkers;
54 return $this;
55 }
56 #[\ReturnTypeWillChange]
57 public function count()
58 {
59 if ($this->count === null) {
60 try {
61 $this->count = (int) array_sum(array_map('current', $this->getCountQuery()->getScalarResult()));
62 } catch (NoResultException $e) {
63 $this->count = 0;
64 }
65 }
66 return $this->count;
67 }
68 #[\ReturnTypeWillChange]
69 public function getIterator()
70 {
71 $offset = $this->query->getFirstResult();
72 $length = $this->query->getMaxResults();
73 if ($this->fetchJoinCollection && $length !== null) {
74 $subQuery = $this->cloneQuery($this->query);
75 if ($this->useOutputWalker($subQuery)) {
76 $subQuery->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, LimitSubqueryOutputWalker::class);
77 } else {
78 $this->appendTreeWalker($subQuery, LimitSubqueryWalker::class);
79 $this->unbindUnusedQueryParams($subQuery);
80 }
81 $subQuery->setFirstResult($offset)->setMaxResults($length);
82 $foundIdRows = $subQuery->getScalarResult();
83 // don't do this for an empty id array
84 if ($foundIdRows === []) {
85 return new ArrayIterator([]);
86 }
87 $whereInQuery = $this->cloneQuery($this->query);
88 $ids = array_map('current', $foundIdRows);
89 $this->appendTreeWalker($whereInQuery, WhereInWalker::class);
90 $whereInQuery->setHint(WhereInWalker::HINT_PAGINATOR_HAS_IDS, \true);
91 $whereInQuery->setFirstResult(0)->setMaxResults(null);
92 $whereInQuery->setCacheable($this->query->isCacheable());
93 $databaseIds = $this->convertWhereInIdentifiersToDatabaseValues($ids);
94 $whereInQuery->setParameter(WhereInWalker::PAGINATOR_ID_ALIAS, $databaseIds);
95 $result = $whereInQuery->getResult($this->query->getHydrationMode());
96 } else {
97 $result = $this->cloneQuery($this->query)->setMaxResults($length)->setFirstResult($offset)->setCacheable($this->query->isCacheable())->getResult($this->query->getHydrationMode());
98 }
99 return new ArrayIterator($result);
100 }
101 private function cloneQuery(Query $query) : Query
102 {
103 $cloneQuery = clone $query;
104 $cloneQuery->setParameters(clone $query->getParameters());
105 $cloneQuery->setCacheable(\false);
106 foreach ($query->getHints() as $name => $value) {
107 $cloneQuery->setHint($name, $value);
108 }
109 return $cloneQuery;
110 }
111 private function useOutputWalker(Query $query) : bool
112 {
113 if ($this->useOutputWalkers === null) {
114 return (bool) $query->getHint(Query::HINT_CUSTOM_OUTPUT_WALKER) === \false;
115 }
116 return $this->useOutputWalkers;
117 }
118 private function appendTreeWalker(Query $query, string $walkerClass) : void
119 {
120 $hints = $query->getHint(Query::HINT_CUSTOM_TREE_WALKERS);
121 if ($hints === \false) {
122 $hints = [];
123 }
124 $hints[] = $walkerClass;
125 $query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, $hints);
126 }
127 private function getCountQuery() : Query
128 {
129 $countQuery = new Query($this->query->getEntityManager());
130 $countQuery->setDQL($this->query->getDQL());
131 $countQuery->setParameters(clone $this->query->getParameters());
132 $countQuery->setCacheable(\false);
133 foreach ($this->query->getHints() as $name => $value) {
134 $countQuery->setHint($name, $value);
135 }
136 if (!$countQuery->hasHint(CountWalker::HINT_DISTINCT)) {
137 $countQuery->setHint(CountWalker::HINT_DISTINCT, \true);
138 }
139 if ($this->useOutputWalker($countQuery)) {
140 $platform = $countQuery->getEntityManager()->getConnection()->getDatabasePlatform();
141 // law of demeter win
142 $rsm = new ResultSetMapping();
143 $rsm->addScalarResult($this->getSQLResultCasing($platform, 'dctrn_count'), 'count');
144 $countQuery->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, CountOutputWalker::class);
145 $countQuery->setResultSetMapping($rsm);
146 } else {
147 $this->appendTreeWalker($countQuery, CountWalker::class);
148 $this->unbindUnusedQueryParams($countQuery);
149 }
150 $countQuery->setFirstResult(0)->setMaxResults(null);
151 return $countQuery;
152 }
153 private function unbindUnusedQueryParams(Query $query) : void
154 {
155 $parser = new Parser($query);
156 $parameterMappings = $parser->parse()->getParameterMappings();
157 $parameters = $query->getParameters();
158 foreach ($parameters as $key => $parameter) {
159 $parameterName = $parameter->getName();
160 if (!(isset($parameterMappings[$parameterName]) || array_key_exists($parameterName, $parameterMappings))) {
161 unset($parameters[$key]);
162 }
163 }
164 $query->setParameters($parameters);
165 }
166 private function convertWhereInIdentifiersToDatabaseValues(array $identifiers) : array
167 {
168 $query = $this->cloneQuery($this->query);
169 $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, RootTypeWalker::class);
170 $connection = $this->query->getEntityManager()->getConnection();
171 $type = $query->getSQL();
172 assert(is_string($type));
173 return array_map(static function ($id) use($connection, $type) {
174 return $connection->convertToDatabaseValue($id, $type);
175 }, $identifiers);
176 }
177 }
178