From bd07f8d3dd303891fa9c662c46fb702a8cac6bf9 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 19 Dec 2011 08:43:42 +0100 Subject: [PATCH] [DDC-551] Add type inference to SQLFilter::setParameter() + cleaned tests --- lib/Doctrine/ORM/Query/Filter/SQLFilter.php | 15 +++-- .../Tests/ORM/Functional/SQLFilterTest.php | 61 +++++++++++++------ 2 files changed, 55 insertions(+), 21 deletions(-) diff --git a/lib/Doctrine/ORM/Query/Filter/SQLFilter.php b/lib/Doctrine/ORM/Query/Filter/SQLFilter.php index 1250b16d7..a87dd841e 100644 --- a/lib/Doctrine/ORM/Query/Filter/SQLFilter.php +++ b/lib/Doctrine/ORM/Query/Filter/SQLFilter.php @@ -19,8 +19,9 @@ namespace Doctrine\ORM\Query\Filter; -use Doctrine\ORM\Mapping\ClassMetaData; -use Doctrine\ORM\EntityManager; +use Doctrine\ORM\EntityManager, + Doctrine\ORM\Mapping\ClassMetaData, + Doctrine\ORM\Query\ParameterTypeInferer; /** * The base class that user defined filters should extend. @@ -60,12 +61,18 @@ abstract class SQLFilter * * @param string $name Name of the parameter. * @param string $value Value of the parameter. - * @param string $type Type of the parameter. + * @param string $type The parameter type. If specified, the given value will be run through + * the type conversion of this type. This is usually not needed for + * strings and numeric types. * * @return SQLFilter The current SQL filter. */ - final public function setParameter($name, $value, $type) + final public function setParameter($name, $value, $type = null) { + if (null === $type) { + $type = ParameterTypeInferer::inferType($value); + } + $this->parameters[$name] = array('value' => $value, 'type' => $type); // Keep the parameters sorted for the hash diff --git a/tests/Doctrine/Tests/ORM/Functional/SQLFilterTest.php b/tests/Doctrine/Tests/ORM/Functional/SQLFilterTest.php index 1a20344a9..ebb2c66cc 100644 --- a/tests/Doctrine/Tests/ORM/Functional/SQLFilterTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/SQLFilterTest.php @@ -2,6 +2,7 @@ namespace Doctrine\Tests\ORM\Functional; +use Doctrine\DBAL\Types\Type; use Doctrine\ORM\Query\Filter\SQLFilter; use Doctrine\ORM\Mapping\ClassMetaData; use Doctrine\Common\Cache\ArrayCache; @@ -213,7 +214,33 @@ class SQLFilterTest extends \Doctrine\Tests\OrmFunctionalTestCase $filter = new MyLocaleFilter($em); - $filter->setParameter('locale', 'en', \Doctrine\DBAL\Types\Type::STRING); + $filter->setParameter('locale', 'en', Type::STRING); + + $this->assertEquals("'en'", $filter->getParameter('locale')); + } + + public function testSQLFilterSetParameterInfersType() + { + // Setup mock connection + $conn = $this->getMockConnection(); + $conn->expects($this->once()) + ->method('quote') + ->with($this->equalTo('en')) + ->will($this->returnValue("'en'")); + + $em = $this->getMockEntityManager($conn); + $em->expects($this->once()) + ->method('getConnection') + ->will($this->returnValue($conn)); + + $filterCollection = $this->addMockFilterCollection($em); + $filterCollection + ->expects($this->once()) + ->method('setFiltersStateDirty'); + + $filter = new MyLocaleFilter($em); + + $filter->setParameter('locale', 'en'); $this->assertEquals("'en'", $filter->getParameter('locale')); } @@ -243,16 +270,16 @@ class SQLFilterTest extends \Doctrine\Tests\OrmFunctionalTestCase $filterCollection = $this->addMockFilterCollection($em); $filter = new MyLocaleFilter($em); - $filter->setParameter('locale', 'en', \Doctrine\DBAL\Types\Type::STRING); - $filter->setParameter('foo', 'bar', \Doctrine\DBAL\Types\Type::STRING); + $filter->setParameter('locale', 'en', Type::STRING); + $filter->setParameter('foo', 'bar', Type::STRING); $filter2 = new MyLocaleFilter($em); - $filter2->setParameter('foo', 'bar', \Doctrine\DBAL\Types\Type::STRING); - $filter2->setParameter('locale', 'en', \Doctrine\DBAL\Types\Type::STRING); + $filter2->setParameter('foo', 'bar', Type::STRING); + $filter2->setParameter('locale', 'en', Type::STRING); $parameters = array( - 'foo' => array('value' => 'bar', 'type' => \Doctrine\DBAL\Types\Type::STRING), - 'locale' => array('value' => 'en', 'type' => \Doctrine\DBAL\Types\Type::STRING), + 'foo' => array('value' => 'bar', 'type' => Type::STRING), + 'locale' => array('value' => 'en', 'type' => Type::STRING), ); $this->assertEquals(serialize($parameters), ''.$filter); @@ -292,7 +319,7 @@ class SQLFilterTest extends \Doctrine\Tests\OrmFunctionalTestCase $conf = $this->_em->getConfiguration(); $conf->addFilter("country", "\Doctrine\Tests\ORM\Functional\CMSCountryFilter"); $this->_em->getFilters()->enable("country") - ->setParameter("country", "en", \Doctrine\DBAL\Types\Type::getType(\Doctrine\DBAL\Types\Type::STRING)->getBindingType()); + ->setParameter("country", "en", Type::STRING); $this->assertNotEquals($firstSQLQuery, $query->getSQL()); } @@ -309,7 +336,7 @@ class SQLFilterTest extends \Doctrine\Tests\OrmFunctionalTestCase $conf = $this->_em->getConfiguration(); $conf->addFilter("country", "\Doctrine\Tests\ORM\Functional\CMSCountryFilter"); - $this->_em->getFilters()->enable("country")->setParameter("country", "Germany", \Doctrine\DBAL\Types\Type::getType(\Doctrine\DBAL\Types\Type::STRING)->getBindingType()); + $this->_em->getFilters()->enable("country")->setParameter("country", "Germany", Type::STRING); // We get one user after enabling the filter $this->assertEquals(1, count($query->getResult())); @@ -325,7 +352,7 @@ class SQLFilterTest extends \Doctrine\Tests\OrmFunctionalTestCase $conf = $this->_em->getConfiguration(); $conf->addFilter("group_prefix", "\Doctrine\Tests\ORM\Functional\CMSGroupPrefixFilter"); - $this->_em->getFilters()->enable("group_prefix")->setParameter("prefix", "bar_%", \Doctrine\DBAL\Types\Type::getType(\Doctrine\DBAL\Types\Type::STRING)->getBindingType()); + $this->_em->getFilters()->enable("group_prefix")->setParameter("prefix", "bar_%", Type::STRING); // We get one user after enabling the filter $this->assertEquals(1, count($query->getResult())); @@ -342,7 +369,7 @@ class SQLFilterTest extends \Doctrine\Tests\OrmFunctionalTestCase $conf = $this->_em->getConfiguration(); $conf->addFilter("group_prefix", "\Doctrine\Tests\ORM\Functional\CMSGroupPrefixFilter"); - $this->_em->getFilters()->enable("group_prefix")->setParameter("prefix", "bar_%", \Doctrine\DBAL\Types\Type::getType(\Doctrine\DBAL\Types\Type::STRING)->getBindingType()); + $this->_em->getFilters()->enable("group_prefix")->setParameter("prefix", "bar_%", Type::STRING); // We get one user after enabling the filter $this->assertEquals(1, count($query->getResult())); @@ -361,7 +388,7 @@ class SQLFilterTest extends \Doctrine\Tests\OrmFunctionalTestCase { $conf = $this->_em->getConfiguration(); $conf->addFilter("article_topic", "\Doctrine\Tests\ORM\Functional\CMSArticleTopicFilter"); - $this->_em->getFilters()->enable("article_topic")->setParameter("topic", "Test1", \Doctrine\DBAL\Types\Type::getType(\Doctrine\DBAL\Types\Type::STRING)->getBindingType()); + $this->_em->getFilters()->enable("article_topic")->setParameter("topic", "Test1", Type::STRING); } public function testOneToMany_ExtraLazyCountWithFilter() @@ -408,7 +435,7 @@ class SQLFilterTest extends \Doctrine\Tests\OrmFunctionalTestCase { $conf = $this->_em->getConfiguration(); $conf->addFilter("group_prefix", "\Doctrine\Tests\ORM\Functional\CMSGroupPrefixFilter"); - $this->_em->getFilters()->enable("group_prefix")->setParameter("prefix", "foo%", \Doctrine\DBAL\Types\Type::getType(\Doctrine\DBAL\Types\Type::STRING)->getBindingType()); + $this->_em->getFilters()->enable("group_prefix")->setParameter("prefix", "foo%", Type::STRING); } public function testManyToMany_ExtraLazyCountWithFilter() @@ -529,7 +556,7 @@ class SQLFilterTest extends \Doctrine\Tests\OrmFunctionalTestCase $conf->addFilter("person_name", "\Doctrine\Tests\ORM\Functional\CompanyPersonNameFilter"); $this->_em->getFilters() ->enable("person_name") - ->setParameter("name", "Guilh%", \Doctrine\DBAL\Types\Type::getType(\Doctrine\DBAL\Types\Type::STRING)->getBindingType()); + ->setParameter("name", "Guilh%", Type::STRING); $managers = $this->_em->getRepository('Doctrine\Tests\Models\Company\CompanyManager')->findAll(); $this->assertEquals(1, count($managers)); @@ -549,7 +576,7 @@ class SQLFilterTest extends \Doctrine\Tests\OrmFunctionalTestCase $conf->addFilter("person_name", "\Doctrine\Tests\ORM\Functional\CompanyPersonNameFilter"); $this->_em->getFilters() ->enable("person_name") - ->setParameter("name", "Guilh%", \Doctrine\DBAL\Types\Type::getType(\Doctrine\DBAL\Types\Type::STRING)->getBindingType()); + ->setParameter("name", "Guilh%", Type::STRING); $persons = $this->_em->getRepository('Doctrine\Tests\Models\Company\CompanyPerson')->findAll(); $this->assertEquals(1, count($persons)); @@ -595,7 +622,7 @@ class SQLFilterTest extends \Doctrine\Tests\OrmFunctionalTestCase $conf->addFilter("completed_contract", "\Doctrine\Tests\ORM\Functional\CompletedContractFilter"); $this->_em->getFilters() ->enable("completed_contract") - ->setParameter("completed", true, \Doctrine\DBAL\Types\Type::getType(\Doctrine\DBAL\Types\Type::BOOLEAN)->getBindingType()); + ->setParameter("completed", true, Type::BOOLEAN); $this->assertEquals(1, count($this->_em->getRepository('Doctrine\Tests\Models\Company\CompanyFlexUltraContract')->findAll())); $this->assertEquals(1, count($this->_em->createQuery("SELECT cfc FROM Doctrine\Tests\Models\Company\CompanyFlexUltraContract cfc")->getResult())); @@ -612,7 +639,7 @@ class SQLFilterTest extends \Doctrine\Tests\OrmFunctionalTestCase $conf->addFilter("completed_contract", "\Doctrine\Tests\ORM\Functional\CompletedContractFilter"); $this->_em->getFilters() ->enable("completed_contract") - ->setParameter("completed", true, \Doctrine\DBAL\Types\Type::getType(\Doctrine\DBAL\Types\Type::BOOLEAN)->getBindingType()); + ->setParameter("completed", true, Type::BOOLEAN); $this->assertEquals(2, count($this->_em->getRepository('Doctrine\Tests\Models\Company\CompanyFlexContract')->findAll())); $this->assertEquals(2, count($this->_em->createQuery("SELECT cfc FROM Doctrine\Tests\Models\Company\CompanyFlexContract cfc")->getResult()));