register = $register; $this->adapter = $adapter; } /** * Get Document * * @param string $id * @return array * @throws Exception */ public function getDocument($id) { $output = json_decode($this->getRedis()->get($this->getNamespace() . ':document-' . $id), true); if(!$output) { $output = $this->adapter->getDocument($id); $this->getRedis()->set($this->getNamespace() . ':document-' . $id, json_encode($output, JSON_UNESCAPED_UNICODE)); } $output = $this->parseRelations($output); return $output; } /** * @param $output * @return mixed * @throws Exception */ protected function parseRelations($output) { $keys = []; if(empty($output) || !isset($output['temp-relations'])) { return $output; } foreach($output['temp-relations'] as $relationship) { $keys[] = $this->getNamespace() . ':document-' . $relationship['end']; } $nodes = (!empty($keys)) ? $this->getRedis()->mget($keys) : []; foreach($output['temp-relations'] as $i => $relationship) { $node = $relationship['end']; $node = (!empty($nodes[$i])) ? $this->parseRelations(json_decode($nodes[$i], true)) : $this->getDocument($node); if(empty($node)) { continue; } if($relationship['array']) { $output[$relationship['key']][] = $node; } else { $output[$relationship['key']] = $node; } } unset($output['temp-relations']); return $output; } /** * Create Document * * @param array $data * @return array * @throws Exception */ public function createDocument(array $data = []) { $data = $this->adapter->createDocument($data); $this->getRedis()->expire($this->getNamespace() . ':document-' . $data['$uid'], 0); $this->getRedis()->expire($this->getNamespace() . ':document-' . $data['$uid'], 0); return $data; } /** * Update Document * * @param array $data * @return array * @throws Exception */ public function updateDocument(array $data = []) { $data = $this->adapter->updateDocument($data); $this->getRedis()->expire($this->getNamespace() . ':document-' . $data['$uid'], 0); $this->getRedis()->expire($this->getNamespace() . ':document-' . $data['$uid'], 0); return $data; } /** * Delete Document * * @param $id * @return array * @throws Exception */ public function deleteDocument($id) { $data = $this->adapter->deleteDocument($id); $this->getRedis()->expire($this->getNamespace() . ':document-' . $id, 0); $this->getRedis()->expire($this->getNamespace() . ':document-' . $id, 0); return $data; } /** * Create Namespace * * @param string $namespace * @return bool */ public function createNamespace($namespace) { return $this->adapter->createNamespace($namespace); } /** * Delete Namespace * * @param string $namespace * @return bool */ public function deleteNamespace($namespace) { return $this->adapter->deleteNamespace($namespace); } /** * @param array $options * @return array * @throws Exception */ public function getCollection(array $options) { $data = $this->adapter->getCollection($options); $keys = []; foreach($data as $node) { $keys[] = $this->getNamespace() . ':document-' . $node; } $nodes = (!empty($keys)) ? $this->getRedis()->mget($keys) : []; foreach($data as $i => &$node) { $temp = (!empty($nodes[$i])) ? $this->parseRelations(json_decode($nodes[$i], true)) : $this->getDocument($node); if(!empty($temp)) { $node = $temp; } } return $data; } /** * @param array $options * @return int * @throws Exception */ public function getCount(array $options) { return $this->adapter->getCount($options); } /** * Last Modified * * Return unix timestamp of last time a node queried in current session has been changed * * @return int */ public function lastModified() { return null; } /** * @return array */ public function getDebug() { return $this->adapter->getDebug(); } /** * @throws Exception * @return Client */ protected function getRedis():Client { return $this->register->get('cache'); } /** * Set Namespace * * Set namespace to divide different scope of data sets * * @param $namespace * @return bool * @throws Exception */ public function setNamespace($namespace) { $this->adapter->setNamespace($namespace); return parent::setNamespace($namespace); } }