diff --git a/composer.json b/composer.json index 77acde3..3264461 100644 --- a/composer.json +++ b/composer.json @@ -32,7 +32,7 @@ "require": { "php": "8.1 - 8.4", "yiisoft/data": "dev-master", - "yiisoft/db": "^1.3" + "yiisoft/db": "dev-master" }, "require-dev": { "maglnet/composer-require-checker": "^4.7.1", @@ -43,11 +43,11 @@ "vimeo/psalm": "^5.26.1 || ^6.9.1", "vlucas/phpdotenv": "^5.6.1", "yiisoft/cache": "^3.0", - "yiisoft/db-mssql": "^1.2", - "yiisoft/db-mysql": "^1.2", - "yiisoft/db-oracle": "^1.3", - "yiisoft/db-pgsql": "^1.3", - "yiisoft/db-sqlite": "^1.2" + "yiisoft/db-mssql": "dev-master", + "yiisoft/db-mysql": "dev-master", + "yiisoft/db-oracle": "dev-master", + "yiisoft/db-pgsql": "dev-master", + "yiisoft/db-sqlite": "dev-master" }, "autoload": { "psr-4": { diff --git a/src/FilterHandler/LikeFilterHandler.php b/src/FilterHandler/LikeFilterHandler.php index 3c45a46..a0eb814 100644 --- a/src/FilterHandler/LikeFilterHandler.php +++ b/src/FilterHandler/LikeFilterHandler.php @@ -5,7 +5,9 @@ namespace Yiisoft\Data\Db\FilterHandler; use Yiisoft\Data\Reader\Filter\Like; +use Yiisoft\Data\Reader\Filter\LikeMode as DataLikeMode; use Yiisoft\Data\Reader\FilterInterface; +use Yiisoft\Db\QueryBuilder\Condition\LikeMode as DbLikeMode; final class LikeFilterHandler implements QueryFilterHandlerInterface { @@ -18,6 +20,21 @@ public function getCriteria(FilterInterface $filter, Context $context): ?Criteri { /** @var Like $filter */ - return new Criteria(['LIKE', $filter->field, $filter->value]); + return new Criteria([ + 'LIKE', + $filter->field, + $filter->value, + 'caseSensitive' => $filter->caseSensitive, + 'mode' => $this->mapMode($filter->mode), + ]); + } + + public function mapMode(DataLikeMode $dataMode): DbLikeMode + { + return match ($dataMode) { + DataLikeMode::Contains => DbLikeMode::Contains, + DataLikeMode::StartsWith => DbLikeMode::StartsWith, + DataLikeMode::EndsWith => DbLikeMode::EndsWith, + }; } } diff --git a/src/QueryDataReader.php b/src/QueryDataReader.php index d014c0f..a117a79 100644 --- a/src/QueryDataReader.php +++ b/src/QueryDataReader.php @@ -68,7 +68,7 @@ final public function getIterator(): Generator } elseif ($this->batchSize === null) { yield from $this->read(); } else { - $iterator = $this->getPreparedQuery()->each($this->batchSize); + $iterator = $this->getPreparedQuery()->batch($this->batchSize); /** @var array|object $row */ foreach ($iterator as $index => $row) { diff --git a/tests/Base/BaseQueryDataReaderTestCase.php b/tests/Base/BaseQueryDataReaderTestCase.php index f5457ff..2a2370c 100644 --- a/tests/Base/BaseQueryDataReaderTestCase.php +++ b/tests/Base/BaseQueryDataReaderTestCase.php @@ -212,11 +212,11 @@ public static function dataFilterSql(): array ], 'greater than or equal' => [ new GreaterThanOrEqual('column', 3.5), - '[[column]] >= \'3.5\'', + '[[column]] >= 3.5', ], 'less than' => [ new LessThan('column', 10.7), - '[[column]] < \'10.7\'', + '[[column]] < 10.7', ], 'less-than-or-equal' => [ new LessThanOrEqual('column', 100), @@ -224,7 +224,7 @@ public static function dataFilterSql(): array ], 'in' => [ new In('column', [10, 20.5, 30]), - '[[column]] IN (10, \'20.5\', 30)', + '[[column]] IN (10, 20.5, 30)', ], 'like' => [ new Like('column', 'foo'), @@ -245,11 +245,11 @@ public static function dataFilterSql(): array ], 'not greater than or equal' => [ new Not(new GreaterThanOrEqual('column', 3.5)), - '[[column]] < \'3.5\'', + '[[column]] < 3.5', ], 'not less than' => [ new Not(new LessThan('column', 10.7)), - '[[column]] >= \'10.7\'', + '[[column]] >= 10.7', ], 'not less than or equal' => [ new Not(new LessThanOrEqual('column', 100)), diff --git a/tests/Base/DataTrait.php b/tests/Base/DataTrait.php index 146aeb8..6cfe970 100644 --- a/tests/Base/DataTrait.php +++ b/tests/Base/DataTrait.php @@ -4,7 +4,6 @@ namespace Yiisoft\Data\Db\Tests\Base; -use DateTime; use Yiisoft\Data\Db\QueryDataReader; use Yiisoft\Data\Reader\DataReaderInterface; use Yiisoft\Data\Tests\Common\FixtureTrait; @@ -13,6 +12,8 @@ use Yiisoft\Db\Expression\Expression; use Yiisoft\Db\Query\Query; +use function is_object; + trait DataTrait { use FixtureTrait; @@ -60,10 +61,6 @@ protected function assertFixtures(array $expectedFixtureIndexes, array $actualFi $fixture['number'] = (int) $fixture['number']; $fixture['balance'] = (float) $fixture['balance']; - if ($fixture['born_at'] !== null && $this->getConnection()->getDriverName() === 'oci') { - $fixture['born_at'] = DateTime::createFromFormat('d-M-y', $fixture['born_at'])->format('Y-m-d'); - } - $processedActualFixtures[$fixture['number'] - 1] = $fixture; } diff --git a/tests/Sqlite/QueryDataReaderTest.php b/tests/Sqlite/QueryDataReaderTest.php index cc7319c..286393c 100644 --- a/tests/Sqlite/QueryDataReaderTest.php +++ b/tests/Sqlite/QueryDataReaderTest.php @@ -14,7 +14,7 @@ public static function dataOffset(): array { return [ [ - 'SELECT * FROM `customer` LIMIT 9223372036854775807 OFFSET 2', + 'SELECT * FROM "customer" LIMIT 9223372036854775807 OFFSET 2', ], ]; } diff --git a/tests/TestHelper.php b/tests/TestHelper.php index 43ee2be..985408b 100644 --- a/tests/TestHelper.php +++ b/tests/TestHelper.php @@ -6,7 +6,7 @@ use Yiisoft\Db\Connection\ConnectionInterface; use Yiisoft\Db\Exception\Exception; -use Yiisoft\Db\Schema\SchemaInterface; +use Yiisoft\Db\Schema\Column\ColumnBuilder; final class TestHelper { @@ -19,12 +19,12 @@ public static function loadFixtures(ConnectionInterface $db): void $db->createCommand()->createTable( 'customer', [ - 'id' => $db->getSchema()->createColumn(SchemaInterface::TYPE_INTEGER)->notNull(), - 'name' => $db->getSchema()->createColumn(SchemaInterface::TYPE_STRING, 128)->notNull(), - 'email' => $db->getSchema()->createColumn(SchemaInterface::TYPE_STRING, 128), - 'address' => $db->getSchema()->createColumn(SchemaInterface::TYPE_TEXT), - 'status' => $db->getSchema()->createColumn(SchemaInterface::TYPE_INTEGER)->defaultValue(0), - 'profile_id' => $db->getSchema()->createColumn(SchemaInterface::TYPE_INTEGER), + 'id' => ColumnBuilder::integer()->notNull(), + 'name' => ColumnBuilder::string(128)->notNull(), + 'email' => ColumnBuilder::string(128), + 'address' => ColumnBuilder::text(), + 'status' => ColumnBuilder::integer()->defaultValue(0), + 'profile_id' => ColumnBuilder::integer(), ] )->execute(); $db->createCommand()->batchInsert(