From a6eb5dc4f872f1b7b3d6f758f48668c80305712e Mon Sep 17 00:00:00 2001 From: Dave Redfern Date: Sun, 29 Jan 2023 16:31:25 -0500 Subject: [PATCH] Fix not using mapped operator when method is comparison --- CHANGELOG.md | 5 +++ .../ApplyApiExpressionsToDBALQueryBuilder.php | 6 +++- ...lyApiExpressionsToDBALQueryBuilderTest.php | 31 +++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e892208..4eff340 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Change Log ========== +2023-01-29 - 5.2.3 +------------------ + + * Fix bug in API Expression to DBAL helper not using correct operator mapping when using comparison + 2023-01-29 - 5.2.2 ------------------ diff --git a/src/Request/Filters/ApplyApiExpressionsToDBALQueryBuilder.php b/src/Request/Filters/ApplyApiExpressionsToDBALQueryBuilder.php index 02ef8f1..c900330 100644 --- a/src/Request/Filters/ApplyApiExpressionsToDBALQueryBuilder.php +++ b/src/Request/Filters/ApplyApiExpressionsToDBALQueryBuilder.php @@ -86,7 +86,11 @@ private function buildExpression(APIExpression $where, QueryBuilder $qb): Compos } if ('comparison' === $method) { - $parts[] = $qb->expr()->comparison($this->mapField($part->field), $part->operator, ':' . array_keys($values)[0]); + $parts[] = $qb->expr()->comparison( + $this->mapField($part->field), + $this->mapFieldOperator($part->field, $part->operator), + ':' . array_keys($values)[0] + ); } else { $parts[] = $qb->expr()->$method($this->mapField($part->field), ':' . array_keys($values)[0]); } diff --git a/tests/Request/Filters/ApplyApiExpressionsToDBALQueryBuilderTest.php b/tests/Request/Filters/ApplyApiExpressionsToDBALQueryBuilderTest.php index cb92026..9a6fa12 100644 --- a/tests/Request/Filters/ApplyApiExpressionsToDBALQueryBuilderTest.php +++ b/tests/Request/Filters/ApplyApiExpressionsToDBALQueryBuilderTest.php @@ -6,9 +6,11 @@ use PHPUnit\Framework\TestCase; use Somnambulist\Bundles\ApiBundle\Request\Filters\ApplyApiExpressionsToDBALQueryBuilder; use Somnambulist\Bundles\ApiBundle\Request\Filters\Decoders\CompoundNestedArrayFilterDecoder; +use Somnambulist\Bundles\ApiBundle\Request\Filters\Decoders\SimpleApiFilterDecoder; use Somnambulist\Bundles\ApiBundle\Tests\Support\Stubs\Forms\SearchFormRequest; use Somnambulist\Bundles\FormRequestBundle\Http\FormRequest; use Somnambulist\Components\ApiClient\Client\Query\Encoders\CompoundNestedArrayEncoder; +use Somnambulist\Components\ApiClient\Client\Query\Encoders\SimpleEncoder; use Somnambulist\Components\ApiClient\Client\Query\QueryBuilder; use Symfony\Component\HttpFoundation\Request; @@ -170,4 +172,33 @@ public function testOperatorMappingOfILike() $this->assertEquals('SELECT WHERE table.name ILIKE :table_name_0', $qb->getSQL()); } + + public function testOperatorMappingOfILikeSimpleDecoder() + { + $qb = new QueryBuilder(); + $qb->where($qb->expr()->eq('this', 'that')); + + $queryString = http_build_query((new SimpleEncoder())->encode($qb)); + + $GET = []; + parse_str($queryString, $GET); + + $formRequest = new SearchFormRequest(new Request($GET)); + FormRequest::appendValidationData($formRequest, $GET); + $parser = new SimpleApiFilterDecoder(); + $result = $parser->decode($formRequest); + + $qb = new \Doctrine\DBAL\Query\QueryBuilder(DriverManager::getConnection(['url' => 'sqlite:///:in-memory:'])); + + (new ApplyApiExpressionsToDBALQueryBuilder( + [ + 'this' => 'table.name', + ], + [ + 'this' => 'ILIKE', + ] + ))->apply($result, $qb); + + $this->assertEquals('SELECT WHERE table.name ILIKE :table_name_0', $qb->getSQL()); + } }