client = $client; } public function exists(string $key): bool { return 1 === $this->client->exists($key); } /** * @param AbstractRangeQuery $rangeQuery * @return Value[] */ public function range(AbstractRangeQuery $rangeQuery): array { $response = $this->send($rangeQuery); return array_map([$this, 'extractValue'], $response); } /** * @param AbstractMRangeQuery $mRangeQuery * @return Range[] */ public function mrange(AbstractMRangeQuery $mRangeQuery): array { $response = $this->send($mRangeQuery); return array_map([$this, 'extractRange'], $response); } public function get(GetQuery $query): ?Value { $response = $this->send($query); return empty($response) ? null : $this->extractValue($response); } /** * @param MGetQuery $query * @return Range[] */ public function mget(MGetQuery $query): array { $response = $this->send($query); return array_map([$this, 'extractRange'], $response); } private function extractValue(array $row): Value { return new Value((int)$row[0], (float)$row[1]->getPayload()); } private function extractRange(array $row): Range { $labels = []; foreach ($row[1] as $labelRow) { $labels[$labelRow[0]] = $labelRow[1]; } // Difference between mrange and range if (empty($row[2])) { $values = []; } else if (is_object(@$row[2][1])) { $values = [$this->extractValue($row[2])]; } else { $values = array_map([$this, 'extractValue'], $row[2]); } return new Range($row[0], $labels, $values); } /** * @param Query $command * @return array|int */ protected function send(Query $command) { $response = $this->client->executeRaw($command->toRawCommand()); if (is_string($response) && 0 !== strpos($response, 'OK')) { throw new DatabaseException($response); } return $response; } }