diff --git a/lib/Tumblr/StreamBuilder/Streams/BufferedRankedStream.php b/lib/Tumblr/StreamBuilder/Streams/BufferedRankedStream.php index c7d2af5..fdc6aac 100644 --- a/lib/Tumblr/StreamBuilder/Streams/BufferedRankedStream.php +++ b/lib/Tumblr/StreamBuilder/Streams/BufferedRankedStream.php @@ -85,7 +85,7 @@ public function _enumerate( $pool_deficit = ($count + $this->overfetch_count) - count($pool); if ($pool_deficit > 0) { // need to refill! - $refill_result = $this->inner->enumerate($pool_deficit, $inner_cursor, $tracer); + $refill_result = $this->inner->enumerate($pool_deficit, $inner_cursor, $tracer, $option); $refill_elements = $refill_result->get_elements(); $inner_cursor = $refill_result->get_combined_cursor(); $pool = array_merge($pool, $refill_elements); diff --git a/lib/Tumblr/StreamBuilder/Streams/FilteredStream.php b/lib/Tumblr/StreamBuilder/Streams/FilteredStream.php index 0f058f2..4e00201 100644 --- a/lib/Tumblr/StreamBuilder/Streams/FilteredStream.php +++ b/lib/Tumblr/StreamBuilder/Streams/FilteredStream.php @@ -202,14 +202,14 @@ private function _filter_rec( // if we got nothing, abort. we can't recurse because the cursor would be unchanged: if ($inner_result->get_size() == 0) { - $tracer and $tracer->filter_abort($this, $want_count, $inner_cursor, $depth); + $tracer && $tracer->filter_abort($this, $want_count, $inner_cursor, $depth); $propagated_is_exhaustive = true; return new StreamResult(true, []); } // we got some stuff, run the filter on it: $filter_result = $this->filter->filter($inner_result->get_elements(), $filter_state, $tracer); - $tracer and $tracer->filter_apply($this, $inner_result->get_size(), $filter_result); + $tracer && $tracer->filter_apply($this, $inner_result->get_size(), $filter_result); // we only care about the retained elements $retained = $filter_result->get_retained(); diff --git a/tests/unit/Tumblr/StreamBuilder/Streams/BufferedRankedStreamTest.php b/tests/unit/Tumblr/StreamBuilder/Streams/BufferedRankedStreamTest.php index 0b235e9..1330b2a 100644 --- a/tests/unit/Tumblr/StreamBuilder/Streams/BufferedRankedStreamTest.php +++ b/tests/unit/Tumblr/StreamBuilder/Streams/BufferedRankedStreamTest.php @@ -25,6 +25,7 @@ use Test\Tumblr\StreamBuilder\StreamElements\MockMaxStreamElement; use Test\Tumblr\StreamBuilder\StreamRankers\DummyStreamRanker; use Tumblr\StreamBuilder\CacheProvider; +use Tumblr\StreamBuilder\EnumerationOptions\EnumerationPreFilteringOptions; use Tumblr\StreamBuilder\Exceptions\InappropriateCursorException; use Tumblr\StreamBuilder\StreamContext; use Tumblr\StreamBuilder\StreamCursors\MultiCursor; @@ -143,4 +144,30 @@ public function test_from_template(array $template) $context = new StreamContext($template, []); $this->assertSame($template, BufferedRankedStream::from_template($context)->to_template()); } + + /** + * Test that enumerate passes the enumeration options to the inner stream when refilling the buffer. + */ + public function test_enumerate_passes_option_to_inner_stream() + { + $e1 = new MockMaxStreamElement(1, 'p1', new MockMaxCursor(1)); + $option = new EnumerationPreFilteringOptions([42], null, null); + + /** @var StreamRanker|\PHPUnit\Framework\MockObject\MockObject $ranker */ + $ranker = $this->getMockBuilder(StreamRanker::class)->disableOriginalConstructor()->getMockForAbstractClass(); + $ranker->method('rank_inner')->willReturn([$e1]); + + /** @var Stream|\PHPUnit\Framework\MockObject\MockObject $inner_stream */ + $inner_stream = $this->getMockBuilder(Stream::class)->disableOriginalConstructor()->getMockForAbstractClass(); + $inner_stream->expects($this->once()) + ->method('_enumerate') + ->with(4, null, null, $this->identicalTo($option)) + ->willReturn(new StreamResult(true, [$e1])); + + /** @var CacheProvider|\PHPUnit\Framework\MockObject\MockObject $cache_provider */ + $cache_provider = $this->getMockBuilder(CacheProvider::class)->disableOriginalConstructor()->getMockForAbstractClass(); + + $ranked_stream = new BufferedRankedStream($inner_stream, $ranker, 3, 'amazing_ranked_stream', $cache_provider); + $ranked_stream->enumerate(1, null, null, $option); + } }