Author: srowen
Date: Tue Feb  7 21:52:56 2012
New Revision: 1241650

URL: http://svn.apache.org/viewvc?rev=1241650&view=rev
Log:
MAHOUT-951 unroll recursion to avoid stack overflow

Modified:
    
mahout/trunk/integration/src/main/java/org/apache/mahout/utils/vectors/lucene/LuceneIterator.java

Modified: 
mahout/trunk/integration/src/main/java/org/apache/mahout/utils/vectors/lucene/LuceneIterator.java
URL: 
http://svn.apache.org/viewvc/mahout/trunk/integration/src/main/java/org/apache/mahout/utils/vectors/lucene/LuceneIterator.java?rev=1241650&r1=1241649&r2=1241650&view=diff
==============================================================================
--- 
mahout/trunk/integration/src/main/java/org/apache/mahout/utils/vectors/lucene/LuceneIterator.java
 (original)
+++ 
mahout/trunk/integration/src/main/java/org/apache/mahout/utils/vectors/lucene/LuceneIterator.java
 Tue Feb  7 21:52:56 2012
@@ -101,31 +101,35 @@ public final class LuceneIterator extend
   @Override
   protected Vector computeNext() {
     try {
-      if (!termDocs.next()) {
-        return endOfData();
-      }
+      int doc;
+      TermFreqVector termFreqVector;
 
-      int doc = termDocs.doc();
-      TermFreqVector termFreqVector = indexReader.getTermFreqVector(doc, 
field);
-      if (termFreqVector == null) {
-        numErrorDocs++;
-        if (numErrorDocs >= maxErrorDocs) {
-          log.error("There are too many documents that do not have a term 
vector for {}", field);
-          throw new IllegalStateException("There are too many documents that 
do not have a term vector for " + field);
+      do {
+        if (!termDocs.next()) {
+          return endOfData();
         }
-        if (numErrorDocs >= nextLogRecord) {
-          if (skippedErrorMessages == 0) {
-            log.warn("{} does not have a term vector for {}", 
indexReader.document(doc).get(idField), field);
+
+        doc = termDocs.doc();
+        termFreqVector = indexReader.getTermFreqVector(doc, field);
+        if (termFreqVector == null) {
+          numErrorDocs++;
+          if (numErrorDocs >= maxErrorDocs) {
+            log.error("There are too many documents that do not have a term 
vector for {}", field);
+            throw new IllegalStateException("There are too many documents that 
do not have a term vector for " + field);
+          }
+          if (numErrorDocs >= nextLogRecord) {
+            if (skippedErrorMessages == 0) {
+              log.warn("{} does not have a term vector for {}", 
indexReader.document(doc).get(idField), field);
+            } else {
+              log.warn("{} documents do not have a term vector for {}", 
numErrorDocs, field);
+            }
+            nextLogRecord = bump.increment();
+            skippedErrorMessages = 0;
           } else {
-            log.warn("{} documents do not have a term vector for {}", 
numErrorDocs, field);
+            skippedErrorMessages++;
           }
-          nextLogRecord = bump.increment();
-          skippedErrorMessages = 0;
-        } else {
-          skippedErrorMessages++;
         }
-        computeNext();
-      }
+      } while (termFreqVector == null);
 
       indexReader.getTermFreqVector(doc, field, mapper);
       mapper.setDocumentNumber(doc);


Reply via email to