Skip to content

Commit

Permalink
Fix issue with condition_pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
delormejonathan committed Jul 18, 2024
1 parent e3e9381 commit 7ac669c
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 27 deletions.
7 changes: 5 additions & 2 deletions Event/Subscriber/AbstractDoctrineSubscriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -233,19 +233,22 @@ public function filterNumberRange(GetFilterConditionEvent $event)
public function filterText(GetFilterConditionEvent $event)
{
$expr = $event->getFilterQuery()->getExpr();
$exprBuilder = $event->getFilterQuery()->getExpressionBuilder();
$expression = $expr->andX();
$values = $event->getValues();

if ('' !== $values['value'] && null !== $values['value']) {
$paramName = sprintf('p_%s', str_replace('.', '_', $event->getField()));
$paramName = $this->generateParameterName($event->getField());

if (isset($values['condition_pattern'])) {
$expression->add($expr->like($event->getField(), ':' . $paramName, $values['condition_pattern']));
$value = $exprBuilder->convertTypeToMask($values['value'], $values['condition_pattern']);
} else {
$expression->add($expr->like($event->getField(), ':' . $paramName));
$value = $values['value'];
}

$event->setCondition($expression, [$paramName => $values['value']]);
$event->setCondition($expression, [$paramName => $value]);
}
}

