tarantool-php /
client
| 1 | <?php |
||
| 2 | |||
| 3 | /** |
||
| 4 | * This file is part of the tarantool/client package. |
||
| 5 | * |
||
| 6 | * (c) Eugene Leonovich <[email protected]> |
||
| 7 | * |
||
| 8 | * For the full copyright and license information, please view the LICENSE |
||
| 9 | * file that was distributed with this source code. |
||
| 10 | */ |
||
| 11 | |||
| 12 | declare(strict_types=1); |
||
| 13 | |||
| 14 | namespace Tarantool\Client\Schema; |
||
| 15 | |||
| 16 | use Tarantool\Client\Exception\RequestFailed; |
||
| 17 | use Tarantool\Client\Handler\Handler; |
||
| 18 | use Tarantool\Client\Keys; |
||
| 19 | use Tarantool\Client\Request\DeleteRequest; |
||
| 20 | use Tarantool\Client\Request\InsertRequest; |
||
| 21 | use Tarantool\Client\Request\ReplaceRequest; |
||
| 22 | use Tarantool\Client\Request\SelectRequest; |
||
| 23 | use Tarantool\Client\Request\UpdateRequest; |
||
| 24 | use Tarantool\Client\Request\UpsertRequest; |
||
| 25 | |||
| 26 | final class Space |
||
| 27 | { |
||
| 28 | public const VSPACE_ID = 281; |
||
| 29 | public const VSPACE_NAME_INDEX = 2; |
||
| 30 | public const VINDEX_ID = 289; |
||
| 31 | public const VINDEX_NAME_INDEX = 2; |
||
| 32 | |||
| 33 | private $handler; |
||
| 34 | private $id; |
||
| 35 | |||
| 36 | /** @var array<string, int> */ |
||
| 37 | private $indexes = []; |
||
| 38 | |||
| 39 | 275 | public function __construct(Handler $handler, int $id) |
|
| 40 | { |
||
| 41 | 275 | $this->handler = $handler; |
|
| 42 | 275 | $this->id = $id; |
|
| 43 | } |
||
| 44 | |||
| 45 | 8 | public function getId() : int |
|
| 46 | { |
||
| 47 | 8 | return $this->id; |
|
| 48 | } |
||
| 49 | |||
| 50 | 275 | public function select(Criteria $criteria) : array |
|
| 51 | { |
||
| 52 | 275 | $index = $criteria->getIndex(); |
|
| 53 | |||
| 54 | 275 | if (\is_string($index)) { |
|
| 55 | 60 | $index = $this->getIndexIdByName($index); |
|
| 56 | } |
||
| 57 | |||
| 58 | 275 | $request = new SelectRequest( |
|
| 59 | 275 | $this->id, |
|
| 60 | 275 | $index, |
|
| 61 | 275 | $criteria->getKey(), |
|
| 62 | 275 | $criteria->getOffset(), |
|
| 63 | 275 | $criteria->getLimit(), |
|
| 64 | 275 | $criteria->getIterator() |
|
| 65 | 275 | ); |
|
| 66 | |||
| 67 | 275 | return $this->handler->handle($request)->getBodyField(Keys::DATA); |
|
| 68 | } |
||
| 69 | |||
| 70 | /** |
||
| 71 | * @psalm-param non-empty-array<int, mixed> $tuple |
||
| 72 | */ |
||
| 73 | 76 | public function insert(array $tuple) : array |
|
| 74 | { |
||
| 75 | 76 | $request = new InsertRequest($this->id, $tuple); |
|
| 76 | |||
| 77 | 76 | return $this->handler->handle($request)->getBodyField(Keys::DATA); |
|
| 78 | } |
||
| 79 | |||
| 80 | /** |
||
| 81 | * @psalm-param non-empty-array<int, mixed> $tuple |
||
| 82 | */ |
||
| 83 | 12 | public function replace(array $tuple) : array |
|
| 84 | { |
||
| 85 | 12 | $request = new ReplaceRequest($this->id, $tuple); |
|
| 86 | |||
| 87 | 12 | return $this->handler->handle($request)->getBodyField(Keys::DATA); |
|
| 88 | } |
||
| 89 | |||
| 90 | /** |
||
| 91 | * @psalm-param non-empty-array<int, mixed> $key |
||
| 92 | * @param int|string $index |
||
| 93 | */ |
||
| 94 | 40 | public function update(array $key, Operations $operations, $index = 0) : array |
|
| 95 | { |
||
| 96 | 40 | if (\is_string($index)) { |
|
| 97 | 8 | $index = $this->getIndexIdByName($index); |
|
| 98 | } |
||
| 99 | |||
| 100 | 36 | $request = new UpdateRequest($this->id, $index, $key, $operations->toArray()); |
|
| 101 | |||
| 102 | 36 | return $this->handler->handle($request)->getBodyField(Keys::DATA); |
|
| 103 | } |
||
| 104 | |||
| 105 | /** |
||
| 106 | * @psalm-param non-empty-array<int, mixed> $tuple |
||
| 107 | */ |
||
| 108 | 8 | public function upsert(array $tuple, Operations $operations) : void |
|
| 109 | { |
||
| 110 | 8 | $request = new UpsertRequest($this->id, $tuple, $operations->toArray()); |
|
| 111 | |||
| 112 | 8 | $this->handler->handle($request); |
|
| 113 | } |
||
| 114 | |||
| 115 | /** |
||
| 116 | * @psalm-param non-empty-array<int, mixed> $key |
||
| 117 | * @param int|string $index |
||
| 118 | */ |
||
| 119 | 24 | public function delete(array $key, $index = 0) : array |
|
| 120 | { |
||
| 121 | 24 | if (\is_string($index)) { |
|
| 122 | 4 | $index = $this->getIndexIdByName($index); |
|
| 123 | } |
||
| 124 | |||
| 125 | 24 | $request = new DeleteRequest($this->id, $index, $key); |
|
| 126 | |||
| 127 | 24 | return $this->handler->handle($request)->getBodyField(Keys::DATA); |
|
| 128 | } |
||
| 129 | |||
| 130 | 8 | public function flushIndexes() : void |
|
| 131 | { |
||
| 132 | 8 | $this->indexes = []; |
|
| 133 | } |
||
| 134 | |||
| 135 | 72 | private function getIndexIdByName(string $indexName) : int |
|
| 136 | { |
||
| 137 | 72 | if (isset($this->indexes[$indexName])) { |
|
| 138 | 4 | return $this->indexes[$indexName]; |
|
| 139 | } |
||
| 140 | |||
| 141 | 72 | $schema = new self($this->handler, self::VINDEX_ID); |
|
| 142 | 72 | $data = $schema->select(Criteria::key([$this->id, $indexName])->andIndex(self::VINDEX_NAME_INDEX)); |
|
| 143 | |||
| 144 | 72 | if ($data) { |
|
|
0 ignored issues
–
show
|
|||
| 145 | 64 | return $this->indexes[$indexName] = $data[0][1]; |
|
| 146 | } |
||
| 147 | |||
| 148 | 8 | throw RequestFailed::unknownIndex($indexName, $this->id); |
|
| 149 | } |
||
| 150 | } |
||
| 151 |
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)or! empty(...)instead.