diff --git a/composer.json b/composer.json index c0395bd12..b687ff2d4 100644 --- a/composer.json +++ b/composer.json @@ -65,7 +65,6 @@ "psr/log": "~1.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.14", "phpunit/phpunit": "~8.0" }, "replace": { diff --git a/src/Framework/src/Databases/Migrations/ContainerMigrationResolver.php b/src/Framework/src/Databases/Migrations/ContainerMigrationResolver.php index 2df96aae1..88e8742ca 100644 --- a/src/Framework/src/Databases/Migrations/ContainerMigrationResolver.php +++ b/src/Framework/src/Databases/Migrations/ContainerMigrationResolver.php @@ -12,8 +12,8 @@ namespace Opulence\Framework\Databases\Migrations; -use Aphiria\DependencyInjection\DependencyInjectionException; use Aphiria\DependencyInjection\IContainer; +use Aphiria\DependencyInjection\ResolutionException; use Opulence\Databases\Migrations\IMigration; use Opulence\Databases\Migrations\IMigrationResolver; use Opulence\Databases\Migrations\MigrationResolutionException; @@ -41,7 +41,7 @@ public function resolve(string $migrationClassName): IMigration { try { return $this->container->resolve($migrationClassName); - } catch (DependencyInjectionException $ex) { + } catch (ResolutionException $ex) { throw new MigrationResolutionException("Failed to resolve migration $migrationClassName", 0, $ex); } } diff --git a/src/Framework/tests/Databases/Migrations/ContainerMigrationResolverTest.php b/src/Framework/tests/Databases/Migrations/ContainerMigrationResolverTest.php index 55cd941b9..3bbbc638b 100644 --- a/src/Framework/tests/Databases/Migrations/ContainerMigrationResolverTest.php +++ b/src/Framework/tests/Databases/Migrations/ContainerMigrationResolverTest.php @@ -12,8 +12,8 @@ namespace Opulence\Framework\Tests\Databases\Migrations; -use Aphiria\DependencyInjection\DependencyInjectionException; use Aphiria\DependencyInjection\IContainer; +use Aphiria\DependencyInjection\ResolutionException; use Opulence\Databases\Migrations\IMigration; use Opulence\Databases\Migrations\MigrationResolutionException; use Opulence\Framework\Databases\Migrations\ContainerMigrationResolver; @@ -51,7 +51,7 @@ public function testDependencyInjectionExceptionsAreConverted(): void $this->container->expects($this->once()) ->method('resolve') ->with('foo') - ->willThrowException(new DependencyInjectionException('blah')); + ->willThrowException(new ResolutionException('blah', null)); $this->migrationResolver->resolve('foo'); } } diff --git a/src/QueryBuilders/src/Expression.php b/src/QueryBuilders/src/Expression.php new file mode 100644 index 000000000..e86d2448c --- /dev/null +++ b/src/QueryBuilders/src/Expression.php @@ -0,0 +1,78 @@ +expression = $expression; + + foreach ($values as $value) { + if (is_scalar($value)) { + $value = [$value, \PDO::PARAM_STR]; + } + + if (!is_array($value) || count($value) !== 2) { + throw new InvalidQueryException('Incorrect number of items in expression value array'); + } + + if (!array_key_exists(0, $value) || !array_key_exists(1, $value)) { + throw new InvalidQueryException('Incorrect keys in expression value array'); + } + + if (!is_scalar($value[0]) || !is_numeric($value[1]) || $value[1] < 0) { + throw new InvalidQueryException('Incorrect expression values'); + } + + $this->values[] = $value; + } + } + + /** + * Gets the parameters in the expression + * + * @return array The list of parameters + */ + public function getParameters(): array + { + return $this->values; + } + + /** + * Gets the SQL that makes up the expression + * + * @return string The SQL of the expression + */ + public function getSql(): string + { + return $this->expression; + } +} diff --git a/src/QueryBuilders/src/InsertQuery.php b/src/QueryBuilders/src/InsertQuery.php index 06109d7d3..abc2f702d 100644 --- a/src/QueryBuilders/src/InsertQuery.php +++ b/src/QueryBuilders/src/InsertQuery.php @@ -66,13 +66,19 @@ public function addColumnValues(array $columnNamesToValues): self */ public function getSql(): string { - $sql = "INSERT INTO {$this->tableName}" - . ' (' . implode(', ', array_keys($this->augmentingQueryBuilder->getColumnNamesToValues())) . ') VALUES (' - . implode( - ', ', - array_fill(0, count(array_values($this->augmentingQueryBuilder->getColumnNamesToValues())), '?') - ) - . ')'; + $namesToValues = $this->augmentingQueryBuilder->getColumnNamesToValues(); + $sql = 'INSERT INTO ' . $this->tableName . ' (' . implode(', ', array_keys($namesToValues)) . ') VALUES ('; + $values = []; + + foreach ($namesToValues as $value) { + if ($value instanceof Expression) { + $values[] = $value->getSql(); + } else { + $values[] = '?'; + } + } + + $sql .= implode(', ', $values) . ')'; return $sql; } diff --git a/src/QueryBuilders/src/Query.php b/src/QueryBuilders/src/Query.php index 8ead93ac2..755658a75 100644 --- a/src/QueryBuilders/src/Query.php +++ b/src/QueryBuilders/src/Query.php @@ -126,6 +126,11 @@ public function addUnnamedPlaceholderValue($value, int $dataType = PDO::PARAM_ST public function addUnnamedPlaceholderValues(array $placeholderValues): self { foreach ($placeholderValues as $value) { + if ($value instanceof Expression) { + $this->addUnnamedPlaceholderValues($value->getParameters()); + continue; + } + if (is_array($value)) { if (count($value) !== 2) { throw new InvalidQueryException('Incorrect number of items in value array'); diff --git a/src/QueryBuilders/src/UpdateQuery.php b/src/QueryBuilders/src/UpdateQuery.php index 37d8f5fd2..61ac38af3 100644 --- a/src/QueryBuilders/src/UpdateQuery.php +++ b/src/QueryBuilders/src/UpdateQuery.php @@ -93,10 +93,14 @@ public function getSql(): string $sql = 'UPDATE ' . $this->tableName . (empty($this->tableAlias) ? '' : ' AS ' . $this->tableAlias) . ' SET'; foreach ($this->augmentingQueryBuilder->getColumnNamesToValues() as $columnName => $value) { - $sql .= ' ' . $columnName . ' = ?,'; + if ($value instanceof Expression) { + $sql .= ' ' . $columnName . ' = ' . $value->getSql() . ','; + } else { + $sql .= ' ' . $columnName . ' = ?,'; + } } - $sql = trim($sql, ','); + $sql = rtrim($sql, ','); // Add any conditions $sql .= $this->conditionalQueryBuilder ->getClauseConditionSql('WHERE', $this->conditionalQueryBuilder->getWhereConditions()); diff --git a/src/QueryBuilders/tests/InsertQueryTest.php b/src/QueryBuilders/tests/InsertQueryTest.php index e7f8f7b63..ee1ae90bb 100644 --- a/src/QueryBuilders/tests/InsertQueryTest.php +++ b/src/QueryBuilders/tests/InsertQueryTest.php @@ -12,6 +12,7 @@ namespace Opulence\QueryBuilders\tests; +use Opulence\QueryBuilders\Expression; use Opulence\QueryBuilders\InsertQuery; use PHPUnit\Framework\TestCase; @@ -41,17 +42,47 @@ public function testBasicQuery(): void ], $query->getParameters()); } - /** - * Tests all the methods in a single, complicated query - */ + public function testComplexExpression(): void + { + $query = new InsertQuery('users', + [ + 'name' => 'dave', + 'email' => 'foo@bar.com', + 'is_val_even' => new Expression('(val + ?) % ?', ['1', \PDO::PARAM_INT], [2, \PDO::PARAM_INT]) + ]); + $this->assertEquals('INSERT INTO users (name, email, is_val_even) VALUES (?, ?, (val + ?) % ?)', + $query->getSql()); + $this->assertSame([ + ['dave', \PDO::PARAM_STR], + ['foo@bar.com', \PDO::PARAM_STR], + ['1', \PDO::PARAM_INT], + [2, \PDO::PARAM_INT], + ], $query->getParameters()); + } + public function testEverything(): void { + $expr = new Expression('(val + ?) % ?', ['1', \PDO::PARAM_INT]); $query = new InsertQuery('users', ['name' => 'dave']); - $query->addColumnValues(['email' => 'foo@bar.com']); - $this->assertEquals('INSERT INTO users (name, email) VALUES (?, ?)', $query->getSql()); + $query->addColumnValues(['email' => 'foo@bar.com', 'is_val_even' => $expr]) + ->addUnnamedPlaceholderValues([[2, \PDO::PARAM_INT]]); + $this->assertEquals('INSERT INTO users (name, email, is_val_even) VALUES (?, ?, (val + ?) % ?)', $query->getSql()); + $this->assertSame([ + ['dave', \PDO::PARAM_STR], + ['foo@bar.com', \PDO::PARAM_STR], + ['1', \PDO::PARAM_INT], + [2, \PDO::PARAM_INT] + ], $query->getParameters()); + } + + public function testSimpleExpression(): void + { + $query = new InsertQuery('users', + ['name' => 'dave', 'email' => 'foo@bar.com', 'valid_until' => new Expression('NOW()')]); + $this->assertEquals('INSERT INTO users (name, email, valid_until) VALUES (?, ?, NOW())', $query->getSql()); $this->assertEquals([ ['dave', \PDO::PARAM_STR], - ['foo@bar.com', \PDO::PARAM_STR] + ['foo@bar.com', \PDO::PARAM_STR], ], $query->getParameters()); } } diff --git a/src/QueryBuilders/tests/PostgreSql/InsertQueryTest.php b/src/QueryBuilders/tests/PostgreSql/InsertQueryTest.php index ba2e35f67..2f5da78b7 100644 --- a/src/QueryBuilders/tests/PostgreSql/InsertQueryTest.php +++ b/src/QueryBuilders/tests/PostgreSql/InsertQueryTest.php @@ -12,6 +12,7 @@ namespace Opulence\QueryBuilders\Tests\PostgreSql; +use Opulence\QueryBuilders\Expression; use Opulence\QueryBuilders\PostgreSql\InsertQuery; use PDO; use PHPUnit\Framework\TestCase; @@ -37,14 +38,19 @@ public function testAddReturning(): void */ public function testEverything(): void { + $expr = new Expression("(val + ?) % ?", ['1', \PDO::PARAM_INT]); $query = new InsertQuery('users', ['name' => 'dave']); - $query->addColumnValues(['email' => 'foo@bar.com']) + $query->addColumnValues(['email' => 'foo@bar.com', 'is_val_even' => $expr]) ->returning('id') - ->addReturning('name'); - $this->assertEquals('INSERT INTO users (name, email) VALUES (?, ?) RETURNING id, name', $query->getSql()); - $this->assertEquals([ + ->addReturning('name') + ->addUnnamedPlaceholderValues([[2, \PDO::PARAM_INT]]); + $this->assertEquals('INSERT INTO users (name, email, is_val_even) VALUES (?, ?, (val + ?) % ?) RETURNING id, name', + $query->getSql()); + $this->assertSame([ ['dave', PDO::PARAM_STR], - ['foo@bar.com', PDO::PARAM_STR] + ['foo@bar.com', PDO::PARAM_STR], + ['1', \PDO::PARAM_INT], + [2, \PDO::PARAM_INT], ], $query->getParameters()); } diff --git a/src/QueryBuilders/tests/PostgreSql/UpdateQueryTest.php b/src/QueryBuilders/tests/PostgreSql/UpdateQueryTest.php index e65699cc4..57b4718d7 100644 --- a/src/QueryBuilders/tests/PostgreSql/UpdateQueryTest.php +++ b/src/QueryBuilders/tests/PostgreSql/UpdateQueryTest.php @@ -12,6 +12,7 @@ namespace Opulence\QueryBuilders\Tests\PostgreSql; +use Opulence\QueryBuilders\Expression; use Opulence\QueryBuilders\PostgreSql\UpdateQuery; use PDO; use PHPUnit\Framework\TestCase; @@ -21,9 +22,6 @@ */ class UpdateQueryTest extends TestCase { - /** - * Tests adding to a "RETURNING" clause - */ public function testAddReturning(): void { $query = new UpdateQuery('users', '', ['name' => 'david']); @@ -35,26 +33,26 @@ public function testAddReturning(): void ], $query->getParameters()); } - /** - * Tests all the methods in a single, complicated query - */ public function testEverything(): void { + $expr = new Expression('(val + ?) % ?', ['1', PDO::PARAM_INT]); $query = new UpdateQuery('users', 'u', ['name' => 'david']); - $query->addColumnValues(['email' => 'bar@foo.com']) + $query->addColumnValues(['email' => 'bar@foo.com', 'is_val_even' => $expr]) ->where('u.id = ?', 'emails.userid = u.id', 'emails.email = ?') ->orWhere('u.name = ?') ->andWhere('subscriptions.userid = u.id', "subscriptions.type = 'customer'") ->returning('u.id') ->addReturning('u.name') - ->addUnnamedPlaceholderValues([[18175, PDO::PARAM_INT], 'foo@bar.com', 'dave']); + ->addUnnamedPlaceholderValues([[2, PDO::PARAM_INT], [18175, PDO::PARAM_INT], 'foo@bar.com', 'dave']); $this->assertEquals( - "UPDATE users AS u SET name = ?, email = ? WHERE (u.id = ?) AND (emails.userid = u.id) AND (emails.email = ?) OR (u.name = ?) AND (subscriptions.userid = u.id) AND (subscriptions.type = 'customer') RETURNING u.id, u.name", + "UPDATE users AS u SET name = ?, email = ?, is_val_even = (val + ?) % ? WHERE (u.id = ?) AND (emails.userid = u.id) AND (emails.email = ?) OR (u.name = ?) AND (subscriptions.userid = u.id) AND (subscriptions.type = 'customer') RETURNING u.id, u.name", $query->getSql() ); $this->assertEquals([ ['david', PDO::PARAM_STR], ['bar@foo.com', PDO::PARAM_STR], + ['1', PDO::PARAM_INT], + [2, PDO::PARAM_INT], [18175, PDO::PARAM_INT], ['foo@bar.com', PDO::PARAM_STR], ['dave', PDO::PARAM_STR] diff --git a/src/QueryBuilders/tests/SelectQueryTest.php b/src/QueryBuilders/tests/SelectQueryTest.php index 542693ee6..d6c07de27 100644 --- a/src/QueryBuilders/tests/SelectQueryTest.php +++ b/src/QueryBuilders/tests/SelectQueryTest.php @@ -37,9 +37,6 @@ protected function setUp(): void ->willReturn([[1, PDO::PARAM_INT]]); } - /** - * Tests adding a "GROUP BY" statement to one that was already started - */ public function testAddingGroupBy(): void { $query = new SelectQuery('id', 'name'); @@ -49,9 +46,6 @@ public function testAddingGroupBy(): void $this->assertEquals('SELECT id, name FROM users GROUP BY id, name', $query->getSql()); } - /** - * Tests adding an "AND"ed and an "OR"ed "WHERE" clause - */ public function testAddingOrWhereAndWhere(): void { $query = new SelectQuery('id'); @@ -65,9 +59,6 @@ public function testAddingOrWhereAndWhere(): void ); } - /** - * Tests adding an "ORDER BY" statement to one that was already started - */ public function testAddingOrderBy(): void { $query = new SelectQuery('id', 'name'); @@ -85,9 +76,6 @@ public function testAddingSelectExpression(): void $this->assertEquals('SELECT id, name FROM users', $query->getSql()); } - /** - * Tests adding a "HAVING" condition that will be "AND"ed - */ public function testAndHaving(): void { $query = new SelectQuery('name'); @@ -101,9 +89,6 @@ public function testAndHaving(): void ); } - /** - * Tests adding a "HAVING" condition object that will be "AND"ed - */ public function testAndHavingConditionObject(): void { $query = new SelectQuery('name'); @@ -118,9 +103,6 @@ public function testAndHavingConditionObject(): void $this->assertEquals([[1, PDO::PARAM_INT]], $query->getParameters()); } - /** - * Tests adding a "WHERE" condition that will be "AND"ed - */ public function testAndWhere(): void { $query = new SelectQuery('id'); @@ -130,9 +112,6 @@ public function testAndWhere(): void $this->assertEquals("SELECT id FROM users WHERE (id > 10) AND (name <> 'dave')", $query->getSql()); } - /** - * Tests adding a "WHERE" condition object that will be "AND"ed - */ public function testAndWhereConditionObject(): void { $query = new SelectQuery('id'); @@ -157,12 +136,9 @@ public function testBasicQueryWithAlias(): void $this->assertEquals('SELECT u.id, u.name FROM users AS u', $query->getSql()); } - /** - * Tests all the methods in a single, complicated query - */ public function testEverything(): void { - $query = new SelectQuery('u.id', 'u.name', 'e.email'); + $query = new SelectQuery('u.id', 'u.name', 'e.email', 'CHARACTER_LENGTH(e.email) AS email_length'); $query->addSelectExpression('p.password') ->from('users', 'u') ->innerJoin('log', 'l', 'l.userid = u.id') @@ -183,7 +159,7 @@ public function testEverything(): void ->limit(2) ->offset(1); $this->assertEquals( - 'SELECT u.id, u.name, e.email, p.password FROM users AS u INNER JOIN log AS l ON l.userid = u.id LEFT JOIN emails AS e ON e.userid = u.id RIGHT JOIN password AS p ON p.userid = u.id WHERE (u.id <> 10) AND (u.name <> :notAllowedName) AND (u.id <> 9) OR (u.name = :allowedName) GROUP BY u.id, u.name, e.email, p.password HAVING (count(*) > :minCount) AND (count(*) < 5) OR (count(*) = 2) ORDER BY u.id DESC, u.name ASC LIMIT 2 OFFSET 1', + 'SELECT u.id, u.name, e.email, CHARACTER_LENGTH(e.email) AS email_length, p.password FROM users AS u INNER JOIN log AS l ON l.userid = u.id LEFT JOIN emails AS e ON e.userid = u.id RIGHT JOIN password AS p ON p.userid = u.id WHERE (u.id <> 10) AND (u.name <> :notAllowedName) AND (u.id <> 9) OR (u.name = :allowedName) GROUP BY u.id, u.name, e.email, p.password HAVING (count(*) > :minCount) AND (count(*) < 5) OR (count(*) = 2) ORDER BY u.id DESC, u.name ASC LIMIT 2 OFFSET 1', $query->getSql() ); $this->assertEquals([ @@ -193,9 +169,6 @@ public function testEverything(): void ], $query->getParameters()); } - /** - * Tests adding a "GROUP BY" statement - */ public function testGroupBy(): void { $query = new SelectQuery('id', 'name'); @@ -204,9 +177,6 @@ public function testGroupBy(): void $this->assertEquals('SELECT id, name FROM users GROUP BY id, name', $query->getSql()); } - /** - * Tests adding a "HAVING" condition - */ public function testHaving(): void { $query = new SelectQuery('name'); @@ -216,9 +186,6 @@ public function testHaving(): void $this->assertEquals('SELECT name FROM users GROUP BY name HAVING (COUNT(name) > 1)', $query->getSql()); } - /** - * Tests adding a "HAVING" condition object - */ public function testHavingConditionObject(): void { $query = new SelectQuery('name'); @@ -229,9 +196,6 @@ public function testHavingConditionObject(): void $this->assertEquals([[1, PDO::PARAM_INT]], $query->getParameters()); } - /** - * Tests adding an "INNER JOIN" statement - */ public function testInnerJoin(): void { $query = new SelectQuery('id'); @@ -240,9 +204,6 @@ public function testInnerJoin(): void $this->assertEquals('SELECT id FROM users AS u INNER JOIN log AS l ON l.userid = u.id', $query->getSql()); } - /** - * Tests adding a "JOIN" statement - */ public function testJoin(): void { $query = new SelectQuery('u.id'); @@ -251,9 +212,6 @@ public function testJoin(): void $this->assertEquals('SELECT u.id FROM users AS u INNER JOIN log AS l ON l.userid = u.id', $query->getSql()); } - /** - * Tests adding an "LEFT JOIN" statement - */ public function testLeftJoin(): void { $query = new SelectQuery('id'); @@ -262,9 +220,6 @@ public function testLeftJoin(): void $this->assertEquals('SELECT id FROM users AS u LEFT JOIN log AS l ON l.userid = u.id', $query->getSql()); } - /** - * Tests adding a "LIMIT" statement - */ public function testLimit(): void { $query = new SelectQuery('id', 'name'); @@ -273,9 +228,6 @@ public function testLimit(): void $this->assertEquals('SELECT id, name FROM users LIMIT 5', $query->getSql()); } - /** - * Tests adding a "LIMIT" statement with a named placeholder - */ public function testLimitWithNamedPlaceholder(): void { $query = new SelectQuery('id', 'name'); @@ -284,7 +236,7 @@ public function testLimitWithNamedPlaceholder(): void $this->assertEquals('SELECT id, name FROM users LIMIT :limit', $query->getSql()); } - public function testMixingWhereExpessionAndObject(): void + public function testMixingWhereExpressionAndObject(): void { $query = new SelectQuery('id'); $query->from('users') @@ -296,9 +248,6 @@ public function testMixingWhereExpessionAndObject(): void $this->assertEquals([[1, PDO::PARAM_INT]], $query->getParameters()); } - /** - * Tests adding multiple "JOIN" statements - */ public function testMultipleJoins(): void { $query = new SelectQuery('id'); @@ -311,9 +260,6 @@ public function testMultipleJoins(): void ); } - /** - * Tests adding a "OFFSET" statement - */ public function testOffset(): void { $query = new SelectQuery('id', 'name'); @@ -322,9 +268,6 @@ public function testOffset(): void $this->assertEquals('SELECT id, name FROM users OFFSET 5', $query->getSql()); } - /** - * Tests adding a "OFFSET" statement with a named placeholder - */ public function testOffsetWithNamedPlaceholder(): void { $query = new SelectQuery('id', 'name'); @@ -333,9 +276,6 @@ public function testOffsetWithNamedPlaceholder(): void $this->assertEquals('SELECT id, name FROM users OFFSET :offset', $query->getSql()); } - /** - * Tests adding a "HAVING" condition that will be "OR"ed - */ public function testOrHaving(): void { $query = new SelectQuery('name'); @@ -349,9 +289,6 @@ public function testOrHaving(): void ); } - /** - * Tests adding a "HAVING" condition object that will be "OR"ed - */ public function testOrHavingConditionObject(): void { $query = new SelectQuery('name'); @@ -366,9 +303,6 @@ public function testOrHavingConditionObject(): void $this->assertEquals([[1, PDO::PARAM_INT]], $query->getParameters()); } - /** - * Tests adding a "WHERE" condition that will be "OR"ed - */ public function testOrWhere(): void { $query = new SelectQuery('id'); @@ -378,9 +312,6 @@ public function testOrWhere(): void $this->assertEquals("SELECT id FROM users WHERE (id > 10) OR (name <> 'dave')", $query->getSql()); } - /** - * Tests adding a "WHERE" condition object that will be "OR"ed - */ public function testOrWhereConditionObject(): void { $query = new SelectQuery('id'); @@ -391,9 +322,6 @@ public function testOrWhereConditionObject(): void $this->assertEquals([[1, PDO::PARAM_INT]], $query->getParameters()); } - /** - * Tests adding an "ORDER BY" statement - */ public function testOrderBy(): void { $query = new SelectQuery('id', 'name'); @@ -408,9 +336,6 @@ public function testReallyBasicQuery(): void $this->assertEquals('SELECT id', $query->getSql()); } - /** - * Tests adding an "RIGHT JOIN" statement - */ public function testRightJoin(): void { $query = new SelectQuery('id'); @@ -419,9 +344,6 @@ public function testRightJoin(): void $this->assertEquals('SELECT id FROM users AS u RIGHT JOIN log AS l ON l.userid = u.id', $query->getSql()); } - /** - * Tests setting a "HAVING" condition, then resetting it - */ public function testSettingHavingConditionWhenItWasAlreadySet(): void { $query = new SelectQuery('name'); @@ -432,9 +354,6 @@ public function testSettingHavingConditionWhenItWasAlreadySet(): void $this->assertEquals('SELECT name FROM users GROUP BY name HAVING (COUNT(name) < 5)', $query->getSql()); } - /** - * Tests setting a "WHERE" condition, then resetting it - */ public function testSettingWhereConditionWhenItWasAlreadySet(): void { $query = new SelectQuery('name'); @@ -444,9 +363,6 @@ public function testSettingWhereConditionWhenItWasAlreadySet(): void $this->assertEquals('SELECT name FROM users WHERE (id = 2)', $query->getSql()); } - /** - * Tests adding a "WHERE" condition - */ public function testWhere(): void { $query = new SelectQuery('id'); @@ -455,9 +371,6 @@ public function testWhere(): void $this->assertEquals("SELECT id FROM users WHERE (id > 10) AND (name <> 'dave')", $query->getSql()); } - /** - * Tests adding a "WHERE" condition object - */ public function testWhereConditionObject(): void { $query = new SelectQuery('id'); diff --git a/src/QueryBuilders/tests/UpdateQueryTest.php b/src/QueryBuilders/tests/UpdateQueryTest.php index 66df0da64..fa4c5c71a 100644 --- a/src/QueryBuilders/tests/UpdateQueryTest.php +++ b/src/QueryBuilders/tests/UpdateQueryTest.php @@ -11,6 +11,7 @@ declare(strict_types=1); namespace Opulence\QueryBuilders\tests; +use Opulence\QueryBuilders\Expression; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; @@ -57,33 +58,46 @@ public function testBasicQuery(): void ], $query->getParameters()); } - /** - * Tests all the methods in a single, complicated query - */ public function testEverything(): void { + $expr = new Expression('(val + ?) % ?', ['1', PDO::PARAM_INT]); $query = new UpdateQuery('users', 'u', ['name' => 'david']); - $query->addColumnValues(['email' => 'bar@foo.com']) + $query->addColumnValues(['email' => 'bar@foo.com', 'is_val_even' => $expr]) ->where('u.id = ?', 'emails.userid = u.id', 'emails.email = ?') ->orWhere('u.name = ?') ->andWhere('subscriptions.userid = u.id', "subscriptions.type = 'customer'") - ->addUnnamedPlaceholderValues([[18175, PDO::PARAM_INT], 'foo@bar.com', 'dave']); - $this->assertEquals( - "UPDATE users AS u SET name = ?, email = ? WHERE (u.id = ?) AND (emails.userid = u.id) AND (emails.email = ?) OR (u.name = ?) AND (subscriptions.userid = u.id) AND (subscriptions.type = 'customer')", - $query->getSql() - ); - $this->assertEquals([ + ->addUnnamedPlaceholderValues([[2, PDO::PARAM_INT], [18175, PDO::PARAM_INT], 'foo@bar.com', 'dave']); + $this->assertEquals("UPDATE users AS u SET name = ?, email = ?, is_val_even = (val + ?) % ? WHERE (u.id = ?) AND (emails.userid = u.id) AND (emails.email = ?) OR (u.name = ?) AND (subscriptions.userid = u.id) AND (subscriptions.type = 'customer')", + $query->getSql()); + $this->assertSame([ ['david', PDO::PARAM_STR], ['bar@foo.com', PDO::PARAM_STR], + ['1', PDO::PARAM_INT], + [2, PDO::PARAM_INT], [18175, PDO::PARAM_INT], ['foo@bar.com', PDO::PARAM_STR], ['dave', PDO::PARAM_STR] ], $query->getParameters()); } - /** - * Tests adding a "WHERE" clause - */ + public function testSimpleExpression(): void + { + $query = new UpdateQuery('users', '', ['valid_until' => new Expression('NOW()')]); + $this->assertEquals('UPDATE users SET valid_until = NOW()', $query->getSql()); + $this->assertEquals([], $query->getParameters()); + } + + public function testComplexExpression(): void + { + $query = new UpdateQuery('users', '', + ['is_val_even' => new Expression('(val + ?) % ?', ['1', PDO::PARAM_INT], [2, PDO::PARAM_INT])]); + $this->assertEquals('UPDATE users SET is_val_even = (val + ?) % ?', $query->getSql()); + $this->assertEquals([ + ['1', PDO::PARAM_INT], + [2, PDO::PARAM_INT], + ], $query->getParameters()); + } + public function testWhere(): void { $query = new UpdateQuery('users', '', ['name' => 'david']); @@ -96,9 +110,6 @@ public function testWhere(): void ], $query->getParameters()); } - /** - * Tests adding a "WHERE" clause condition object - */ public function testWhereConditionObject(): void { $query = new UpdateQuery('users', '', ['name' => 'david']);