_startQuote . $identifier . $this->_endQuote; } $items = explode('.', $identifier); return $this->_startQuote . implode($this->_endQuote . '.' . $this->_startQuote, $items) . $this->_endQuote; } if (preg_match('/^[\w-]+\.\*$/', $identifier)) { // string.* return $this->_startQuote . str_replace('.*', $this->_endQuote . '.*', $identifier); } if (preg_match('/^([\w-]+)\((.*)\)$/', $identifier, $matches)) { // Functions return $matches[1] . '(' . $this->quoteIdentifier($matches[2]) . ')'; } if (preg_match('/^([\w-]+(\.[\w-]+|\(.*\))*)\s+AS\s*([\w-]+)$/i', $identifier, $matches)) { return preg_replace( '/\s{2,}/', ' ', $this->quoteIdentifier($matches[1]) . ' AS ' . $this->quoteIdentifier($matches[3]) ); } if (preg_match('/^[\w-_\s]*[\w-_]+/', $identifier)) { return $this->_startQuote . $identifier . $this->_endQuote; } return $identifier; } /** * Returns a callable function that will be used to transform a passed Query object. * This function, in turn, will return an instance of a Query object that has been * transformed to accommodate any specificities of the SQL dialect in use. * * @param string $type the type of query to be transformed * (select, insert, update, delete) * @return callable */ public function queryTranslator($type) { return function($query) use ($type) { $query = $this->{'_' . $type . 'QueryTranslator'}($query); if (!$this->_expressionTranslators()) { return $query; } $query->traverseExpressions(function($expression) { foreach ($this->_expressionTranslators() as $class => $method) { if ($expression instanceof $class) { $this->{$method}($expression); } } }); return $query; }; } /** * Returns an associative array of methods that will transform Expression * objects to conform with the specific SQL dialect. Keys are class names * and values a method in this class. * * @return void */ protected function _expressionTranslators() { return []; } /** * Apply translation steps to select queries. * * @param Query $query The query to translate * @return Query The modified query */ protected function _selectQueryTranslator($query) { if (is_array($query->clause('distinct'))) { $query->group($query->clause('distinct'), true); $query->distinct(false); } return $query; } /** * Apply translation steps to delete queries. * * @param Query $query The query to translate * @return Query The modified query */ protected function _deleteQueryTranslator($query) { return $query; } /** * Apply translation steps to update queries. * * @param Query $query The query to translate * @return Query The modified query */ protected function _updateQueryTranslator($query) { return $query; } /** * Apply translation steps to insert queries. * * @param Query $query The query to translate * @return Query The modified query */ protected function _insertQueryTranslator($query) { return $query; } /** * Returns a SQL snippet for creating a new transaction savepoint * * @param string save point name * @return string */ public function savePointSQL($name) { return 'SAVEPOINT LEVEL' . $name; } /** * Returns a SQL snippet for releasing a previously created save point * * @param string save point name * @return string */ public function releaseSavePointSQL($name) { return 'RELEASE SAVEPOINT LEVEL' . $name; } /** * Returns a SQL snippet for rollbacking a previously created save point * * @param string save point name * @return string */ public function rollbackSavePointSQL($name) { return 'ROLLBACK TO SAVEPOINT LEVEL' . $name; } }