Browse Source

Remove unnecessary use of closures.

ADmad 3 years ago
parent
commit
fd363b4d41

+ 32 - 34
src/Database/Driver.php

@@ -34,7 +34,6 @@ use Cake\Database\Schema\SchemaDialect;
 use Cake\Database\Schema\TableSchema;
 use Cake\Database\Schema\TableSchemaInterface;
 use Cake\Database\Statement\Statement;
-use Closure;
 use InvalidArgumentException;
 use PDO;
 use PDOException;
@@ -463,44 +462,44 @@ abstract class Driver
     }
 
     /**
-     * Returns a closure 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.
+     * Transform the query 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 \Closure
+     * It will also quote the identifiers if auto quoting is enabled.
+     *
+     * @param \Cake\Database\Query $query Query to transform.
+     * @return \Cake\Database\Query
      */
-    public function queryTranslator(string $type): Closure
+    protected function transformQuery(Query $query): Query
     {
-        return function ($query) use ($type) {
-            if ($this->isAutoQuotingEnabled()) {
-                $query = (new IdentifierQuoter($this))->quote($query);
-            }
+        if ($this->isAutoQuotingEnabled()) {
+            $query = (new IdentifierQuoter($this))->quote($query);
+        }
 
-            $query = match ($type) {
-                'select' => $this->_selectQueryTranslator($query),
-                'insert' => $this->_insertQueryTranslator($query),
-                'update' => $this->_updateQueryTranslator($query),
-                'delete' => $this->_deleteQueryTranslator($query),
-                default => throw new InvalidArgumentException('Valid types are: select, insert, update, delete'),
-            };
-
-            $translators = $this->_expressionTranslators();
-            if (!$translators) {
-                return $query;
-            }
+        $query = match (true) {
+            $query instanceof SelectQuery => $this->_selectQueryTranslator($query),
+            $query instanceof InsertQuery => $this->_insertQueryTranslator($query),
+            $query instanceof UpdateQuery => $this->_updateQueryTranslator($query),
+            $query instanceof DeleteQuery => $this->_deleteQueryTranslator($query),
+            default => throw new InvalidArgumentException(sprintf(
+                'Instance of SelectQuery, UpdateQuery, InsertQuery, DeleteQuery expected. Found `%s` instead.',
+                get_debug_type($query)
+            )),
+        };
 
-            $query->traverseExpressions(function ($expression) use ($translators, $query): void {
-                foreach ($translators as $class => $method) {
-                    if ($expression instanceof $class) {
-                        $this->{$method}($expression, $query);
-                    }
+        $translators = $this->_expressionTranslators();
+        if (!$translators) {
+            return $query;
+        }
+
+        $query->traverseExpressions(function ($expression) use ($translators, $query): void {
+            foreach ($translators as $class => $method) {
+                if ($expression instanceof $class) {
+                    $this->{$method}($expression, $query);
                 }
-            });
+            }
+        });
 
-            return $query;
-        };
+        return $query;
     }
 
     /**
@@ -865,8 +864,7 @@ abstract class Driver
     public function compileQuery(Query $query, ValueBinder $binder): string
     {
         $processor = $this->newCompiler();
-        $translator = $this->queryTranslator($query->type());
-        $query = $translator($query);
+        $query = $this->transformQuery($query);
 
         return $processor->compile($query, $binder);
     }

+ 7 - 17
tests/TestCase/Database/Driver/PostgresTest.php

@@ -19,7 +19,6 @@ namespace Cake\Test\TestCase\Database\Driver;
 use Cake\Database\Connection;
 use Cake\Database\Driver\Postgres;
 use Cake\Database\DriverFeatureEnum;
-use Cake\Database\Query\InsertQuery;
 use Cake\Database\Query\SelectQuery;
 use Cake\Datasource\ConnectionManager;
 use Cake\TestSuite\TestCase;
@@ -152,28 +151,19 @@ class PostgresTest extends TestCase
      */
     public function testInsertReturning(): void
     {
-        $driver = $this->getMockBuilder('Cake\Database\Driver\Postgres')
+        $driver = $this->getMockBuilder(Postgres::class)
             ->onlyMethods(['createPdo', 'getPdo', 'connect', 'enabled'])
             ->setConstructorArgs([[]])
             ->getMock();
         $driver->method('enabled')->willReturn(true);
         $connection = new Connection(['driver' => $driver, 'log' => false]);
 
-        $query = new InsertQuery($connection);
-        $query->insert(['id', 'title'])
-            ->into('articles')
-            ->values([1, 'foo']);
-        $translator = $driver->queryTranslator('insert');
-        $query = $translator($query);
-        $this->assertSame('RETURNING *', $query->clause('epilog'));
-
-        $query = new InsertQuery($connection);
-        $query->insert(['id', 'title'])
-            ->into('articles')
-            ->values([1, 'foo'])
-            ->epilog('FOO');
-        $query = $translator($query);
-        $this->assertSame('FOO', $query->clause('epilog'));
+        $query = $connection->insertQuery('articles', ['id' => 1, 'title' => 'foo']);
+        $this->assertStringEndsWith(' RETURNING *', $query->sql());
+
+        $query = $connection->insertQuery('articles', ['id' => 1, 'title' => 'foo']);
+        $query->epilog('FOO');
+        $this->assertStringEndsWith(' FOO', $query->sql());
     }
 
     /**

+ 6 - 8
tests/TestCase/Database/DriverTest.php

@@ -224,7 +224,7 @@ class DriverTest extends TestCase
             ->willReturn('1');
 
         $driver = $this->getMockBuilder(Driver::class)
-            ->onlyMethods(['newCompiler', 'queryTranslator'])
+            ->onlyMethods(['newCompiler', 'transformQuery'])
             ->getMockForAbstractClass();
 
         $driver
@@ -232,18 +232,16 @@ class DriverTest extends TestCase
             ->method('newCompiler')
             ->willReturn($compiler);
 
-        $driver
-            ->expects($this->once())
-            ->method('queryTranslator')
-            ->willReturn(function ($query) {
-                return $query;
-            });
-
         $query = $this->getMockBuilder(Query::class)
             ->disableOriginalConstructor()
             ->getMock();
         $query->method('type')->will($this->returnValue('select'));
 
+        $driver
+            ->expects($this->once())
+            ->method('transformQuery')
+            ->willReturn($query);
+
         $result = $driver->compileQuery($query, new ValueBinder());
 
         $this->assertSame('1', $result);