diff --git a/src/Collection/CountableMappedRecords.php b/src/Collection/CountableMappedRecords.php index 47224b9..04211fe 100644 --- a/src/Collection/CountableMappedRecords.php +++ b/src/Collection/CountableMappedRecords.php @@ -1,6 +1,8 @@ setCount($count); } diff --git a/src/Collection/FilteredRecords.php b/src/Collection/FilteredRecords.php index cdfd7f4..515b5e4 100644 --- a/src/Collection/FilteredRecords.php +++ b/src/Collection/FilteredRecords.php @@ -3,5 +3,21 @@ class FilteredRecords extends RecordCollection { - // Intentionally empty. + /** @var callable */ + private $filter; + + public function __construct(\Iterator $records, RecordCollection $previousCollection, callable $filter) + { + parent::__construct($records, $previousCollection); + + $this->filter = $filter; + } + + /** + * @return callable + */ + public function getFilter() + { + return $this->filter; + } } diff --git a/src/Collection/MappedRecords.php b/src/Collection/MappedRecords.php index 0922141..1a65691 100644 --- a/src/Collection/MappedRecords.php +++ b/src/Collection/MappedRecords.php @@ -1,7 +1,25 @@ mapping = $mapping; + } + + /** + * @return Mapping + */ + public function getMapping() + { + return $this->mapping; + } } diff --git a/src/Porter.php b/src/Porter.php index 9c75e64..85a11e7 100644 --- a/src/Porter.php +++ b/src/Porter.php @@ -140,24 +140,25 @@ private function filter(ProviderRecords $records, callable $predicate, $context) } }; - return new FilteredRecords($filter(), $records); + return new FilteredRecords($filter(), $records, $filter); } private function map(RecordCollection $records, Mapping $mapping, $context) { return $this->createMappedRecords( $this->getOrCreateMapper()->mapCollection($records, $mapping, $context), - $records + $records, + $mapping ); } - private function createMappedRecords(\Iterator $records, RecordCollection $previous) + private function createMappedRecords(\Iterator $records, RecordCollection $previous, Mapping $mapping) { if ($previous instanceof \Countable) { - return new CountableMappedRecords($records, count($previous), $previous); + return new CountableMappedRecords($records, count($previous), $previous, $mapping); } - return new MappedRecords($records, $previous); + return new MappedRecords($records, $previous, $mapping); } private function applyCacheAdvice(Provider $provider, CacheAdvice $cacheAdvice) diff --git a/test/Integration/Porter/PorterTest.php b/test/Integration/Porter/PorterTest.php index b5ef7cf..fc4aceb 100644 --- a/test/Integration/Porter/PorterTest.php +++ b/test/Integration/Porter/PorterTest.php @@ -251,8 +251,11 @@ public function testFilter() ); self::assertInstanceOf(PorterRecords::class, $records); - self::assertInstanceOf(FilteredRecords::class, $records->getPreviousCollection()); self::assertSame([1, 3, 5, 7, 9], iterator_to_array($records)); + + /** @var FilteredRecords $previous */ + self::assertInstanceOf(FilteredRecords::class, $previous = $records->getPreviousCollection()); + self::assertNotSame($previous->getFilter(), $this->specification->getFilter(), 'Filter was not cloned.'); } public function testMap() @@ -260,15 +263,18 @@ public function testMap() $records = $this->porter->setMapper( \Mockery::mock(CollectionMapper::class) ->shouldReceive('mapCollection') - ->with(\Mockery::type(\Iterator::class), \Mockery::type(Mapping::class), \Mockery::any()) + ->with(\Mockery::type(\Iterator::class), $mapping = \Mockery::type(Mapping::class), \Mockery::any()) ->once() ->andReturn(new \ArrayIterator($result = ['foo' => 'bar'])) ->getMock() )->import($this->specification->setMapping(\Mockery::mock(Mapping::class))); self::assertInstanceOf(PorterRecords::class, $records); - self::assertInstanceOf(MappedRecords::class, $records->getPreviousCollection()); self::assertSame($result, iterator_to_array($records)); + + /** @var MappedRecords $previous */ + self::assertInstanceOf(MappedRecords::class, $previous = $records->getPreviousCollection()); + self::assertNotSame($mapping, $previous->getMapping(), 'Mapping was not cloned.'); } public function testApplyCacheAdvice()