From d4814dec4251a7d14335050ad091513c167c4405 Mon Sep 17 00:00:00 2001 From: Guilherme Blanco Date: Mon, 29 Jul 2013 21:24:08 -0400 Subject: [PATCH] Synchronized support of FilterCollection with ODM by adding missing method. --- lib/Doctrine/ORM/Query/FilterCollection.php | 21 +++- .../Tests/ORM/Query/FilterCollectionTest.php | 95 +++++++++++++++++++ 2 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 tests/Doctrine/Tests/ORM/Query/FilterCollectionTest.php diff --git a/lib/Doctrine/ORM/Query/FilterCollection.php b/lib/Doctrine/ORM/Query/FilterCollection.php index e26d093f8..62fb32813 100644 --- a/lib/Doctrine/ORM/Query/FilterCollection.php +++ b/lib/Doctrine/ORM/Query/FilterCollection.php @@ -104,11 +104,13 @@ class FilterCollection */ public function enable($name) { - if (null === $filterClass = $this->config->getFilterClassName($name)) { + if ( ! $this->has($name)) { throw new \InvalidArgumentException("Filter '" . $name . "' does not exist."); } - if (!isset($this->enabledFilters[$name])) { + if ( ! $this->isEnabled($name)) { + $filterClass = $this->config->getFilterClassName($name); + $this->enabledFilters[$name] = new $filterClass($this->em); // Keep the enabled filters sorted for the hash @@ -154,13 +156,25 @@ class FilterCollection */ public function getFilter($name) { - if (!isset($this->enabledFilters[$name])) { + if ( ! $this->isEnabled($name)) { throw new \InvalidArgumentException("Filter '" . $name . "' is not enabled."); } return $this->enabledFilters[$name]; } + /** + * Checks whether filter with given name is defined. + * + * @param string $name Name of the filter. + * + * @return bool true if the filter exists, false if not. + */ + public function has($name) + { + return null !== $this->config->getFilterClassName($name); + } + /** * Checks if a filter is enabled. * @@ -194,6 +208,7 @@ class FilterCollection } $filterHash = ''; + foreach ($this->enabledFilters as $name => $filter) { $filterHash .= $name . $filter; } diff --git a/tests/Doctrine/Tests/ORM/Query/FilterCollectionTest.php b/tests/Doctrine/Tests/ORM/Query/FilterCollectionTest.php new file mode 100644 index 000000000..42266bf50 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Query/FilterCollectionTest.php @@ -0,0 +1,95 @@ + + */ +class FilterCollectionTest extends \Doctrine\Tests\OrmTestCase +{ + /** + * @var \Doctrine\ORM\EntityManager + */ + private $em; + + protected function setUp() + { + $this->em = $this->_getTestEntityManager(); + + $this->em->getConfiguration()->addFilter('testFilter', 'Doctrine\Tests\ORM\Query\MyFilter'); + } + + public function testEnable() + { + $filterCollection = $this->em->getFilters(); + + $this->assertCount(0, $filterCollection->getEnabledFilters()); + + $filterCollection->enable('testFilter'); + + $enabledFilters = $filterCollection->getEnabledFilters(); + + $this->assertCount(1, $enabledFilters); + $this->assertContainsOnly('Doctrine\Tests\ORM\Query\MyFilter', $enabledFilters); + + $filterCollection->disable('testFilter'); + $this->assertCount(0, $filterCollection->getEnabledFilters()); + } + + public function testHasFilter() + { + $filterCollection = $this->em->getFilters(); + + $this->assertTrue($filterCollection->has('testFilter')); + $this->assertFalse($filterCollection->has('fakeFilter')); + } + + /** + * @depends testEnable + */ + public function testIsEnabled() + { + $filterCollection = $this->em->getFilters(); + + $this->assertFalse($filterCollection->isEnabled('testFilter')); + + $filterCollection->enable('testFilter'); + + $this->assertTrue($filterCollection->isEnabled('testFilter')); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testGetFilterInvalidArgument() + { + $filterCollection = $this->em->getFilters(); + + $filterCollection->getFilter('testFilter'); + } + + public function testGetFilter() + { + $filterCollection = $this->em->getFilters(); + + $filterCollection->enable('testFilter'); + + $this->assertInstanceOf('Doctrine\Tests\ORM\Query\MyFilter', $filterCollection->getFilter('testFilter')); + } +} + +class MyFilter extends SQLFilter +{ + public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias) + { + // getParameter applies quoting automatically + return $targetTableAlias . '.id = ' . $this->getParameter('id'); + } +} \ No newline at end of file