diff --git a/CHANGELOG.md b/CHANGELOG.md index 38efe67fe..11d768cde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -64,10 +64,12 @@ - Enh #929: Implement lazy arrays for array, structured and JSON column types (@Tigrov) - Bug #933: Explicitly mark nullable parameters (@vjik) - Chg #911: Change supported PHP versions to `8.1 - 8.4` (@Tigrov) -- Enh #911: Minor refactoring (@Tigrov) +- Enh #911, #940: Minor refactoring (@Tigrov) - Chg #938, #936, #937: Remove `ext-json`, `ext-ctype`, `ext-mbstring` from `require` section of `composer.json` (@Tigrov) - Chg #936: Remove `hasLimit()` and `hasOffset()` methods from `AbstractDQLQueryBuilder` class (@Tigrov) - Chg #937: Remove `baseName()` and `pascalCaseToId()` methods from `DbStringHelper` (@Tigrov) +- Enh #940: Rename `quoter()` method to `getQuoter()` in `QueryBuilderInterface` and `AbstractQueryBuilder` class (@Tigrov) +- Enh #940: Change constructor parameters in `AbstractQueryBuilder` class (@Tigrov) - New #939: Add `caseSensitive` option to like condition (@vjik) ## 1.3.0 March 21, 2024 diff --git a/UPGRADE.md b/UPGRADE.md index efcfb4a3b..a38216a74 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -117,12 +117,13 @@ Each table column has its own class in the `Yiisoft\Db\Schema\Column` namespace ### New methods - `QuoterInterface::getRawTableName()` - returns the raw table name without quotes; -- `SchemaInterface::getColumnFactory()` - returns the column factory object for concrete DBMS; +- `ConnectionInterface::getColumnFactory()` - returns the column factory object for concrete DBMS; +- `ConnectionInterface::getServerInfo()` - returns `ServerInfoInterface` instance which provides server information; - `QueryBuilderInterface::buildColumnDefinition()` - builds column definition for `CREATE TABLE` statement; - `QueryBuilderInterface::prepareParam()` - converts a `ParamInterface` object to its SQL representation; - `QueryBuilderInterface::prepareValue()` - converts a value to its SQL representation; +- `QueryBuilderInterface::getColumnFactory()` - returns the column factory object for concrete DBMS; - `QueryBuilderInterface::getServerInfo()` - returns `ServerInfoInterface` instance which provides server information; -- `ConnectionInterface::getServerInfo()` - returns `ServerInfoInterface` instance which provides server information; - `LikeConditionInterface::getCaseSensitive()` - returns whether the comparison is case-sensitive. ### Remove methods @@ -179,3 +180,5 @@ Each table column has its own class in the `Yiisoft\Db\Schema\Column` namespace - Change `DbArrayHelper::index()` parameter names and allow to accept `Closure` for `$indexBy` parameter; - Change return type of `CommandInterface::insertWithReturningPks()` method to `array|false`; - Change return type of `AbstractCommand::insertWithReturningPks()` method to `array|false`; +- Rename `QueryBuilderInterface::quoter()` method to `QueryBuilderInterface::getQuoter()`; +- Change constructor parameters in `AbstractQueryBuilder` class; diff --git a/src/Command/AbstractCommand.php b/src/Command/AbstractCommand.php index dd4e2b006..68b06c438 100644 --- a/src/Command/AbstractCommand.php +++ b/src/Command/AbstractCommand.php @@ -208,7 +208,7 @@ public function batchInsert(string $table, array $columns, iterable $rows): stat public function insertBatch(string $table, iterable $rows, array $columns = []): static { - $table = $this->getQueryBuilder()->quoter()->getRawTableName($table); + $table = $this->getQueryBuilder()->getQuoter()->getRawTableName($table); $params = []; $sql = $this->getQueryBuilder()->insertBatch($table, $rows, $columns, $params); @@ -489,7 +489,7 @@ public function setSql(string $sql): static { $this->cancel(); $this->reset(); - $this->sql = $this->getQueryBuilder()->quoter()->quoteSql($sql); + $this->sql = $this->getQueryBuilder()->getQuoter()->quoteSql($sql); return $this; } diff --git a/src/Connection/ConnectionInterface.php b/src/Connection/ConnectionInterface.php index 96b0d40ee..10c605a78 100644 --- a/src/Connection/ConnectionInterface.php +++ b/src/Connection/ConnectionInterface.php @@ -14,6 +14,7 @@ use Yiisoft\Db\Query\BatchQueryResultInterface; use Yiisoft\Db\Query\QueryInterface; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; +use Yiisoft\Db\Schema\Column\ColumnFactoryInterface; use Yiisoft\Db\Schema\QuoterInterface; use Yiisoft\Db\Schema\SchemaInterface; use Yiisoft\Db\Schema\TableSchemaInterface; @@ -85,6 +86,11 @@ public function createTransaction(): TransactionInterface; */ public function close(): void; + /** + * Returns the column factory for creating column instances. + */ + public function getColumnFactory(): ColumnFactoryInterface; + /** * Returns the name of the DB driver for the current `dsn`. * diff --git a/src/Debug/ConnectionInterfaceProxy.php b/src/Debug/ConnectionInterfaceProxy.php index d7514f56f..3fde6420b 100644 --- a/src/Debug/ConnectionInterfaceProxy.php +++ b/src/Debug/ConnectionInterfaceProxy.php @@ -11,6 +11,7 @@ use Yiisoft\Db\Query\BatchQueryResultInterface; use Yiisoft\Db\Query\QueryInterface; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; +use Yiisoft\Db\Schema\Column\ColumnFactoryInterface; use Yiisoft\Db\Schema\QuoterInterface; use Yiisoft\Db\Schema\SchemaInterface; use Yiisoft\Db\Schema\TableSchemaInterface; @@ -63,6 +64,11 @@ public function close(): void $this->connection->close(); } + public function getColumnFactory(): ColumnFactoryInterface + { + return $this->connection->getColumnFactory(); + } + public function getLastInsertID(?string $sequenceName = null): string { return $this->connection->getLastInsertID($sequenceName); diff --git a/src/QueryBuilder/AbstractColumnDefinitionBuilder.php b/src/QueryBuilder/AbstractColumnDefinitionBuilder.php index c17ca4157..2d3876d9e 100644 --- a/src/QueryBuilder/AbstractColumnDefinitionBuilder.php +++ b/src/QueryBuilder/AbstractColumnDefinitionBuilder.php @@ -230,7 +230,7 @@ protected function buildReferenceDefinition(ColumnInterface $column): string|nul return null; } - $quoter = $this->queryBuilder->quoter(); + $quoter = $this->queryBuilder->getQuoter(); $schema = $reference?->getForeignSchemaName(); $sql = $quoter->quoteTableName($table); diff --git a/src/QueryBuilder/AbstractQueryBuilder.php b/src/QueryBuilder/AbstractQueryBuilder.php index dda3a7753..c3bffadca 100644 --- a/src/QueryBuilder/AbstractQueryBuilder.php +++ b/src/QueryBuilder/AbstractQueryBuilder.php @@ -15,9 +15,9 @@ use Yiisoft\Db\Expression\ExpressionInterface; use Yiisoft\Db\Query\QueryInterface; use Yiisoft\Db\QueryBuilder\Condition\Interface\ConditionInterface; +use Yiisoft\Db\Schema\Column\ColumnFactoryInterface; use Yiisoft\Db\Schema\Column\ColumnInterface; use Yiisoft\Db\Schema\QuoterInterface; -use Yiisoft\Db\Schema\SchemaInterface; use function bin2hex; use function count; @@ -63,9 +63,7 @@ abstract class AbstractQueryBuilder implements QueryBuilderInterface protected array $typeMap = []; public function __construct( - private QuoterInterface $quoter, - private SchemaInterface $schema, - private ServerInfoInterface $serverInfo, + private ConnectionInterface $db, private AbstractDDLQueryBuilder $ddlBuilder, private AbstractDMLQueryBuilder $dmlBuilder, private AbstractDQLQueryBuilder $dqlBuilder, @@ -175,7 +173,7 @@ public function build(QueryInterface $query, array $params = []): array public function buildColumnDefinition(ColumnInterface|string $column): string { if (is_string($column)) { - $column = $this->schema->getColumnFactory()->fromDefinition($column); + $column = $this->db->getColumnFactory()->fromDefinition($column); } return $this->columnDefinitionBuilder->build($column); @@ -357,19 +355,19 @@ public function getColumnDefinitionBuilder(): ColumnDefinitionBuilderInterface return $this->columnDefinitionBuilder; } - public function getExpressionBuilder(ExpressionInterface $expression): object + public function getColumnFactory(): ColumnFactoryInterface { - return $this->dqlBuilder->getExpressionBuilder($expression); + return $this->db->getColumnFactory(); } - public function getSchema(): SchemaInterface + public function getExpressionBuilder(ExpressionInterface $expression): object { - return $this->schema; + return $this->dqlBuilder->getExpressionBuilder($expression); } public function getServerInfo(): ServerInfoInterface { - return $this->serverInfo; + return $this->db->getServerInfo(); } public function insert(string $table, QueryInterface|array $columns, array &$params = []): string @@ -382,9 +380,9 @@ public function insertWithReturningPks(string $table, QueryInterface|array $colu return $this->dmlBuilder->insertWithReturningPks($table, $columns, $params); } - public function quoter(): QuoterInterface + public function getQuoter(): QuoterInterface { - return $this->quoter; + return $this->db->getQuoter(); } public function prepareParam(ParamInterface $param): string @@ -400,6 +398,8 @@ public function prepareParam(ParamInterface $param): string public function prepareValue(mixed $value): string { + $quoter = $this->db->getQuoter(); + /** @psalm-suppress MixedArgument */ return match (gettype($value)) { GettypeResult::BOOLEAN => $value ? static::TRUE_VALUE : static::FALSE_VALUE, @@ -409,11 +409,11 @@ public function prepareValue(mixed $value): string GettypeResult::OBJECT => match (true) { $value instanceof Expression => (string) $value, $value instanceof ParamInterface => $this->prepareParam($value), - default => $this->quoter->quoteValue((string) $value), + default => $quoter->quoteValue((string) $value), }, GettypeResult::RESOURCE => $this->prepareResource($value), GettypeResult::RESOURCE_CLOSED => throw new InvalidArgumentException('Resource is closed.'), - default => $this->quoter->quoteValue((string) $value), + default => $quoter->quoteValue((string) $value), }; } diff --git a/src/QueryBuilder/Condition/Builder/AbstractOverlapsConditionBuilder.php b/src/QueryBuilder/Condition/Builder/AbstractOverlapsConditionBuilder.php index 2eef3456c..b24803fab 100644 --- a/src/QueryBuilder/Condition/Builder/AbstractOverlapsConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/AbstractOverlapsConditionBuilder.php @@ -23,6 +23,6 @@ protected function prepareColumn(ExpressionInterface|string $column): string return $this->queryBuilder->buildExpression($column); } - return $this->queryBuilder->quoter()->quoteColumnName($column); + return $this->queryBuilder->getQuoter()->quoteColumnName($column); } } diff --git a/src/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilder.php b/src/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilder.php index c44a9110f..c3e11c264 100644 --- a/src/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilder.php @@ -81,7 +81,7 @@ protected function escapeColumnName( } if (!str_contains($columnName, '(')) { - return $this->queryBuilder->quoter()->quoteColumnName($columnName); + return $this->queryBuilder->getQuoter()->quoteColumnName($columnName); } return $columnName; diff --git a/src/QueryBuilder/Condition/Builder/BetweenConditionBuilder.php b/src/QueryBuilder/Condition/Builder/BetweenConditionBuilder.php index 4e1e0f783..1ec9cd6e1 100644 --- a/src/QueryBuilder/Condition/Builder/BetweenConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/BetweenConditionBuilder.php @@ -39,7 +39,7 @@ public function build(BetweenConditionInterface $expression, array &$params = [] $column = $column instanceof ExpressionInterface ? $this->queryBuilder->buildExpression($column) : $column; if (!str_contains($column, '(')) { - $column = $this->queryBuilder->quoter()->quoteColumnName($column); + $column = $this->queryBuilder->getQuoter()->quoteColumnName($column); } $phName1 = $this->createPlaceholder($expression->getIntervalStart(), $params); diff --git a/src/QueryBuilder/Condition/Builder/HashConditionBuilder.php b/src/QueryBuilder/Condition/Builder/HashConditionBuilder.php index c0d8b121e..bc5442aa3 100644 --- a/src/QueryBuilder/Condition/Builder/HashConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/HashConditionBuilder.php @@ -51,7 +51,7 @@ public function build(HashConditionInterface $expression, array &$params = []): $parts[] = $this->queryBuilder->buildCondition(new InCondition($column, 'IN', $value), $params); } else { if (!str_contains($column, '(')) { - $column = $this->queryBuilder->quoter()->quoteColumnName($column); + $column = $this->queryBuilder->getQuoter()->quoteColumnName($column); } if ($value === null) { diff --git a/src/QueryBuilder/Condition/Builder/InConditionBuilder.php b/src/QueryBuilder/Condition/Builder/InConditionBuilder.php index 50d10e076..9898ad8cc 100644 --- a/src/QueryBuilder/Condition/Builder/InConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/InConditionBuilder.php @@ -110,7 +110,7 @@ public function build(InConditionInterface $expression, array &$params = []): st } if (is_string($column) && !str_contains($column, '(')) { - $column = $this->queryBuilder->quoter()->quoteColumnName($column); + $column = $this->queryBuilder->getQuoter()->quoteColumnName($column); } if (count($sqlValues) > 1) { @@ -205,7 +205,7 @@ protected function buildSubqueryInCondition( } if (!str_contains($col, '(')) { - $columns[$i] = $this->queryBuilder->quoter()->quoteColumnName($col); + $columns[$i] = $this->queryBuilder->getQuoter()->quoteColumnName($col); } } @@ -213,7 +213,7 @@ protected function buildSubqueryInCondition( } if (is_string($columns) && !str_contains($columns, '(')) { - $columns = $this->queryBuilder->quoter()->quoteColumnName($columns); + $columns = $this->queryBuilder->getQuoter()->quoteColumnName($columns); $query = "$columns $operator $sql"; } @@ -268,7 +268,7 @@ protected function buildCompositeInCondition( } $sqlColumns[] = !str_contains($column, '(') - ? $this->queryBuilder->quoter()->quoteColumnName($column) : $column; + ? $this->queryBuilder->getQuoter()->quoteColumnName($column) : $column; } return '(' . implode(', ', $sqlColumns) . ") $operator (" . implode(', ', $vss) . ')'; @@ -279,7 +279,7 @@ protected function buildCompositeInCondition( */ protected function getNullCondition(string $operator, string $column): string { - $column = $this->queryBuilder->quoter()->quoteColumnName($column); + $column = $this->queryBuilder->getQuoter()->quoteColumnName($column); if ($operator === 'IN') { return sprintf('%s IS NULL', $column); diff --git a/src/QueryBuilder/Condition/Builder/LikeConditionBuilder.php b/src/QueryBuilder/Condition/Builder/LikeConditionBuilder.php index c3bd0f922..59e9c3977 100644 --- a/src/QueryBuilder/Condition/Builder/LikeConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/LikeConditionBuilder.php @@ -100,7 +100,7 @@ protected function prepareColumn(LikeConditionInterface $expression, array &$par } if (!str_contains($column, '(')) { - return $this->queryBuilder->quoter()->quoteColumnName($column); + return $this->queryBuilder->getQuoter()->quoteColumnName($column); } return $column; diff --git a/src/QueryBuilder/Condition/Builder/SimpleConditionBuilder.php b/src/QueryBuilder/Condition/Builder/SimpleConditionBuilder.php index 9fff26c2b..8e5fc1f11 100644 --- a/src/QueryBuilder/Condition/Builder/SimpleConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/SimpleConditionBuilder.php @@ -42,7 +42,7 @@ public function build(SimpleConditionInterface $expression, array &$params = []) if ($column instanceof ExpressionInterface) { $column = $this->queryBuilder->buildExpression($column, $params); } elseif (!str_contains($column, '(')) { - $column = $this->queryBuilder->quoter()->quoteColumnName($column); + $column = $this->queryBuilder->getQuoter()->quoteColumnName($column); } if ($value === null) { diff --git a/src/QueryBuilder/QueryBuilderInterface.php b/src/QueryBuilder/QueryBuilderInterface.php index 3b1baf4e9..661b52c0e 100644 --- a/src/QueryBuilder/QueryBuilderInterface.php +++ b/src/QueryBuilder/QueryBuilderInterface.php @@ -10,9 +10,9 @@ use Yiisoft\Db\Exception\InvalidArgumentException; use Yiisoft\Db\Expression\ExpressionBuilderInterface; use Yiisoft\Db\Expression\ExpressionInterface; +use Yiisoft\Db\Schema\Column\ColumnFactoryInterface; use Yiisoft\Db\Schema\Column\ColumnInterface; use Yiisoft\Db\Schema\QuoterInterface; -use Yiisoft\Db\Schema\SchemaInterface; /** * Defines the common interface to be implemented by query builder classes. @@ -54,6 +54,11 @@ public function buildColumnDefinition(ColumnInterface|string $column): string; */ public function getColumnDefinitionBuilder(): ColumnDefinitionBuilderInterface; + /** + * Returns the column factory for creating column instances. + */ + public function getColumnFactory(): ColumnFactoryInterface; + /** * Gets an object of {@see ExpressionBuilderInterface} that's suitable for $expression. * @@ -65,11 +70,6 @@ public function getColumnDefinitionBuilder(): ColumnDefinitionBuilderInterface; */ public function getExpressionBuilder(ExpressionInterface $expression): object; - /** - * Returns {@see SchemaInterface} instance that provides information about the database schema. - */ - public function getSchema(): SchemaInterface; - /** * Returns {@see ServerInfoInterface} instance that provides information about the database server. */ @@ -78,7 +78,7 @@ public function getServerInfo(): ServerInfoInterface; /** * @return QuoterInterface The quoter instance. */ - public function quoter(): QuoterInterface; + public function getQuoter(): QuoterInterface; /** * Converts a {@see ParamInterface} object to its SQL representation and quotes it if necessary. diff --git a/src/Schema/SchemaInterface.php b/src/Schema/SchemaInterface.php index 4e72f46e9..d5e8c8ff0 100644 --- a/src/Schema/SchemaInterface.php +++ b/src/Schema/SchemaInterface.php @@ -12,7 +12,6 @@ use Yiisoft\Db\Exception\Exception; use Yiisoft\Db\Exception\InvalidConfigException; use Yiisoft\Db\Exception\NotSupportedException; -use Yiisoft\Db\Schema\Column\ColumnFactoryInterface; /** * Represents the schema for a database table. @@ -299,11 +298,6 @@ interface SchemaInterface extends ConstraintSchemaInterface */ public const TYPE_JSON = 'json'; - /** - * Returns the column factory for creating column instances. - */ - public function getColumnFactory(): ColumnFactoryInterface; - /** * @return string|null The default schema name. */ diff --git a/tests/AbstractColumnFactoryTest.php b/tests/AbstractColumnFactoryTest.php index 4f743ed2b..75d213d87 100644 --- a/tests/AbstractColumnFactoryTest.php +++ b/tests/AbstractColumnFactoryTest.php @@ -20,7 +20,7 @@ abstract class AbstractColumnFactoryTest extends TestCase public function testFromDbType(string $dbType, string $expectedType, string $expectedInstanceOf): void { $db = $this->getConnection(); - $columnFactory = $db->getSchema()->getColumnFactory(); + $columnFactory = $db->getColumnFactory(); $column = $columnFactory->fromDbType($dbType); @@ -35,7 +35,7 @@ public function testFromDbType(string $dbType, string $expectedType, string $exp public function testFromDefinition(string $definition, ColumnInterface $expected): void { $db = $this->getConnection(); - $columnFactory = $db->getSchema()->getColumnFactory(); + $columnFactory = $db->getColumnFactory(); $column = $columnFactory->fromDefinition($definition); @@ -48,7 +48,7 @@ public function testFromDefinition(string $definition, ColumnInterface $expected public function testFromPseudoType(string $pseudoType, ColumnInterface $expected): void { $db = $this->getConnection(); - $columnFactory = $db->getSchema()->getColumnFactory(); + $columnFactory = $db->getColumnFactory(); $column = $columnFactory->fromPseudoType($pseudoType); @@ -61,7 +61,7 @@ public function testFromPseudoType(string $pseudoType, ColumnInterface $expected public function testFromType(string $type, string $expectedType, string $expectedInstanceOf): void { $db = $this->getConnection(); - $columnFactory = $db->getSchema()->getColumnFactory(); + $columnFactory = $db->getColumnFactory(); $column = $columnFactory->fromType($type); @@ -74,7 +74,7 @@ public function testFromType(string $type, string $expectedType, string $expecte public function testFromDefinitionWithExtra(): void { $db = $this->getConnection(); - $columnFactory = $db->getSchema()->getColumnFactory(); + $columnFactory = $db->getColumnFactory(); $column = $columnFactory->fromDefinition('char(1) INVISIBLE', ['extra' => 'COLLATE utf8mb4']); @@ -90,7 +90,7 @@ public function testFromDefinitionWithExtra(): void public function testFromTypeDefaultValueRaw(string $type, string|null $defaultValueRaw, mixed $expected): void { $db = $this->getConnection(); - $columnFactory = $db->getSchema()->getColumnFactory(); + $columnFactory = $db->getColumnFactory(); $column = $columnFactory->fromType($type, ['defaultValueRaw' => $defaultValueRaw]); @@ -106,7 +106,7 @@ public function testFromTypeDefaultValueRaw(string $type, string|null $defaultVa public function testNullDefaultValueRaw(): void { $db = $this->getConnection(); - $columnFactory = $db->getSchema()->getColumnFactory(); + $columnFactory = $db->getColumnFactory(); $column = $columnFactory->fromType(ColumnType::INTEGER, ['defaultValueRaw' => '1', 'primaryKey' => true]); diff --git a/tests/AbstractQueryBuilderTest.php b/tests/AbstractQueryBuilderTest.php index 1adf8e1c6..811943f67 100644 --- a/tests/AbstractQueryBuilderTest.php +++ b/tests/AbstractQueryBuilderTest.php @@ -1909,7 +1909,7 @@ public function testQuoter(): void $qb = $db->getQueryBuilder(); - $this->assertInstanceOf(QuoterInterface::class, $qb->quoter()); + $this->assertInstanceOf(QuoterInterface::class, $qb->getQuoter()); } public function testRenameColumn(): void @@ -2249,7 +2249,7 @@ public function testUpdate( $qb = $db->getQueryBuilder(); $sql = $qb->update($table, $columns, $condition, $params); - $sql = $qb->quoter()->quoteSql($sql); + $sql = $db->getQuoter()->quoteSql($sql); $this->assertSame($expectedSql, $sql); $this->assertEquals($expectedParams, $params); diff --git a/tests/Common/CommonPdoConnectionTest.php b/tests/Common/CommonPdoConnectionTest.php index 761ba9c36..55cdbc445 100644 --- a/tests/Common/CommonPdoConnectionTest.php +++ b/tests/Common/CommonPdoConnectionTest.php @@ -345,6 +345,7 @@ public function testGetActivePdo(): void $db = $this->getMockBuilder(AbstractPdoConnection::class)->onlyMethods([ 'createCommand', 'createTransaction', + 'getColumnFactory', 'getPdo', 'getQueryBuilder', 'getQuoter', diff --git a/tests/Common/CommonQueryBuilderTest.php b/tests/Common/CommonQueryBuilderTest.php index e62895808..14187c179 100644 --- a/tests/Common/CommonQueryBuilderTest.php +++ b/tests/Common/CommonQueryBuilderTest.php @@ -22,8 +22,7 @@ public function getBuildColumnDefinitionProvider(): array public function testCreateTableWithBuildColumnDefinition(): void { $db = $this->getConnection(); - $schema = $db->getSchema(); - $columnFactory = $schema->getColumnFactory(); + $columnFactory = $db->getColumnFactory(); $command = $db->createCommand(); $provider = $this->getBuildColumnDefinitionProvider(); diff --git a/tests/Db/Command/CommandTest.php b/tests/Db/Command/CommandTest.php index 4149c4001..62cbfae36 100644 --- a/tests/Db/Command/CommandTest.php +++ b/tests/Db/Command/CommandTest.php @@ -187,13 +187,18 @@ public function testBatchInsert(): void $db = $this->getConnection(); $command = $db->createCommand(); + $command->insertBatch('table', [['value1', 'value2'], ['value3', 'value4']], ['column1', 'column2']); - $this->expectException(NotSupportedException::class); - $this->expectExceptionMessage( - 'Yiisoft\Db\Tests\Support\Stub\Schema::loadTableSchema is not supported by this DBMS.' + $this->assertSame('INSERT INTO [table] ([column1], [column2]) VALUES (:qp0, :qp1), (:qp2, :qp3)', $command->getSql()); + $this->assertSame( + [ + ':qp0' => 'value1', + ':qp1' => 'value2', + ':qp2' => 'value3', + ':qp3' => 'value4', + ], + $command->getParams() ); - - $command->insertBatch('table', [['value1', 'value2'], ['value3', 'value4']], ['column1', 'column2']); } /** @@ -524,13 +529,20 @@ public function testInsert(): void $db = $this->getConnection(); $command = $db->createCommand(); + $command->insert('customer', ['email' => 't1@example.com', 'name' => 'test', 'address' => 'test address']); - $this->expectException(NotSupportedException::class); - $this->expectExceptionMessage( - 'Yiisoft\Db\Tests\Support\Stub\Schema::loadTableSchema is not supported by this DBMS.' + $this->assertSame( + 'INSERT INTO [customer] ([email], [name], [address]) VALUES (:qp0, :qp1, :qp2)', + $command->getSql(), + ); + $this->assertSame( + [ + ':qp0' => 't1@example.com', + ':qp1' => 'test', + ':qp2' => 'test address', + ], + $command->getParams(), ); - - $command->insert('customer', ['email' => 't1@example.com', 'name' => 'test', 'address' => 'test address']); } public function testQuery(): void @@ -704,13 +716,10 @@ public function testUpdate(): void $db = $this->getConnection(); $command = $db->createCommand(); + $command->update('{{table}}', ['name' => 'John'], ['id' => 1]); - $this->expectException(NotSupportedException::class); - $this->expectExceptionMessage( - 'Yiisoft\Db\Tests\Support\Stub\Schema::loadTableSchema is not supported by this DBMS.' - ); - - $command->update('{{table}}', [], [], []); + $this->assertSame('UPDATE [table] SET [name]=:qp0 WHERE [id]=:qp1', $command->getSql()); + $this->assertSame([':qp0' => 'John', ':qp1' => 1], $command->getParams()); } public function testUpsert(): void diff --git a/tests/Db/Connection/ConnectionTest.php b/tests/Db/Connection/ConnectionTest.php index 16b426465..6a3599292 100644 --- a/tests/Db/Connection/ConnectionTest.php +++ b/tests/Db/Connection/ConnectionTest.php @@ -21,12 +21,7 @@ public function testGetTableSchema(): void { $db = $this->getConnection(); - $this->expectException(NotSupportedException::class); - $this->expectExceptionMessage( - 'Yiisoft\Db\Tests\Support\Stub\Schema::loadTableSchema is not supported by this DBMS.' - ); - - $db->getTableSchema('non_existing_table'); + $this->assertNull($db->getTableSchema('non_existing_table')); } public function testSerialized(): void diff --git a/tests/Db/QueryBuilder/QueryBuilderTest.php b/tests/Db/QueryBuilder/QueryBuilderTest.php index f953466ed..8ace1896e 100644 --- a/tests/Db/QueryBuilder/QueryBuilderTest.php +++ b/tests/Db/QueryBuilder/QueryBuilderTest.php @@ -17,7 +17,6 @@ use Yiisoft\Db\Tests\AbstractQueryBuilderTest; use Yiisoft\Db\Tests\Support\DbHelper; use Yiisoft\Db\Tests\Support\Stub\QueryBuilder; -use Yiisoft\Db\Tests\Support\Stub\Schema; use Yiisoft\Db\Tests\Support\TestTrait; use function fclose; @@ -61,9 +60,7 @@ public function testBatchInsert( array $expectedParams = [], ): void { $db = $this->getConnection(); - - $schemaMock = $this->createMock(Schema::class); - $qb = new QueryBuilder($db->getQuoter(), $schemaMock, $db->getServerInfo()); + $qb = new QueryBuilder($db); $params = []; try { @@ -145,10 +142,8 @@ public function testCreateTable(): void public function testCreateView(): void { $db = $this->getConnection(); - - $schemaMock = $this->createMock(Schema::class); $subQuery = (new Query($db))->select('{{bar}}')->from('{{testCreateViewTable}}')->where(['>', 'bar', '5']); - $qb = new QueryBuilder($db->getQuoter(), $schemaMock, $db->getServerInfo()); + $qb = new QueryBuilder($db); $this->assertSame( <<getConnection(); - - $schemaMock = $this->createMock(Schema::class); - $qb = new QueryBuilder($db->getQuoter(), $schemaMock, $db->getServerInfo()); + $qb = new QueryBuilder($db); $this->assertSame($expectedSQL, $qb->insert($table, $columns, $params)); $this->assertEquals($expectedParams, $params); @@ -264,12 +257,10 @@ public function testUpdate( array $expectedParams ): void { $db = $this->getConnection(); - - $schemaMock = $this->createMock(Schema::class); - $qb = new QueryBuilder($db->getQuoter(), $schemaMock, $db->getServerInfo()); + $qb = $db->getQueryBuilder(); $sql = $qb->update($table, $columns, $condition, $params); - $sql = $qb->quoter()->quoteSql($sql); + $sql = $db->getQuoter()->quoteSql($sql); $this->assertSame($expectedSql, $sql); $this->assertEquals($expectedParams, $params); diff --git a/tests/Support/Stub/ColumnDefinitionBuilder.php b/tests/Support/Stub/ColumnDefinitionBuilder.php index b7446b640..14776e38a 100644 --- a/tests/Support/Stub/ColumnDefinitionBuilder.php +++ b/tests/Support/Stub/ColumnDefinitionBuilder.php @@ -44,7 +44,7 @@ protected function buildCheck(ColumnInterface $column): string $columnName = $column->getName(); if (!empty($columnName) && $column->getType() === ColumnType::JSON) { - return ' CHECK (json_valid(' . $this->queryBuilder->quoter()->quoteColumnName($columnName) . '))'; + return ' CHECK (json_valid(' . $this->queryBuilder->getQuoter()->quoteColumnName($columnName) . '))'; } return ''; diff --git a/tests/Support/Stub/Connection.php b/tests/Support/Stub/Connection.php index fd9e03855..5aad02035 100644 --- a/tests/Support/Stub/Connection.php +++ b/tests/Support/Stub/Connection.php @@ -8,6 +8,7 @@ use Yiisoft\Db\Command\CommandInterface; use Yiisoft\Db\Driver\Pdo\AbstractPdoConnection; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; +use Yiisoft\Db\Schema\Column\ColumnFactoryInterface; use Yiisoft\Db\Schema\Quoter; use Yiisoft\Db\Schema\QuoterInterface; use Yiisoft\Db\Schema\SchemaInterface; @@ -15,9 +16,6 @@ final class Connection extends AbstractPdoConnection { - protected QueryBuilderInterface|null $queryBuilder = null; - protected SchemaInterface|null $schema = null; - public function createCommand(?string $sql = null, array $params = []): CommandInterface { $command = new Command($this); @@ -42,35 +40,24 @@ public function createTransaction(): TransactionInterface return new Transaction($this); } - public function getQueryBuilder(): QueryBuilderInterface + public function getColumnFactory(): ColumnFactoryInterface { - if ($this->queryBuilder === null) { - $this->queryBuilder = new QueryBuilder( - $this->getQuoter(), - $this->getSchema(), - $this->getServerInfo(), - ); - } + return new ColumnFactory(); + } - return $this->queryBuilder; + public function getQueryBuilder(): QueryBuilderInterface + { + return $this->queryBuilder ??= new QueryBuilder($this); } public function getQuoter(): QuoterInterface { - if ($this->quoter === null) { - $this->quoter = new Quoter(['[', ']'], ['[', ']'], $this->getTablePrefix()); - } - - return $this->quoter; + return $this->quoter ??= new Quoter(['[', ']'], ['[', ']'], $this->getTablePrefix()); } public function getSchema(): SchemaInterface { - if ($this->schema === null) { - $this->schema = new Schema($this, $this->schemaCache); - } - - return $this->schema; + return $this->schema ??= new Schema($this, $this->schemaCache); } protected function initConnection(): void diff --git a/tests/Support/Stub/QueryBuilder.php b/tests/Support/Stub/QueryBuilder.php index c23eb957b..9f928ff86 100644 --- a/tests/Support/Stub/QueryBuilder.php +++ b/tests/Support/Stub/QueryBuilder.php @@ -4,19 +4,18 @@ namespace Yiisoft\Db\Tests\Support\Stub; -use Yiisoft\Db\Connection\ServerInfoInterface; +use Yiisoft\Db\Connection\ConnectionInterface; use Yiisoft\Db\QueryBuilder\AbstractQueryBuilder; -use Yiisoft\Db\Schema\QuoterInterface; -use Yiisoft\Db\Schema\SchemaInterface; final class QueryBuilder extends AbstractQueryBuilder { - public function __construct(QuoterInterface $quoter, SchemaInterface $schema, ServerInfoInterface $serverInfo) + public function __construct(ConnectionInterface $db) { + $quoter = $db->getQuoter(); + $schema = $db->getSchema(); + parent::__construct( - $quoter, - $schema, - $serverInfo, + $db, new DDLQueryBuilder($this, $quoter, $schema), new DMLQueryBuilder($this, $quoter, $schema), new DQLQueryBuilder($this, $quoter), diff --git a/tests/Support/Stub/Schema.php b/tests/Support/Stub/Schema.php index 6fea0ce08..8fa82f28a 100644 --- a/tests/Support/Stub/Schema.php +++ b/tests/Support/Stub/Schema.php @@ -7,7 +7,6 @@ use Yiisoft\Db\Constraint\Constraint; use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Schema\AbstractSchema; -use Yiisoft\Db\Schema\Column\ColumnFactoryInterface; use Yiisoft\Db\Schema\TableSchemaInterface; /** @@ -17,11 +16,6 @@ */ class Schema extends AbstractSchema { - public function getColumnFactory(): ColumnFactoryInterface - { - return new ColumnFactory(); - } - public function findUniqueIndexes(TableSchemaInterface $table): array { throw new NotSupportedException(__METHOD__ . ' is not supported by this DBMS.'); @@ -93,11 +87,8 @@ protected function loadTableUniques(string $tableName): array throw new NotSupportedException(__METHOD__ . ' is not supported by this DBMS.'); } - /** - * @throws NotSupportedException - */ protected function loadTableSchema(string $name): TableSchemaInterface|null { - throw new NotSupportedException(__METHOD__ . ' is not supported by this DBMS.'); + return null; } }