1, "hits_prioritize" => 2, "prioritize" => 3, "prioritize_position" => 4, ]; /** * @var CacheHandler|null */ protected $cacheHandler; /** * @var DocumentFinder */ protected $documentFinder; /** * @var DocumentUpdater */ protected $documentUpdater; /** * Query constructor. * @param QueryBuilder $queryBuilder */ public function __construct(QueryBuilder $queryBuilder) { $store = $queryBuilder->_getStore(); $primaryKey = $store->getPrimaryKey(); $this->cacheHandler = new CacheHandler($store->getStorePath(), $queryBuilder); $this->documentFinder = new DocumentFinder($store->getStorePath(), $queryBuilder->_getConditionProperties(), $primaryKey); $this->documentUpdater = new DocumentUpdater($store->getStorePath(), $primaryKey); } /** * Execute query and get results. * @return array * @throws InvalidArgumentException * @throws IOException */ public function fetch(): array { return $this->getResults(); } /** * Check if data is found. * @return bool * @throws InvalidArgumentException * @throws IOException */ public function exists(): bool { // Return boolean on data exists check. return !empty($this->first()); } /** * Return the first document. * @return array empty array or single document * @throws InvalidArgumentException * @throws IOException */ public function first(): array { return $this->getResults(true); } /** * Update parts of one or multiple documents based on current query. * @param array $updatable * @param bool $returnUpdatedDocuments * @return array|bool * @throws InvalidArgumentException * @throws IOException */ public function update(array $updatable, bool $returnUpdatedDocuments = false){ if(empty($updatable)){ throw new InvalidArgumentException("You have to define what you want to update."); } $results = $this->documentFinder->findDocuments(false, false); $this->getCacheHandler()->deleteAllWithNoLifetime(); return $this->documentUpdater->updateResults($results, $updatable, $returnUpdatedDocuments); } /** * Delete one or multiple documents based on current query. * @param int $returnOption * @return bool|array|int * @throws InvalidArgumentException * @throws IOException */ public function delete(int $returnOption = self::DELETE_RETURN_BOOL){ $results = $this->documentFinder->findDocuments(false, false); $this->getCacheHandler()->deleteAllWithNoLifetime(); return $this->documentUpdater->deleteResults($results, $returnOption); } /** * Remove fields of one or multiple documents based on current query. * @param array $fieldsToRemove * @return array|false * @throws IOException * @throws InvalidArgumentException */ public function removeFields(array $fieldsToRemove) { if(empty($fieldsToRemove)){ throw new InvalidArgumentException("You have to define what fields you want to remove."); } $results = $this->documentFinder->findDocuments(false, false); $this->getCacheHandler()->deleteAllWithNoLifetime(); return $this->documentUpdater->removeFields($results, $fieldsToRemove); } /** * Retrieve Cache object. * @return Cache */ public function getCache(): Cache { return $this->getCacheHandler()->getCache(); } /** * Retrieve the results from either the cache or store. * @param bool $getOneDocument * @return array * @throws IOException * @throws InvalidArgumentException */ private function getResults(bool $getOneDocument = false): array { $results = $this->getCacheHandler()->getCacheContent($getOneDocument); if($results !== null) { return $results; } $results = $this->documentFinder->findDocuments($getOneDocument, true); if ($getOneDocument === true && count($results) > 0) { list($item) = $results; $results = $item; } $this->getCacheHandler()->setCacheContent($results); return $results; } /** * Retrieve the caching layer bridge. * @return CacheHandler */ private function getCacheHandler(): CacheHandler { return $this->cacheHandler; } }