You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by rv...@apache.org on 2014/11/11 11:55:34 UTC

[1/2] jena git commit: Improve performance of DatasetGraphCollection (JENA-813)

Repository: jena
Updated Branches:
  refs/heads/master 44fdb1eb6 -> 6c2c87cd9


Improve performance of DatasetGraphCollection (JENA-813)

Switches it to use IteratorConcat instead of IteratorCons.  Also
deprecates and switches all usages of IteratorCons to IteratorConcat.


Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/e4f6d625
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/e4f6d625
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/e4f6d625

Branch: refs/heads/master
Commit: e4f6d62508a58e5e2e93be63c53a7c1fd942f25d
Parents: 2746da8
Author: Rob Vesse <rv...@apache.org>
Authored: Tue Nov 11 10:49:33 2014 +0000
Committer: Rob Vesse <rv...@apache.org>
Committed: Tue Nov 11 10:49:33 2014 +0000

----------------------------------------------------------------------
 jena-arq/ReleaseNotes.txt                       |   5 +
 .../jena/sparql/core/DatasetGraphBaseFind.java  |   2 +-
 .../jena/sparql/core/DatasetGraphCaching.java   |   2 +-
 .../sparql/core/DatasetGraphCollection.java     |   5 +-
 .../org/apache/jena/atlas/iterator/Iter.java    |  29 +++-
 .../jena/atlas/iterator/IteratorConcat.java     |   1 -
 .../jena/atlas/iterator/IteratorCons.java       | 134 ++++++++++---------
 .../java/org/apache/jena/atlas/lib/Map2.java    |   2 +-
 .../apache/jena/atlas/iterator/TestIter.java    |  24 ++--
 .../jena/atlas/iterator/TestIteratorPeek.java   |   2 +-
 10 files changed, 119 insertions(+), 87 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/e4f6d625/jena-arq/ReleaseNotes.txt
----------------------------------------------------------------------
diff --git a/jena-arq/ReleaseNotes.txt b/jena-arq/ReleaseNotes.txt
index 444a93f..ac092c6 100644
--- a/jena-arq/ReleaseNotes.txt
+++ b/jena-arq/ReleaseNotes.txt
@@ -2,6 +2,11 @@ ChangeLog for ARQ
 =================
 (the list covers new features and refinements.  See ASF JIRA for details of bugs fixed) 
 
+==== Jena 2.12.2
+
++ JENA-813 : Improve performance of DatasetGraphCollection, deprecate and remove usage of Iter.append() and
+             IteratorCons in favour of Iter.concat() and IteratorConcat
+
 ==== Jena 2.12.1
 
 + JENA-768 : Add "--out" to the "riot" command to choose a 

http://git-wip-us.apache.org/repos/asf/jena/blob/e4f6d625/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphBaseFind.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphBaseFind.java b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphBaseFind.java
index e83f0c1..b08fa3a 100644
--- a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphBaseFind.java
+++ b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphBaseFind.java
@@ -73,7 +73,7 @@ abstract public class DatasetGraphBaseFind extends DatasetGraphBase
         if ( iter1 == null && iter2 == null )
             return Iter.nullIterator() ;
         // Copes with null in either position.
-        return Iter.append(iter1, iter2) ;
+        return Iter.concat(iter1, iter2) ;
     }
 
     protected abstract Iterator<Quad> findInDftGraph(Node s, Node p , Node o) ;

http://git-wip-us.apache.org/repos/asf/jena/blob/e4f6d625/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphCaching.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphCaching.java b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphCaching.java
index a73591a..d69383e 100644
--- a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphCaching.java
+++ b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphCaching.java
@@ -177,7 +177,7 @@ abstract public class DatasetGraphCaching extends DatasetGraphTriplesQuads
             for ( ; iter.hasNext() ; )
             {
                 Node gn = iter.next() ;
-                quads = Iter.append(quads, findInSpecificNamedGraph(dsg, gn, s, p, o)) ;
+                quads = Iter.concat(quads, findInSpecificNamedGraph(dsg, gn, s, p, o)) ;
             }
             return quads ;
         }

http://git-wip-us.apache.org/repos/asf/jena/blob/e4f6d625/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphCollection.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphCollection.java b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphCollection.java
index 8de21f3..1656469 100644
--- a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphCollection.java
+++ b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphCollection.java
@@ -21,6 +21,7 @@ package com.hp.hpl.jena.sparql.core;
 import java.util.Iterator ;
 
 import org.apache.jena.atlas.iterator.Iter ;
