You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2011/09/26 22:59:06 UTC
svn commit: r1176051 - in /incubator/jena/Jena2/ARQ/trunk:
src-test/org/openjena/atlas/iterator/TestIter.java
src/org/openjena/atlas/iterator/Iter.java
Author: andy
Date: Mon Sep 26 20:59:06 2011
New Revision: 1176051
URL: http://svn.apache.org/viewvc?rev=1176051&view=rev
Log:
Iter.mapMany did not cope with a stage returning an empty iterator.
Modified:
incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/atlas/iterator/TestIter.java
incubator/jena/Jena2/ARQ/trunk/src/org/openjena/atlas/iterator/Iter.java
Modified: incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/atlas/iterator/TestIter.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/atlas/iterator/TestIter.java?rev=1176051&r1=1176050&r2=1176051&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/atlas/iterator/TestIter.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/atlas/iterator/TestIter.java Mon Sep 26 20:59:06 2011
@@ -165,7 +165,60 @@ public class TestIter
});
test(it, "x", "xx", "y", "yy", "z", "zz");
- }
+ }
+
+ @Test
+ public void mapMany_02()
+ {
+ Iterator<String> it = Iter.mapMany(data2.iterator(), new Transform<String,Iterator<String>>()
+ {
+ public Iterator<String> convert(String item)
+ {
+ return Iter.nullIterator() ;
+ }
+ });
+
+ assertFalse(it.hasNext()) ;
+ }
+
+ @Test
+ public void mapMany_03()
+ {
+ Iterator<String> it = Iter.mapMany(data2.iterator(), new Transform<String,Iterator<String>>()
+ {
+ int count = 0 ;
+ public Iterator<String> convert(String item)
+ {
+ count++ ;
+ if ( count%2 == 1 )
+ return Iter.singleton(item) ;
+ else
+ return Iter.nullIterator() ;
+ }
+ });
+
+ test(it, "x", "z");
+ }
+
+ @Test
+ public void mapMany_04()
+ {
+ Iterator<String> it = Iter.mapMany(data2.iterator(), new Transform<String,Iterator<String>>()
+ {
+ int count = 0 ;
+ public Iterator<String> convert(String item)
+ {
+ count++ ;
+ if ( count%2 == 0 )
+ return Iter.singleton(item) ;
+ else
+ return Iter.nullIterator() ;
+ }
+ });
+
+ test(it, "y");
+ }
+
Filter<String> filter = new Filter<String>() {
public boolean accept(String item)
Modified: incubator/jena/Jena2/ARQ/trunk/src/org/openjena/atlas/iterator/Iter.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/org/openjena/atlas/iterator/Iter.java?rev=1176051&r1=1176050&r2=1176051&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/org/openjena/atlas/iterator/Iter.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/org/openjena/atlas/iterator/Iter.java Mon Sep 26 20:59:06 2011
@@ -296,21 +296,35 @@ public class Iter<T> implements Iterable
public static <T, R> Iterator<R> mapMany(final Iterator<? extends T> stream, final Transform<? super T, Iterator<R>> converter)
{
final Iterator<R> iter = new Iterator<R>(){
-
- private Iterator<? extends R> it = null;
+
+ private Iterator<? extends R> it = null; // Iterator for the current element of stream.
public boolean hasNext()
- {
- return stream.hasNext() || ((null != it) ? it.hasNext() : false) ;
+ {
+ if ( it != null && it.hasNext() )
+ // Element of the current iterator.
+ return true ;
+ // Start or current iterator has ended.
+ it = null ;
+
+ // Need to move to next non-empty iterator of the stream.
+ while ( stream.hasNext() )
+ {
+ it = converter.convert(stream.next());
+ if ( it.hasNext() )
+ // There is something.
+ return true ;
+ }
+ it = null ;
+ // Stream ran out.
+ return false ;
}
public R next()
- {
- if ((null == it) || !it.hasNext())
- {
- it = converter.convert(stream.next());
- }
-
+ {
+ if ( ! hasNext() )
+ throw new NoSuchElementException() ;
+ // "it" is never left at the end.
return it.next();
}