From c45dcd955db6f05cca8914df9898366b0c810b07 Mon Sep 17 00:00:00 2001 From: Nikolai Zujev Date: Thu, 13 Nov 2014 17:14:36 +0200 Subject: [PATCH] Clean filtered objects if the entire batch was filtered away, to prevent memory allocation issue. --- Doctrine/AbstractProvider.php | 4 ++++ Tests/Doctrine/AbstractProviderTest.php | 26 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/Doctrine/AbstractProvider.php b/Doctrine/AbstractProvider.php index a662fd4..92be6ce 100644 --- a/Doctrine/AbstractProvider.php +++ b/Doctrine/AbstractProvider.php @@ -69,6 +69,10 @@ abstract class AbstractProvider extends BaseAbstractProvider $loggerClosure('Entire batch was filtered away, skipping...'); } + if ($this->options['clear_object_manager']) { + $manager->clear(); + } + continue; } diff --git a/Tests/Doctrine/AbstractProviderTest.php b/Tests/Doctrine/AbstractProviderTest.php index 99ed2de..a129a6c 100644 --- a/Tests/Doctrine/AbstractProviderTest.php +++ b/Tests/Doctrine/AbstractProviderTest.php @@ -122,6 +122,32 @@ class AbstractProviderTest extends \PHPUnit_Framework_TestCase $provider->populate(); } + public function testPopulateShouldClearObjectManagerForFilteredBatch() + { + $nbObjects = 1; + $objects = array(1); + + $provider = $this->getMockAbstractProvider(); + + $provider->expects($this->any()) + ->method('countObjects') + ->will($this->returnValue($nbObjects)); + + $provider->expects($this->any()) + ->method('fetchSlice') + ->will($this->returnValue($objects)); + + $this->indexable->expects($this->any()) + ->method('isObjectIndexable') + ->with('index', 'type', $this->anything()) + ->will($this->returnValue(false)); + + $this->objectManager->expects($this->once()) + ->method('clear'); + + $provider->populate(); + } + public function testPopulateInvokesLoggerClosure() { $nbObjects = 1;