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();
             }