Expand Down
2 changes: 1 addition & 1 deletion Filter/Doctrine/Expression/ExpressionBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ protected function convertToSqlDateTime($date)
*
* @throws \InvalidArgumentException
*/
protected function convertTypeToMask($value, $type)
public function convertTypeToMask($value, $type)
{
if ($this->forceCaseInsensitivity) {
$value = $this->encoding ? mb_strtolower($value, $this->encoding) : mb_strtolower($value);
Expand Down
14 changes: 7 additions & 7 deletions Tests/Filter/Doctrine/DBALQueryBuilderUpdaterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ public function testBuildQuery()
{
parent::createBuildQueryTest('getSQL', [
'SELECT i FROM item i',
'SELECT i FROM item i WHERE i.name LIKE \'blabla\'',
'SELECT i FROM item i WHERE (i.name LIKE \'blabla\') AND (i.position > :p_i_position)',
'SELECT i FROM item i WHERE (i.name LIKE \'blabla\') AND (i.position > :p_i_position) AND (i.enabled = :p_i_enabled)',
'SELECT i FROM item i WHERE (i.name LIKE \'blabla\') AND (i.position > :p_i_position) AND (i.enabled = :p_i_enabled)',
'SELECT i FROM item i WHERE (i.name LIKE \'%blabla\') AND (i.position <= :p_i_position) AND (i.createdAt = :p_i_createdAt)',
'SELECT i FROM item i WHERE (i.name LIKE \'%blabla\') AND (i.position <= :p_i_position) AND (i.createdAt = :p_i_createdAt)',
'SELECT i FROM item i WHERE i.name LIKE :p_i_name ESCAPE 3',
'SELECT i FROM item i WHERE (i.name LIKE :p_i_name ESCAPE 3) AND (i.position > :p_i_position)',
'SELECT i FROM item i WHERE (i.name LIKE :p_i_name ESCAPE 3) AND (i.position > :p_i_position) AND (i.enabled = :p_i_enabled)',
'SELECT i FROM item i WHERE (i.name LIKE :p_i_name ESCAPE 3) AND (i.position > :p_i_position) AND (i.enabled = :p_i_enabled)',
'SELECT i FROM item i WHERE (i.name LIKE :p_i_name ESCAPE 2) AND (i.position <= :p_i_position) AND (i.createdAt = :p_i_createdAt)',
'SELECT i FROM item i WHERE (i.name LIKE :p_i_name ESCAPE 2) AND (i.position <= :p_i_position) AND (i.createdAt = :p_i_createdAt)',
]
);
}
Expand Down Expand Up @@ -74,7 +74,7 @@ public function testDateTimeRange()

public function testFilterStandardType()
{
parent::createFilterStandardTypeTest('getSQL', ['SELECT i FROM item i WHERE (i.name LIKE \'%hey dude%\') AND (i.position = 99)']);
parent::createFilterStandardTypeTest('getSQL', ['SELECT i FROM item i WHERE (i.name LIKE :p_i_name) AND (i.position = 99)']);
}

protected function createDoctrineQueryBuilder()
Expand Down
14 changes: 9 additions & 5 deletions Tests/Filter/Doctrine/DoctrineQueryBuilderUpdater.php
Original file line number Diff line number Diff line change
Expand Up @@ -85,13 +85,16 @@ protected function createBuildQueryTest($method, array $dqls)

$filterQueryBuilder->addFilterConditions($form, $doctrineQueryBuilder);
$this->assertEquals($dqls[0], $doctrineQueryBuilder->{$method}());
$this->assertEquals([], $this->getQueryBuilderParameters($doctrineQueryBuilder));

// bind a request to the form - 1 params
$doctrineQueryBuilder = $this->createDoctrineQueryBuilder();
$form->submit(['name' => 'blabla', 'position' => '']);

$filterQueryBuilder->addFilterConditions($form, $doctrineQueryBuilder);
$this->assertEquals($dqls[1], $doctrineQueryBuilder->{$method}());
$this->assertEquals(['p_i_name' => 'blabla'], $this->getQueryBuilderParameters($doctrineQueryBuilder));


// bind a request to the form - 2 params
$form = $this->formFactory->create(ItemFilterType::class);
Expand All @@ -101,7 +104,7 @@ protected function createBuildQueryTest($method, array $dqls)

$filterQueryBuilder->addFilterConditions($form, $doctrineQueryBuilder);
$this->assertEquals($dqls[2], $doctrineQueryBuilder->{$method}());
$this->assertEquals(['p_i_position' => 2], $this->getQueryBuilderParameters($doctrineQueryBuilder));
$this->assertEquals(['p_i_name' => 'blabla', 'p_i_position' => 2.0], $this->getQueryBuilderParameters($doctrineQueryBuilder));

// bind a request to the form - 3 params
$form = $this->formFactory->create(ItemFilterType::class);
Expand All @@ -111,7 +114,7 @@ protected function createBuildQueryTest($method, array $dqls)

$filterQueryBuilder->addFilterConditions($form, $doctrineQueryBuilder);
$this->assertEquals($dqls[3], $doctrineQueryBuilder->{$method}());
$this->assertEquals(['p_i_position' => 2, 'p_i_enabled' => true], $this->getQueryBuilderParameters($doctrineQueryBuilder));
$this->assertEquals(['p_i_name' => 'blabla', 'p_i_position' => 2.0, 'p_i_enabled' => 1], $this->getQueryBuilderParameters($doctrineQueryBuilder));

// bind a request to the form - 3 params (use checkbox for enabled field)
$form = $this->formFactory->create(ItemFilterType::class, null, ['checkbox' => true]);
Expand All @@ -121,7 +124,7 @@ protected function createBuildQueryTest($method, array $dqls)

$filterQueryBuilder->addFilterConditions($form, $doctrineQueryBuilder);
$this->assertEquals($dqls[4], $doctrineQueryBuilder->{$method}());
$this->assertEquals(['p_i_position' => 2, 'p_i_enabled' => 1], $this->getQueryBuilderParameters($doctrineQueryBuilder));
$this->assertEquals(['p_i_name' => 'blabla', 'p_i_position' => 2, 'p_i_enabled' => 1], $this->getQueryBuilderParameters($doctrineQueryBuilder));

// bind a request to the form - date + pattern selector
$year = \date('Y');
Expand All @@ -148,7 +151,7 @@ protected function createBuildQueryTest($method, array $dqls)

$filterQueryBuilder->addFilterConditions($form, $doctrineQueryBuilder);
$this->assertEquals($dqls[5], $doctrineQueryBuilder->{$method}());
$this->assertEquals(['p_i_position' => 2, 'p_i_createdAt' => new \DateTime("{$year}-09-27")], $this->getQueryBuilderParameters($doctrineQueryBuilder));
$this->assertEquals(['p_i_name' => '%blabla', 'p_i_position' => 2.0, 'p_i_createdAt' => new \DateTime("{$year}-09-27")], $this->getQueryBuilderParameters($doctrineQueryBuilder));

// bind a request to the form - datetime + pattern selector
$form = $this->formFactory->create(ItemFilterType::class, null, ['with_selector' => true, 'datetime' => true]);
Expand All @@ -158,7 +161,7 @@ protected function createBuildQueryTest($method, array $dqls)

$filterQueryBuilder->addFilterConditions($form, $doctrineQueryBuilder);
$this->assertEquals($dqls[6], $doctrineQueryBuilder->{$method}());
$this->assertEquals(['p_i_position' => 2, 'p_i_createdAt' => new \DateTime("{$year}-09-27 13:21:00")], $this->getQueryBuilderParameters($doctrineQueryBuilder));
$this->assertEquals(['p_i_name' => '%blabla', 'p_i_position' => 2.0, 'p_i_createdAt' => new \DateTime("{$year}-09-27 13:21:00")], $this->getQueryBuilderParameters($doctrineQueryBuilder));
}

protected function createDisabledFieldTest($method, array $dqls)
Expand Down Expand Up @@ -304,5 +307,6 @@ public function createFilterStandardTypeTest($method, array $dqls)

$filterQueryBuilder->addFilterConditions($form, $doctrineQueryBuilder);
$this->assertEquals($dqls[0], $doctrineQueryBuilder->{$method}());
$this->assertEquals(['p_i_name' => 'hey dude'], $this->getQueryBuilderParameters($doctrineQueryBuilder));
}
}
24 changes: 12 additions & 12 deletions Tests/Filter/Doctrine/ORMQueryBuilderUpdaterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class ORMQueryBuilderUpdaterTest extends DoctrineQueryBuilderUpdater
{
public function testBuildQuery()
{
parent::createBuildQueryTest('getDQL', ['SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i', 'SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i WHERE i.name LIKE \'blabla\'', 'SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i WHERE i.name LIKE \'blabla\' AND i.position > :p_i_position', 'SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i WHERE i.name LIKE \'blabla\' AND i.position > :p_i_position AND i.enabled = :p_i_enabled', 'SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i WHERE i.name LIKE \'blabla\' AND i.position > :p_i_position AND i.enabled = :p_i_enabled', 'SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i WHERE i.name LIKE \'%blabla\' AND i.position <= :p_i_position AND i.createdAt = :p_i_createdAt', 'SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i WHERE i.name LIKE \'%blabla\' AND i.position <= :p_i_position AND i.createdAt = :p_i_createdAt']);
parent::createBuildQueryTest('getDQL', ['SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i', 'SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i WHERE i.name LIKE :p_i_name', 'SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i WHERE i.name LIKE :p_i_name AND i.position > :p_i_position', 'SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i WHERE i.name LIKE :p_i_name AND i.position > :p_i_position AND i.enabled = :p_i_enabled', 'SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i WHERE i.name LIKE :p_i_name AND i.position > :p_i_position AND i.enabled = :p_i_enabled', 'SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i WHERE i.name LIKE :p_i_name AND i.position <= :p_i_position AND i.createdAt = :p_i_createdAt', 'SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i WHERE i.name LIKE :p_i_name AND i.position <= :p_i_position AND i.createdAt = :p_i_createdAt']);
}

public function testDisabledFieldQuery()
Expand Down Expand Up @@ -69,7 +69,7 @@ public function testDateTimeRange()

public function testFilterStandardType()
{
parent::createFilterStandardTypeTest('getDQL', ['SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i WHERE i.name LIKE \'%hey dude%\' AND i.position = 99']);
parent::createFilterStandardTypeTest('getDQL', ['SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i WHERE i.name LIKE :p_i_name AND i.position = 99']);
}

public function testEmbedFormFilter()
Expand All @@ -82,11 +82,11 @@ public function testEmbedFormFilter()
$form->submit(['name' => 'dude', 'options' => [['label' => 'color', 'rank' => 3]]]);

$expectedDql = 'SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i';
$expectedDql .= ' LEFT JOIN i.options opt WHERE i.name LIKE \'dude\' AND (opt.label LIKE \'color\' AND opt.rank = :p_opt_rank)';
$expectedDql .= ' LEFT JOIN i.options opt WHERE i.name LIKE :p_i_name AND (opt.label LIKE :p_opt_label AND opt.rank = :p_opt_rank)';
$filterQueryBuilder->addFilterConditions($form, $doctrineQueryBuilder);

$this->assertEquals($expectedDql, $doctrineQueryBuilder->getDql());
$this->assertEquals(['p_opt_rank' => 3], $this->getQueryBuilderParameters($doctrineQueryBuilder));
$this->assertEquals(['p_i_name' => 'dude', 'p_opt_label' => 'color', 'p_opt_rank' => 3], $this->getQueryBuilderParameters($doctrineQueryBuilder));

// doctrine query builder with joins
$form = $this->formFactory->create(ItemEmbeddedOptionsFilterType::class);
Expand All @@ -97,13 +97,13 @@ public function testEmbedFormFilter()
$form->submit(['name' => 'dude', 'options' => [['label' => 'size', 'rank' => 5]]]);

$expectedDql = 'SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i';
$expectedDql .= ' LEFT JOIN i.options o WHERE i.name LIKE \'dude\' AND (o.label LIKE \'size\' AND o.rank = :p_o_rank)';
$expectedDql .= ' LEFT JOIN i.options o WHERE i.name LIKE :p_i_name AND (o.label LIKE :p_o_label AND o.rank = :p_o_rank)';

$filterQueryBuilder->setParts(['i.options' => 'o']);
$filterQueryBuilder->addFilterConditions($form, $doctrineQueryBuilder);

$this->assertEquals($expectedDql, $doctrineQueryBuilder->getDql());
$this->assertEquals(['p_o_rank' => 5], $this->getQueryBuilderParameters($doctrineQueryBuilder));
$this->assertEquals(['p_i_name' => 'dude', 'p_o_label' => 'size', 'p_o_rank' => 5], $this->getQueryBuilderParameters($doctrineQueryBuilder));
}

