| @@ 12-147 (lines=136) @@ | ||
| 9 | use InvalidArgumentException; |
|
| 10 | use RuntimeException; |
|
| 11 | ||
| 12 | class ConfiguredQuery |
|
| 13 | { |
|
| 14 | /** |
|
| 15 | * @var QueryBuilder |
|
| 16 | */ |
|
| 17 | private $queryBuilder; |
|
| 18 | ||
| 19 | /** |
|
| 20 | * @var array|OrderingConfiguration[] associative, keys are strings for ordering fields |
|
| 21 | */ |
|
| 22 | private $orderingConfigurations; |
|
| 23 | ||
| 24 | /** |
|
| 25 | * @var bool |
|
| 26 | */ |
|
| 27 | private $totalCountNeeded; |
|
| 28 | ||
| 29 | /** |
|
| 30 | * @var int|null |
|
| 31 | */ |
|
| 32 | private $maximumOffset; |
|
| 33 | ||
| 34 | /** |
|
| 35 | * @var callable |
|
| 36 | */ |
|
| 37 | private $itemTransformer; |
|
| 38 | ||
| 39 | public function __construct(QueryBuilder $queryBuilder) |
|
| 40 | { |
|
| 41 | $this->queryBuilder = $queryBuilder; |
|
| 42 | $this->orderingConfigurations = []; |
|
| 43 | $this->totalCountNeeded = false; |
|
| 44 | } |
|
| 45 | ||
| 46 | public function addOrderingConfiguration(string $orderBy, OrderingConfiguration $configuration): self |
|
| 47 | { |
|
| 48 | if ($configuration->getAccessorPath() === null && $configuration->getAccessorClosure() === null) { |
|
| 49 | throw new InvalidArgumentException( |
|
| 50 | 'Must set either accessorPath or accessorClosure for every OrderingConfiguration' |
|
| 51 | ); |
|
| 52 | } |
|
| 53 | $this->orderingConfigurations[$orderBy] = $configuration; |
|
| 54 | return $this; |
|
| 55 | } |
|
| 56 | ||
| 57 | /** |
|
| 58 | * @param array|OrderingConfiguration[] $orderingConfigurations array of `orderBy => OrderingConfiguration` pairs |
|
| 59 | * @return ConfiguredQuery |
|
| 60 | */ |
|
| 61 | public function addOrderingConfigurations(array $orderingConfigurations): self |
|
| 62 | { |
|
| 63 | foreach ($orderingConfigurations as $orderBy => $configuration) { |
|
| 64 | $this->addOrderingConfiguration($orderBy, $configuration); |
|
| 65 | } |
|
| 66 | ||
| 67 | return $this; |
|
| 68 | } |
|
| 69 | ||
| 70 | public function getOrderingConfigurationFor(string $orderBy): OrderingConfiguration |
|
| 71 | { |
|
| 72 | if (!isset($this->orderingConfigurations[$orderBy])) { |
|
| 73 | throw new InvalidOrderByException($orderBy); |
|
| 74 | } |
|
| 75 | ||
| 76 | return $this->orderingConfigurations[$orderBy]; |
|
| 77 | } |
|
| 78 | ||
| 79 | /** |
|
| 80 | * @return QueryBuilder |
|
| 81 | */ |
|
| 82 | public function getQueryBuilder(): QueryBuilder |
|
| 83 | { |
|
| 84 | return $this->queryBuilder; |
|
| 85 | } |
|
| 86 | ||
| 87 | /** |
|
| 88 | * @return bool |
|
| 89 | */ |
|
| 90 | public function isTotalCountNeeded(): bool |
|
| 91 | { |
|
| 92 | return $this->totalCountNeeded; |
|
| 93 | } |
|
| 94 | ||
| 95 | /** |
|
| 96 | * @param bool $totalCountNeeded |
|
| 97 | * @return $this |
|
| 98 | */ |
|
| 99 | public function setTotalCountNeeded(bool $totalCountNeeded): self |
|
| 100 | { |
|
| 101 | $this->totalCountNeeded = $totalCountNeeded; |
|
| 102 | return $this; |
|
| 103 | } |
|
| 104 | ||
| 105 | /** |
|
| 106 | * @param int $maximumOffset |
|
| 107 | * @return $this |
|
| 108 | */ |
|
| 109 | public function setMaximumOffset(int $maximumOffset): self |
|
| 110 | { |
|
| 111 | $this->maximumOffset = $maximumOffset; |
|
| 112 | return $this; |
|
| 113 | } |
|
| 114 | ||
| 115 | public function hasMaximumOffset(): bool |
|
| 116 | { |
|
| 117 | return $this->maximumOffset !== null; |
|
| 118 | } |
|
| 119 | ||
| 120 | /** |
|
| 121 | * @return int |
|
| 122 | * @throws RuntimeException if maximum offset was not set. Check with hasMaximumOffset beforehand |
|
| 123 | */ |
|
| 124 | public function getMaximumOffset(): int |
|
| 125 | { |
|
| 126 | if ($this->maximumOffset === null) { |
|
| 127 | throw new RuntimeException('Maximum offset was not set'); |
|
| 128 | } |
|
| 129 | ||
| 130 | return $this->maximumOffset; |
|
| 131 | } |
|
| 132 | ||
| 133 | /** |
|
| 134 | * @return callable|null |
|
| 135 | */ |
|
| 136 | public function getItemTransformer() |
|
| 137 | { |
|
| 138 | return $this->itemTransformer; |
|
| 139 | } |
|
| 140 | ||
| 141 | public function setItemTransformer(callable $itemTransformer): self |
|
| 142 | { |
|
| 143 | $this->itemTransformer = $itemTransformer; |
|
| 144 | ||
| 145 | return $this; |
|
| 146 | } |
|
| 147 | } |
|
| 148 | ||
| @@ 12-147 (lines=136) @@ | ||
| 9 | use InvalidArgumentException; |
|
| 10 | use RuntimeException; |
|
| 11 | ||
| 12 | class ConfiguredQuery |
|
| 13 | { |
|
| 14 | /** |
|
| 15 | * @var QueryBuilder |
|
| 16 | */ |
|
| 17 | private $queryBuilder; |
|
| 18 | ||
| 19 | /** |
|
| 20 | * @var array|OrderingConfiguration[] associative, keys are strings for ordering fields |
|
| 21 | */ |
|
| 22 | private $orderingConfigurations; |
|
| 23 | ||
| 24 | /** |
|
| 25 | * @var bool |
|
| 26 | */ |
|
| 27 | private $totalCountNeeded; |
|
| 28 | ||
| 29 | /** |
|
| 30 | * @var int|null |
|
| 31 | */ |
|
| 32 | private $maximumOffset; |
|
| 33 | ||
| 34 | /** |
|
| 35 | * @var callable |
|
| 36 | */ |
|
| 37 | private $itemTransformer; |
|
| 38 | ||
| 39 | public function __construct(QueryBuilder $queryBuilder) |
|
| 40 | { |
|
| 41 | $this->queryBuilder = $queryBuilder; |
|
| 42 | $this->orderingConfigurations = []; |
|
| 43 | $this->totalCountNeeded = false; |
|
| 44 | } |
|
| 45 | ||
| 46 | public function addOrderingConfiguration(string $orderBy, OrderingConfiguration $configuration): self |
|
| 47 | { |
|
| 48 | if ($configuration->getAccessorPath() === null && $configuration->getAccessorClosure() === null) { |
|
| 49 | throw new InvalidArgumentException( |
|
| 50 | 'Must set either accessorPath or accessorClosure for every OrderingConfiguration' |
|
| 51 | ); |
|
| 52 | } |
|
| 53 | $this->orderingConfigurations[$orderBy] = $configuration; |
|
| 54 | return $this; |
|
| 55 | } |
|
| 56 | ||
| 57 | /** |
|
| 58 | * @param array|OrderingConfiguration[] $orderingConfigurations array of `orderBy => OrderingConfiguration` pairs |
|
| 59 | * @return ConfiguredQuery |
|
| 60 | */ |
|
| 61 | public function addOrderingConfigurations(array $orderingConfigurations): self |
|
| 62 | { |
|
| 63 | foreach ($orderingConfigurations as $orderBy => $configuration) { |
|
| 64 | $this->addOrderingConfiguration($orderBy, $configuration); |
|
| 65 | } |
|
| 66 | ||
| 67 | return $this; |
|
| 68 | } |
|
| 69 | ||
| 70 | public function getOrderingConfigurationFor(string $orderBy): OrderingConfiguration |
|
| 71 | { |
|
| 72 | if (!isset($this->orderingConfigurations[$orderBy])) { |
|
| 73 | throw new InvalidOrderByException($orderBy); |
|
| 74 | } |
|
| 75 | ||
| 76 | return $this->orderingConfigurations[$orderBy]; |
|
| 77 | } |
|
| 78 | ||
| 79 | /** |
|
| 80 | * @return QueryBuilder |
|
| 81 | */ |
|
| 82 | public function getQueryBuilder(): QueryBuilder |
|
| 83 | { |
|
| 84 | return $this->queryBuilder; |
|
| 85 | } |
|
| 86 | ||
| 87 | /** |
|
| 88 | * @return bool |
|
| 89 | */ |
|
| 90 | public function isTotalCountNeeded(): bool |
|
| 91 | { |
|
| 92 | return $this->totalCountNeeded; |
|
| 93 | } |
|
| 94 | ||
| 95 | /** |
|
| 96 | * @param bool $totalCountNeeded |
|
| 97 | * @return $this |
|
| 98 | */ |
|
| 99 | public function setTotalCountNeeded(bool $totalCountNeeded): self |
|
| 100 | { |
|
| 101 | $this->totalCountNeeded = $totalCountNeeded; |
|
| 102 | return $this; |
|
| 103 | } |
|
| 104 | ||
| 105 | /** |
|
| 106 | * @param int $maximumOffset |
|
| 107 | * @return $this |
|
| 108 | */ |
|
| 109 | public function setMaximumOffset(int $maximumOffset): self |
|
| 110 | { |
|
| 111 | $this->maximumOffset = $maximumOffset; |
|
| 112 | return $this; |
|
| 113 | } |
|
| 114 | ||
| 115 | public function hasMaximumOffset(): bool |
|
| 116 | { |
|
| 117 | return $this->maximumOffset !== null; |
|
| 118 | } |
|
| 119 | ||
| 120 | /** |
|
| 121 | * @return int |
|
| 122 | * @throws RuntimeException if maximum offset was not set. Check with hasMaximumOffset beforehand |
|
| 123 | */ |
|
| 124 | public function getMaximumOffset(): int |
|
| 125 | { |
|
| 126 | if ($this->maximumOffset === null) { |
|
| 127 | throw new RuntimeException('Maximum offset was not set'); |
|
| 128 | } |
|
| 129 | ||
| 130 | return $this->maximumOffset; |
|
| 131 | } |
|
| 132 | ||
| 133 | /** |
|
| 134 | * @return callable|null |
|
| 135 | */ |
|
| 136 | public function getItemTransformer() |
|
| 137 | { |
|
| 138 | return $this->itemTransformer; |
|
| 139 | } |
|
| 140 | ||
| 141 | public function setItemTransformer(callable $itemTransformer): self |
|
| 142 | { |
|
| 143 | $this->itemTransformer = $itemTransformer; |
|
| 144 | ||
| 145 | return $this; |
|
| 146 | } |
|
| 147 | } |
|
| 148 | ||