+import org.apache.jena.atlas.iterator.IteratorConcat;
 import org.apache.jena.atlas.lib.Lib ;
 
 import com.hp.hpl.jena.graph.Graph ;
@@ -70,7 +71,7 @@ public abstract class DatasetGraphCollection extends DatasetGraphBaseFind
     protected Iterator<Quad> findInAnyNamedGraphs(Node s, Node p, Node o)
     {
         Iterator<Node> gnames = listGraphNodes() ;
-        Iterator<Quad> iter = null ;
+        IteratorConcat<Quad> iter = new IteratorConcat<>() ;
         // Named graphs
         for ( ; gnames.hasNext() ; )  
         {
@@ -78,7 +79,7 @@ public abstract class DatasetGraphCollection extends DatasetGraphBaseFind
             Iterator<Quad> qIter = findInSpecificNamedGraph(gn, s, p, o) ;
             if ( qIter != null )
                 // copes with null for iter
-                iter = Iter.append(iter, qIter) ;
+                iter.add(qIter) ;
         }
         return iter ;
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/e4f6d625/jena-arq/src/main/java/org/apache/jena/atlas/iterator/Iter.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/atlas/iterator/Iter.java b/jena-arq/src/main/java/org/apache/jena/atlas/iterator/Iter.java
index 52352ea..9ae35eb 100644
--- a/jena-arq/src/main/java/org/apache/jena/atlas/iterator/Iter.java
+++ b/jena-arq/src/main/java/org/apache/jena/atlas/iterator/Iter.java
@@ -443,11 +443,18 @@ public class Iter<T> implements Iterable<T>, Iterator<T> {
         return Iter.operate(stream, action) ;
     }
 
+    /**
+     * @deprecated Use {@link #concat(Iterable, Iterable)} instead which is much more performant
+     */
+    @Deprecated
     public static <T> Iterator<T> append(Iterable<T> iter1, Iterable<T> iter2) {
         return IteratorCons.create(iterator(iter1), iterator(iter2)) ;
     }
 
-    // Could try for <? extends T> on each arg.
+    /**
+     * @deprecated Use {@link #concat(Iterator, Iterator)} instead which is much more performant
+     */
+    @Deprecated
     public static <T> Iterator<T> append(Iterator<? extends T> iter1, Iterator<? extends T> iter2) {
         return IteratorCons.create(iter1, iter2) ;
     }
@@ -747,7 +754,7 @@ public class Iter<T> implements Iterable<T>, Iterator<T> {
             return iter2 ;
         if ( iter2 == null )
             return iter1 ;
-        return iter1.append(iter2) ;
+        return iter1.concat(iter2) ;
     }
 
     public static <T> Iterator<T> concat(Iterator<T> iter1, Iterator<T> iter2) {
@@ -755,7 +762,15 @@ public class Iter<T> implements Iterable<T>, Iterator<T> {
             return iter2 ;
         if ( iter2 == null )
             return iter1 ;
-        return Iter.iter(iter1).append(Iter.iter(iter2)) ;
+        return Iter.iter(iter1).concat(Iter.iter(iter2)) ;
+    }
+    
+    public static <T> Iterator<T> concat(Iterable<T> iter1, Iterable<T> iter2) {
+        if (iter1 == null)
+            return iter2.iterator();
+        if (iter2 == null)
+            return iter1.iterator();
+        return Iter.concat(iter1.iterator(), iter2.iterator());
     }
 
     public static <T> T first(Iterator<T> iter, Filter<T> filter) {
@@ -886,9 +901,17 @@ public class Iter<T> implements Iterable<T>, Iterator<T> {
         apply(iterator, action) ;
     }
 
+    /**
+     * @deprecated Use {@link #concat(Iterator)} instead which is much more performant
+     */
+    @Deprecated
     public Iter<T> append(Iterator<T> iter) {
         return new Iter<>(IteratorCons.create(iterator, iter)) ;
     }
+    
+    public Iter<T> concat(Iterator<T> iter) {
+        return new Iter<>(IteratorConcat.concat(iterator, iter));
+    }
 
     /** Return an Iter that yields at most the first N items */
     public Iter<T> take(int N) {

http://git-wip-us.apache.org/repos/asf/jena/blob/e4f6d625/jena-arq/src/main/java/org/apache/jena/atlas/iterator/IteratorConcat.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/atlas/iterator/IteratorConcat.java b/jena-arq/src/main/java/org/apache/jena/atlas/iterator/IteratorConcat.java
index 34badf9..3860d0c 100644
--- a/jena-arq/src/main/java/org/apache/jena/atlas/iterator/IteratorConcat.java
+++ b/jena-arq/src/main/java/org/apache/jena/atlas/iterator/IteratorConcat.java
@@ -37,7 +37,6 @@ public class IteratorConcat<T> implements Iterator<T>
     private Iterator<T> removeFrom = null ;
     boolean finished = false ;
     
-    /** @see IteratorCons */
     public static <T> Iterator<T> concat(Iterator<T> iter1, Iterator<T> iter2)
     {
         if (iter2 == null) return iter1 ;

http://git-wip-us.apache.org/repos/asf/jena/blob/e4f6d625/jena-arq/src/main/java/org/apache/jena/atlas/iterator/IteratorCons.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/atlas/iterator/IteratorCons.java b/jena-arq/src/main/java/org/apache/jena/atlas/iterator/IteratorCons.java
index b255f59..e86cdee 100644
--- a/jena-arq/src/main/java/org/apache/jena/atlas/iterator/IteratorCons.java
+++ b/jena-arq/src/main/java/org/apache/jena/atlas/iterator/IteratorCons.java
@@ -18,100 +18,104 @@
 
 package org.apache.jena.atlas.iterator;
 
-import java.util.Iterator ;
-import java.util.NoSuchElementException ;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
 
-/** IteratorCons : the concatenation of two iterators.
+/**
+ * IteratorCons : the concatenation of two iterators.
+ * <p>
+ * This has known performance issues when used with lots of iterators and so
+ * should be avoided in favour of {@link IteratorConcat} which is much better
+ * performing (see <a
+ * href="https://issues.apache.org/jira/browse/JENA-813">JENA-813</a> for some
+ * discussion)
+ * </p>
+ * 
+ * @deprecated Use the more performant {@link IteratorConcat} instead
  */
-
-public class IteratorCons<T> implements Iterator<T>, Iterable<T>
-{
+@Deprecated
+public class IteratorCons<T> implements Iterator<T>, Iterable<T> {
     // No - we don't really need IteratorCons and IteratorConcat
     // Historical.
-    
-    private Iterator<? extends T> iter1 ;
-    private Iterator<? extends T> iter2 ;
-    private Iterator<? extends T> removeFrom ;
 
-    public static <X> Iterator<X> create(Iterator<? extends X> iter1, Iterator<? extends X> iter2)
-    {
-        if ( iter1 == null && iter2 == null )
-            return Iter.nullIter() ;
-        
-        // The casts are safe because an iterator can only return X, and does not take an X an an assignment.  
-        if ( iter1 == null )
-        {
+    private Iterator<? extends T> iter1;
+    private Iterator<? extends T> iter2;
+    private Iterator<? extends T> removeFrom;
+
+    /**
+     * @deprecated Use {@link IteratorConcat#concat(Iterator, Iterator)} instead which is much more performant
+     */
+    @Deprecated
+    public static <X> Iterator<X> create(Iterator<? extends X> iter1, Iterator<? extends X> iter2) {
+        if (iter1 == null && iter2 == null)
+            return Iter.nullIter();
+
+        // The casts are safe because an iterator can only return X, and does
+        // not take an X an an assignment.
+        if (iter1 == null) {
             @SuppressWarnings("unchecked")
-            Iterator<X> x = (Iterator<X>)iter2 ;
-            return x ;
+            Iterator<X> x = (Iterator<X>) iter2;
+            return x;
         }
-        
-        if ( iter2 == null )
-        {
+
+        if (iter2 == null) {
             @SuppressWarnings("unchecked")
-            Iterator<X> x = (Iterator<X>)iter1 ;
-            return x ;
+            Iterator<X> x = (Iterator<X>) iter1;
+            return x;
         }
-        
-        return new IteratorCons<>(iter1, iter2) ;
+
+        return new IteratorCons<>(iter1, iter2);
     }
-    
-    private IteratorCons(Iterator<? extends T> iter1, Iterator<? extends T> iter2)
-    {
-        this.iter1 = iter1 ;
-        this.iter2 = iter2 ;
+
+    private IteratorCons(Iterator<? extends T> iter1, Iterator<? extends T> iter2) {
+        this.iter1 = iter1;
+        this.iter2 = iter2;
     }
 
     @Override
-    public boolean hasNext()
-    {
-        if ( iter1 != null )
-        {
-            if ( iter1.hasNext() ) return true ;
+    public boolean hasNext() {
+        if (iter1 != null) {
+            if (iter1.hasNext())
+                return true;
             // Iter1 ends
-            iter1 = null ;
+            iter1 = null;
         }
-        
-        if ( iter2 != null )
-        {
-            if ( iter2.hasNext() ) return true ;
+
+        if (iter2 != null) {
+            if (iter2.hasNext())
+                return true;
             // Iter2 ends
-            iter2 = null ;
+            iter2 = null;
         }
-        return false ; 
+        return false;
     }
 
     @Override
-    public T next()
-    {
-        if ( ! hasNext() )
-            throw new NoSuchElementException("Iterator2.next") ;
-        if ( iter1 != null )
-        {
-            removeFrom = iter1 ;
+    public T next() {
+        if (!hasNext())
+            throw new NoSuchElementException("Iterator2.next");
+        if (iter1 != null) {
+            removeFrom = iter1;
             return iter1.next();
         }
-        if ( iter2 != null )
-        {
-            removeFrom = iter2 ;
+        if (iter2 != null) {
+            removeFrom = iter2;
             return iter2.next();
         }
-        throw new Error("Iterator2.next") ;
+        throw new Error("Iterator2.next");
     }
 
     @Override
-    public void remove()
-    {
-        if ( null == removeFrom )
-            throw new IllegalStateException("no calls to next() since last call to remove()") ;
-        
-        removeFrom.remove() ;
-        removeFrom = null ;
+    public void remove() {
+        if (null == removeFrom)
+            throw new IllegalStateException("no calls to next() since last call to remove()");
+
+        removeFrom.remove();
+        removeFrom = null;
     }
 
     @Override
-    public Iterator<T> iterator()
-    {
-        return this ;
+    public Iterator<T> iterator() {
+        return this;
     }
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/e4f6d625/jena-arq/src/main/java/org/apache/jena/atlas/lib/Map2.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/atlas/lib/Map2.java b/jena-arq/src/main/java/org/apache/jena/atlas/lib/Map2.java
index 75697e0..3e3a254 100644
--- a/jena-arq/src/main/java/org/apache/jena/atlas/lib/Map2.java
+++ b/jena-arq/src/main/java/org/apache/jena/atlas/lib/Map2.java
@@ -81,7 +81,7 @@ public class Map2<K, V> implements Iterable<K>
         Iter<K> iter1 = Iter.iter(map1.keySet().iterator()) ;
         if ( map2 == null )
             return iter1 ; 
-        return iter1.append(map2.iterator()) ;
+        return iter1.concat(Iter.iter(map2.iterator())) ;
     }
     
     public boolean isEmpty()

http://git-wip-us.apache.org/repos/asf/jena/blob/e4f6d625/jena-arq/src/test/java/org/apache/jena/atlas/iterator/TestIter.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/atlas/iterator/TestIter.java b/jena-arq/src/test/java/org/apache/jena/atlas/iterator/TestIter.java
index f611c03..a8b9937 100644
--- a/jena-arq/src/test/java/org/apache/jena/atlas/iterator/TestIter.java
+++ b/jena-arq/src/test/java/org/apache/jena/atlas/iterator/TestIter.java
@@ -37,29 +37,29 @@ public class TestIter
     List<String> data3 = Arrays.asList(null, "x", null, null, null, "y", "z", null);
  
     @Test
-    public void append_1()
+    public void concat_1()
     {
-        Iterator<String> iter = Iter.append(data1, data0) ;
+        Iterator<String> iter = Iter.concat(data1, data0) ;
         test(iter, "a") ;
     }
         
         
     @Test
-    public void append_2()
+    public void concat_2()
     {
-        Iterator<String> iter = Iter.append(data0, data1) ;
+        Iterator<String> iter = Iter.concat(data0, data1) ;
         test(iter, "a") ;
     }
         
     @Test
-    public void append_3()
+    public void concat_3()
     {
-        Iterator<String> iter = Iter.append(data1, data2) ;
+        Iterator<String> iter = Iter.concat(data1, data2) ;
         test(iter, "a", "x", "y", "z") ;
     }
 
     @Test
-    public void append_4()
+    public void concat_4()
     {
         List<String> L = new ArrayList<>(3);
         L.add("a");
@@ -71,7 +71,7 @@ public class TestIter
         R.add("f");
         
         
-        Iterator<String> LR = Iter.append(L, R) ;
+        Iterator<String> LR = Iter.concat(L, R) ;
         
         while (LR.hasNext())
         {
@@ -89,7 +89,7 @@ public class TestIter
     }
     
     @Test
-    public void append_5()
+    public void concat_5()
     {
         List<String> L = new ArrayList<>(3);
         L.add("a");
@@ -101,7 +101,7 @@ public class TestIter
         R.add("f");
         
         
-        Iterator<String> LR = Iter.append(L, R) ;
+        Iterator<String> LR = Iter.concat(L, R) ;
         
         while (LR.hasNext())
         {
@@ -119,7 +119,7 @@ public class TestIter
     }
     
     @Test
-    public void append_6()
+    public void concat_6()
     {
         List<String> L = new ArrayList<>(3);
         L.add("a");
@@ -131,7 +131,7 @@ public class TestIter
         R.add("f");
         
         
-        Iterator<String> LR = Iter.append(L, R) ;
+        Iterator<String> LR = Iter.concat(L, R) ;
         
         while (LR.hasNext())
         {

http://git-wip-us.apache.org/repos/asf/jena/blob/e4f6d625/jena-arq/src/test/java/org/apache/jena/atlas/iterator/TestIteratorPeek.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/atlas/iterator/TestIteratorPeek.java b/jena-arq/src/test/java/org/apache/jena/atlas/iterator/TestIteratorPeek.java
index 33f0b70..59b3dee 100644
--- a/jena-arq/src/test/java/org/apache/jena/atlas/iterator/TestIteratorPeek.java
+++ b/jena-arq/src/test/java/org/apache/jena/atlas/iterator/TestIteratorPeek.java
@@ -45,7 +45,7 @@ public class TestIteratorPeek extends BaseTest
     @Test public void iter_01() 
     {
         Iter<String> iter = Iter.iter(data2) ;
-        iter = iter.append(data2.iterator()) ;
+        iter = iter.concat(data2.iterator()) ;
         test(iter, "x", "y", "z", "x", "y", "z") ;
     }
     


[2/2] jena git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/jena

Posted by rv...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/jena

Merge together mine and Andy's javadoc changes

Conflicts:
	jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphCollection.java
	jena-arq/src/main/java/org/apache/jena/atlas/iterator/Iter.java
	jena-arq/src/main/java/org/apache/jena/atlas/iterator/IteratorConcat.java


Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/6c2c87cd
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/6c2c87cd
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/6c2c87cd

Branch: refs/heads/master
Commit: 6c2c87cd98785149984a9e13c012e4489a608ce9
Parents: e4f6d62 44fdb1e
Author: Rob Vesse <rv...@apache.org>
Authored: Tue Nov 11 10:55:00 2014 +0000
Committer: Rob Vesse <rv...@apache.org>
Committed: Tue Nov 11 10:55:00 2014 +0000

----------------------------------------------------------------------
 .../com/hp/hpl/jena/sparql/core/DatasetGraphCollection.java   | 2 +-
 .../java/org/apache/jena/atlas/iterator/IteratorConcat.java   | 7 +++++++
 2 files changed, 8 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/6c2c87cd/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphCollection.java
----------------------------------------------------------------------
diff --cc jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphCollection.java
index 1656469,ac9530d..3986e30
--- a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphCollection.java
+++ b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphCollection.java
@@@ -72,6 -72,7 +72,7 @@@ public abstract class DatasetGraphColle
      {
          Iterator<Node> gnames = listGraphNodes() ;
          IteratorConcat<Quad> iter = new IteratorConcat<>() ;
 -        
++
          // Named graphs
          for ( ; gnames.hasNext() ; )  
          {

http://git-wip-us.apache.org/repos/asf/jena/blob/6c2c87cd/jena-arq/src/main/java/org/apache/jena/atlas/iterator/IteratorConcat.java
----------------------------------------------------------------------
diff --cc jena-arq/src/main/java/org/apache/jena/atlas/iterator/IteratorConcat.java
index 3860d0c,bc8bdfd..3d5958c
--- a/jena-arq/src/main/java/org/apache/jena/atlas/iterator/IteratorConcat.java
+++ b/jena-arq/src/main/java/org/apache/jena/atlas/iterator/IteratorConcat.java
@@@ -37,6 -37,13 +37,13 @@@ public class IteratorConcat<T> implemen
      private Iterator<T> removeFrom = null ;
      boolean finished = false ;
      
+     /** 
 -     * Usually better to create an IteratorConcat explicitly and add iterator if theer are going to be many.
++     * Usually better to create an IteratorConcat explicitly and add iterator if there are going to be many.
+      * @param iter1
+      * @param iter2
+      * @return Iterator
+      * @see IteratorCons
+      */
      public static <T> Iterator<T> concat(Iterator<T> iter1, Iterator<T> iter2)
      {
          if (iter2 == null) return iter1 ;