Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
M
mongo-php-library
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
sinan
mongo-php-library
Commits
9f677306
Commit
9f677306
authored
Jan 15, 2017
by
Andreas Braun
Committed by
Jeremy Mikola
Oct 27, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
PHPLIB-81: Implement CachingIterator
parent
85f772c2
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
183 additions
and
1 deletion
+183
-1
composer.json
composer.json
+1
-1
CachingIterator.php
src/CachingIterator.php
+119
-0
CachingIteratorTest.php
tests/CachingIteratorTest.php
+63
-0
No files found.
composer.json
View file @
9f677306
...
...
@@ -10,7 +10,7 @@
{
"name"
:
"Derick Rethans"
,
"email"
:
"github@derickrethans.nl"
}
],
"require"
:
{
"php"
:
">=5.
4
"
,
"php"
:
">=5.
5
"
,
"ext-hash"
:
"*"
,
"ext-json"
:
"*"
,
"ext-mongodb"
:
"^1.3.0"
...
...
src/CachingIterator.php
0 → 100644
View file @
9f677306
<?php
namespace
MongoDB
;
class
CachingIterator
implements
\Iterator
,
\Countable
{
/**
* @var \Traversable
*/
private
$iterator
;
/**
* @var array
*/
private
$items
=
[];
/**
* @var bool
*/
private
$iteratorExhausted
=
false
;
/**
* @param \Traversable $iterator
*/
public
function
__construct
(
\Traversable
$iterator
)
{
$this
->
iterator
=
$this
->
wrapTraversable
(
$iterator
);
$this
->
storeCurrentItem
();
}
/**
* @return int
*/
public
function
count
()
{
$this
->
exhaustIterator
();
return
count
(
$this
->
items
);
}
/**
* @return mixed
*/
public
function
current
()
{
return
current
(
$this
->
items
);
}
/**
* @return mixed
*/
public
function
key
()
{
return
key
(
$this
->
items
);
}
/**
* @return void
*/
public
function
next
()
{
if
(
!
$this
->
iteratorExhausted
)
{
$this
->
iterator
->
next
();
$this
->
storeCurrentItem
();
}
next
(
$this
->
items
);
}
/**
* @return void
*/
public
function
rewind
()
{
$this
->
exhaustIterator
();
reset
(
$this
->
items
);
}
/**
* @return bool
*/
public
function
valid
()
{
return
$this
->
key
()
!==
null
;
}
/**
* Ensures the original iterator is fully consumed and all items cached
*/
private
function
exhaustIterator
()
{
while
(
!
$this
->
iteratorExhausted
)
{
$this
->
next
();
}
}
/**
* Stores the current item
*/
private
function
storeCurrentItem
()
{
if
(
null
===
$key
=
$this
->
iterator
->
key
())
{
return
;
}
$this
->
items
[
$key
]
=
$this
->
iterator
->
current
();
}
/**
* @param \Traversable $traversable
* @return \Generator
*/
private
function
wrapTraversable
(
\Traversable
$traversable
)
{
foreach
(
$traversable
as
$key
=>
$value
)
{
yield
$key
=>
$value
;
}
$this
->
iteratorExhausted
=
true
;
}
}
tests/CachingIteratorTest.php
0 → 100644
View file @
9f677306
<?php
namespace
MongoDB\Tests
;
use
MongoDB\CachingIterator
;
class
CachingIteratorTest
extends
\PHPUnit_Framework_TestCase
{
/**
* Sanity check for all following tests
* @expectedException \Exception
* @expectedExceptionMessage Cannot traverse an already closed generator
*/
public
function
testTraverseGeneratorConsumesIt
()
{
$iterator
=
$this
->
getTraversable
([
1
,
2
,
3
]);
$this
->
assertSame
([
1
,
2
,
3
],
iterator_to_array
(
$iterator
));
$this
->
assertSame
([
1
,
2
,
3
],
iterator_to_array
(
$iterator
));
}
public
function
testIterateOverItems
()
{
$iterator
=
new
CachingIterator
(
$this
->
getTraversable
([
1
,
2
,
3
]));
$expectedKey
=
0
;
$expectedItem
=
1
;
foreach
(
$iterator
as
$key
=>
$item
)
{
$this
->
assertSame
(
$expectedKey
++
,
$key
);
$this
->
assertSame
(
$expectedItem
++
,
$item
);
}
$this
->
assertFalse
(
$iterator
->
valid
());
}
public
function
testIteratePartiallyThenRewind
()
{
$iterator
=
new
CachingIterator
(
$this
->
getTraversable
([
1
,
2
,
3
]));
$this
->
assertSame
(
1
,
$iterator
->
current
());
$iterator
->
next
();
$this
->
assertSame
([
1
,
2
,
3
],
iterator_to_array
(
$iterator
));
}
public
function
testCount
()
{
$iterator
=
new
CachingIterator
(
$this
->
getTraversable
([
1
,
2
,
3
]));
$this
->
assertCount
(
3
,
$iterator
);
}
public
function
testCountAfterPartiallyIterating
()
{
$iterator
=
new
CachingIterator
(
$this
->
getTraversable
([
1
,
2
,
3
]));
$iterator
->
next
();
$this
->
assertCount
(
3
,
$iterator
);
}
private
function
getTraversable
(
$items
)
{
foreach
(
$items
as
$item
)
{
yield
$item
;
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment