config = $config; $this->selectBuilderFactory = $selectBuilderFactory; $this->assemblers = $assemblers; $this->queryCache = $queryCache; $this->objectManager = $objectManager; $this->selectHydrator = $selectHydrator; } /** * Returns query connection name according to configuration * * @param string $queryConfig * @return string */ private function getQueryConnectionName($queryConfig) { $connectionName = 'default'; if (isset($queryConfig['connection'])) { $connectionName = $queryConfig['connection']; } return $connectionName; } /** * Create query according to configuration settings * * @param string $queryName * @return Query */ private function constructQuery($queryName) { $queryConfig = $this->config->get($queryName); $selectBuilder = $this->selectBuilderFactory->create(); $selectBuilder->setConnectionName($this->getQueryConnectionName($queryConfig)); foreach ($this->assemblers as $assembler) { $selectBuilder = $assembler->assemble($selectBuilder, $queryConfig); } $select = $selectBuilder->create(); return $this->objectManager->create( Query::class, [ 'select' => $select, 'selectHydrator' => $this->selectHydrator, 'connectionName' => $selectBuilder->getConnectionName(), 'config' => $queryConfig ] ); } /** * Creates query by name * * @param string $queryName * @return Query */ public function create($queryName) { $cached = $this->queryCache->load($queryName); if ($cached) { $queryData = json_decode($cached, true); return $this->objectManager->create( Query::class, [ 'select' => $this->selectHydrator->recreate($queryData['select_parts']), 'selectHydrator' => $this->selectHydrator, 'connectionName' => $queryData['connectionName'], 'config' => $queryData['config'] ] ); } $query = $this->constructQuery($queryName); $this->queryCache->save(json_encode($query), $queryName); return $query; } }