public function testCustomConditionBuilder()
Expand All @@ -126,11 +126,11 @@ public function testCustomConditionBuilder()
$form->submit(['name' => 'dude', 'options' => [['label' => 'color', 'rank' => 6]]]);

$expectedDql = 'SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i';
$expectedDql .= ' LEFT JOIN i.options opt WHERE opt.label LIKE \'color\' OR (opt.rank = :p_opt_rank AND i.name LIKE \'dude\')';
$expectedDql .= ' LEFT JOIN i.options opt WHERE opt.label LIKE :p_opt_label OR (opt.rank = :p_opt_rank AND i.name LIKE :p_i_name)';
$filterQueryBuilder->addFilterConditions($form, $doctrineQueryBuilder);

$this->assertEquals($expectedDql, $doctrineQueryBuilder->getDql());
$this->assertEquals(['p_opt_rank' => 6], $this->getQueryBuilderParameters($doctrineQueryBuilder));
$this->assertEquals(['p_i_name' => 'dude', 'p_opt_label' => 'color', 'p_opt_rank' => 6], $this->getQueryBuilderParameters($doctrineQueryBuilder));

// doctrine query builder without any joins + custom condition builder
$form = $this->formFactory->create(ItemEmbeddedOptionsFilterType::class, null, ['filter_condition_builder' => function (ConditionBuilderInterface $builder) {
Expand All @@ -153,11 +153,11 @@ public function testCustomConditionBuilder()
$form->submit(['name' => 'dude', 'position' => 1, 'options' => [['label' => 'color', 'rank' => 6]]]);

$expectedDql = 'SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i';
$expectedDql .= ' LEFT JOIN i.options opt WHERE (i.name LIKE \'dude\' OR opt.label LIKE \'color\') AND (opt.rank = :p_opt_rank OR i.position = :p_i_position)';
$expectedDql .= ' LEFT JOIN i.options opt WHERE (i.name LIKE :p_i_name OR opt.label LIKE :p_opt_label) AND (opt.rank = :p_opt_rank OR i.position = :p_i_position)';
$filterQueryBuilder->addFilterConditions($form, $doctrineQueryBuilder);

$this->assertEquals($expectedDql, $doctrineQueryBuilder->getDql());
$this->assertEquals(['p_opt_rank' => 6, 'p_i_position' => 1], $this->getQueryBuilderParameters($doctrineQueryBuilder));
$this->assertEquals(['p_i_name' => 'dude', 'p_opt_label' => 'color', 'p_opt_rank' => 6, 'p_i_position' => 1], $this->getQueryBuilderParameters($doctrineQueryBuilder));
}

public function testWithDataClass()
Expand All @@ -170,11 +170,11 @@ public function testWithDataClass()
$form->submit(['name' => 'dude', 'options' => [['label' => 'color', 'rank' => 6]]]);

$expectedDql = 'SELECT i FROM Spiriit\Bundle\FormFilterBundle\Tests\Fixtures\Entity\Item i';
$expectedDql .= ' LEFT JOIN i.options opt WHERE i.name LIKE \'dude\' AND (opt.label LIKE \'color\' AND opt.rank = :p_opt_rank)';
$expectedDql .= ' LEFT JOIN i.options opt WHERE i.name LIKE :p_i_name AND (opt.label LIKE :p_opt_label AND opt.rank = :p_opt_rank)';
$filterQueryBuilder->addFilterConditions($form, $doctrineQueryBuilder);

$this->assertEquals($expectedDql, $doctrineQueryBuilder->getDql());
$this->assertEquals(['p_opt_rank' => 6], $this->getQueryBuilderParameters($doctrineQueryBuilder));
$this->assertEquals(['p_i_name' => 'dude', 'p_opt_label' => 'color', 'p_opt_rank' => 6], $this->getQueryBuilderParameters($doctrineQueryBuilder));
}

protected function createDoctrineQueryBuilder()
Expand Down

0 comments on commit 7ac669c

Please sign in to comment.