You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2011/11/13 18:12:29 UTC
svn commit: r1201461 - in /lucene/dev/branches/lucene2621/lucene:
contrib/highlighter/src/java/org/apache/lucene/search/highlight/
contrib/memory/src/java/org/apache/lucene/index/memory/
src/java/org/apache/lucene/index/ src/java/org/apache/lucene/inde...
Author: mikemccand
Date: Sun Nov 13 17:12:28 2011
New Revision: 1201461
URL: http://svn.apache.org/viewvc?rev=1201461&view=rev
Log:
LUCENE-2621: clean up nocommits
Modified:
lucene/dev/branches/lucene2621/lucene/contrib/highlighter/src/java/org/apache/lucene/search/highlight/TokenStreamFromTermPositionVector.java
lucene/dev/branches/lucene2621/lucene/contrib/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java
lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/CheckIndex.java
lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/FieldsEnum.java
lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/IndexReader.java
lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/BlockTermsReader.java
lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/DefaultTermVectorsReader.java
lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/DefaultTermVectorsWriter.java
lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/TermVectorsReader.java
lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/TermVectorsWriter.java
lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/perfield/PerFieldPostingsFormat.java
Modified: lucene/dev/branches/lucene2621/lucene/contrib/highlighter/src/java/org/apache/lucene/search/highlight/TokenStreamFromTermPositionVector.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2621/lucene/contrib/highlighter/src/java/org/apache/lucene/search/highlight/TokenStreamFromTermPositionVector.java?rev=1201461&r1=1201460&r2=1201461&view=diff
==============================================================================
--- lucene/dev/branches/lucene2621/lucene/contrib/highlighter/src/java/org/apache/lucene/search/highlight/TokenStreamFromTermPositionVector.java (original)
+++ lucene/dev/branches/lucene2621/lucene/contrib/highlighter/src/java/org/apache/lucene/search/highlight/TokenStreamFromTermPositionVector.java Sun Nov 13 17:12:28 2011
@@ -58,9 +58,6 @@ public final class TokenStreamFromTermPo
offsetAttribute = addAttribute(OffsetAttribute.class);
final TermsEnum termsEnum = vector.iterator();
BytesRef text;
- // nocommit find all places where I "blindly" added
- // calls to .getAttribute(OffsetAttr): these are wrong.
- // instead i must check .hasAttr first
DocsAndPositionsEnum dpEnum = null;
while((text = termsEnum.next()) != null) {
dpEnum = termsEnum.docsAndPositions(null, dpEnum);
Modified: lucene/dev/branches/lucene2621/lucene/contrib/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2621/lucene/contrib/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java?rev=1201461&r1=1201460&r2=1201461&view=diff
==============================================================================
--- lucene/dev/branches/lucene2621/lucene/contrib/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java (original)
+++ lucene/dev/branches/lucene2621/lucene/contrib/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java Sun Nov 13 17:12:28 2011
@@ -1065,7 +1065,6 @@ public class MemoryIndex {
@Override
public Fields getTermVectors(int docID) {
- // nocommit is this right?
if (docID == 0) {
return fields();
} else {
Modified: lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/CheckIndex.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/CheckIndex.java?rev=1201461&r1=1201460&r2=1201461&view=diff
==============================================================================
--- lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/CheckIndex.java (original)
+++ lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/CheckIndex.java Sun Nov 13 17:12:28 2011
@@ -692,7 +692,9 @@ public class CheckIndex {
if (field == null) {
break;
}
-
+
+ // nocommit -- can we fix this!?
+ // assert fields.terms(field) != null;
computedFieldCount++;
final TermsEnum terms = fieldsEnum.terms();
@@ -1170,9 +1172,16 @@ public class CheckIndex {
FieldsEnum fieldsEnum = tfv.iterator();
String field = null;
+ String lastField = null;
while((field = fieldsEnum.next()) != null) {
status.totVectors++;
tfvComputedFieldCount++;
+
+ if (lastField == null) {
+ lastField = field;
+ } else if (lastField.compareTo(field) > 0) {
+ throw new RuntimeException("vector fields are out of order: lastField=" + lastField + " field=" + field);
+ }
Terms terms = tfv.terms(field);
TermsEnum termsEnum = terms.iterator();
@@ -1205,8 +1214,8 @@ public class CheckIndex {
final int doc = docsEnum.nextDoc();
- if (doc != j) {
- throw new RuntimeException("vector for doc " + j + " references another document: " + doc);
+ if (doc != 0) {
+ throw new RuntimeException("vector for doc " + j + " didn't return docID=0: got docID=" + doc);
}
final int tf = docsEnum.freq();
Modified: lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/FieldsEnum.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/FieldsEnum.java?rev=1201461&r1=1201460&r2=1201461&view=diff
==============================================================================
--- lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/FieldsEnum.java (original)
+++ lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/FieldsEnum.java Sun Nov 13 17:12:28 2011
@@ -54,7 +54,8 @@ public abstract class FieldsEnum {
* will not return null. */
public abstract TermsEnum terms() throws IOException;
- // nocommit maybe allow getting Terms too
+ // TODO: should we allow pulling Terms as well? not just
+ // the iterator?
public final static FieldsEnum[] EMPTY_ARRAY = new FieldsEnum[0];
Modified: lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/IndexReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/IndexReader.java?rev=1201461&r1=1201460&r2=1201461&view=diff
==============================================================================
--- lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/IndexReader.java (original)
+++ lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/IndexReader.java Sun Nov 13 17:12:28 2011
@@ -803,11 +803,17 @@ public abstract class IndexReader implem
throw new UnsupportedOperationException("This reader does not support this method.");
}
- // nocommit javadoc
+ /** Retrieve term vectors for this document, or null if
+ * term vectors were not indexed. The returned Fields
+ * instance acts like a single-document inverted index
+ * (the docID will be 0). */
abstract public Fields getTermVectors(int docID)
throws IOException;
- // nocommit javadoc
+ /** Retrieve term vector for this document and field, or
+ * null if term vectors were not indexed. The returned
+ * Fields instance acts like a single-document inverted
+ * index (the docID will be 0). */
public Terms getTermVector(int docID, String field)
throws IOException {
Fields vectors = getTermVectors(docID);
Modified: lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/BlockTermsReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/BlockTermsReader.java?rev=1201461&r1=1201460&r2=1201461&view=diff
==============================================================================
--- lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/BlockTermsReader.java (original)
+++ lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/BlockTermsReader.java Sun Nov 13 17:12:28 2011
@@ -130,7 +130,6 @@ public class BlockTermsReader extends Fi
seekDir(in, dirOffset);
final int numFields = in.readVInt();
-
for(int i=0;i<numFields;i++) {
final int field = in.readVInt();
final long numTerms = in.readVLong();
Modified: lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/DefaultTermVectorsReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/DefaultTermVectorsReader.java?rev=1201461&r1=1201460&r2=1201461&view=diff
==============================================================================
--- lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/DefaultTermVectorsReader.java (original)
+++ lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/DefaultTermVectorsReader.java Sun Nov 13 17:12:28 2011
@@ -20,6 +20,8 @@ package org.apache.lucene.index.codecs;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Set;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
@@ -114,13 +116,13 @@ public class DefaultTermVectorsReader ex
try {
String idxName = IndexFileNames.segmentFileName(segment, "", VECTORS_INDEX_EXTENSION);
tvx = d.openInput(idxName, context);
- format = checkValidFormat(tvx, idxName);
+ format = checkValidFormat(tvx);
String fn = IndexFileNames.segmentFileName(segment, "", VECTORS_DOCUMENTS_EXTENSION);
tvd = d.openInput(fn, context);
- final int tvdFormat = checkValidFormat(tvd, fn);
+ final int tvdFormat = checkValidFormat(tvd);
fn = IndexFileNames.segmentFileName(segment, "", VECTORS_FIELDS_EXTENSION);
tvf = d.openInput(fn, context);
- final int tvfFormat = checkValidFormat(tvf, fn);
+ final int tvfFormat = checkValidFormat(tvf);
assert format == tvdFormat;
assert format == tvfFormat;
@@ -218,7 +220,7 @@ public class DefaultTermVectorsReader ex
}
}
- private int checkValidFormat(IndexInput in, String fn) throws CorruptIndexException, IOException
+ private int checkValidFormat(IndexInput in) throws CorruptIndexException, IOException
{
int format = in.readInt();
if (format < FORMAT_MINIMUM)
@@ -241,13 +243,11 @@ public class DefaultTermVectorsReader ex
}
private class TVFields extends Fields {
- // nocommit make hashmap so .terms(String) is O(1)
private final int[] fieldNumbers;
private final long[] fieldFPs;
- private final int docID;
+ private final Map<Integer,Integer> fieldNumberToIndex = new HashMap<Integer,Integer>();
public TVFields(int docID) throws IOException {
- this.docID = docID;
seekTvx(docID);
tvd.seek(tvx.readLong());
@@ -257,9 +257,9 @@ public class DefaultTermVectorsReader ex
fieldNumbers = new int[fieldCount];
fieldFPs = new long[fieldCount];
for(int fieldUpto=0;fieldUpto<fieldCount;fieldUpto++) {
- // nocommit i think this are already sorted
- // correctly during write...?
- fieldNumbers[fieldUpto] = tvd.readVInt();
+ final int fieldNumber = tvd.readVInt();
+ fieldNumbers[fieldUpto] = fieldNumber;
+ fieldNumberToIndex.put(fieldNumber, fieldUpto);
}
long position = tvx.readLong();
@@ -269,8 +269,9 @@ public class DefaultTermVectorsReader ex
fieldFPs[fieldUpto] = position;
}
} else {
- // nocommit: why do we write docs w/ 0 vectors!?
- // and... can we return null (Fields) in this case...?
+ // TODO: we can improve writer here, eg write 0 into
+ // tvx file, so we know on first read from tvx that
+ // this doc has no TVs
fieldNumbers = null;
fieldFPs = null;
}
@@ -295,7 +296,7 @@ public class DefaultTermVectorsReader ex
public TermsEnum terms() throws IOException {
tvf.seek(fieldFPs[fieldUpto-1]);
final int numTerms = tvf.readVInt();
- return new TVTermsEnum(docID, numTerms);
+ return new TVTermsEnum(numTerms);
}
};
}
@@ -308,14 +309,13 @@ public class DefaultTermVectorsReader ex
return null;
}
- for(int fieldUpto=0;fieldUpto<fieldNumbers.length;fieldUpto++) {
- if (fieldInfo.number == fieldNumbers[fieldUpto]) {
- return new TVTerms(docID, fieldFPs[fieldUpto]);
- }
+ final Integer fieldIndex = fieldNumberToIndex.get(fieldInfo.number);
+ if (fieldIndex == null) {
+ // Term vectors were not indexed for this field
+ return null;
}
- // Field exists, but was not TVd for this doc
- return null;
+ return new TVTerms(fieldFPs[fieldIndex]);
}
@Override
@@ -330,11 +330,9 @@ public class DefaultTermVectorsReader ex
private class TVTerms extends Terms {
private final int numTerms;
- private final int docID;
private final long tvfFPStart;
- public TVTerms(int docID, long tvfFP) throws IOException {
- this.docID = docID;
+ public TVTerms(long tvfFP) throws IOException {
tvf.seek(tvfFP);
numTerms = tvf.readVInt();
tvfFPStart = tvf.getFilePointer();
@@ -344,7 +342,7 @@ public class DefaultTermVectorsReader ex
public TermsEnum iterator() throws IOException {
// nocommit -- to be "safe" we should clone tvf here...?
tvf.seek(tvfFPStart);
- return new TVTermsEnum(docID, numTerms);
+ return new TVTermsEnum(numTerms);
}
@Override
@@ -378,7 +376,6 @@ public class DefaultTermVectorsReader ex
private class TVTermsEnum extends TermsEnum {
private final int numTerms;
- private final int docID;
private int nextTerm;
private int freq;
private BytesRef lastTerm = new BytesRef();
@@ -392,9 +389,8 @@ public class DefaultTermVectorsReader ex
private int[] endOffsets;
// NOTE: tvf is pre-positioned by caller
- public TVTermsEnum(int docID, int numTerms) throws IOException {
+ public TVTermsEnum(int numTerms) throws IOException {
this.numTerms = numTerms;
- this.docID = docID;
final byte bits = tvf.readByte();
storePositions = (bits & STORE_POSITIONS_WITH_TERMVECTOR) != 0;
@@ -497,7 +493,7 @@ public class DefaultTermVectorsReader ex
} else {
docsEnum = new TVDocsEnum();
}
- docsEnum.reset(liveDocs, docID, freq);
+ docsEnum.reset(liveDocs, freq);
return docsEnum;
}
@@ -518,7 +514,7 @@ public class DefaultTermVectorsReader ex
} else {
docsAndPositionsEnum = new TVDocsAndPositionsEnum(storeOffsets);
}
- docsAndPositionsEnum.reset(liveDocs, docID, positions, startOffsets, endOffsets);
+ docsAndPositionsEnum.reset(liveDocs, positions, startOffsets, endOffsets);
return docsAndPositionsEnum;
}
@@ -530,11 +526,10 @@ public class DefaultTermVectorsReader ex
}
}
- // nocommit not really useful? you can get the freq from
- // .totalTF from the TermsEnum...
+ // NOTE: sort of a silly class, since you can get the
+ // freq() already by TermsEnum.totalTermFreq
private static class TVDocsEnum extends DocsEnum {
private boolean didNext;
- private int docID;
private int freq;
private Bits liveDocs;
@@ -545,14 +540,14 @@ public class DefaultTermVectorsReader ex
@Override
public int docID() {
- return docID;
+ return 0;
}
@Override
public int nextDoc() {
- if (!didNext && (liveDocs == null || liveDocs.get(docID))) {
+ if (!didNext && (liveDocs == null || liveDocs.get(0))) {
didNext = true;
- return docID;
+ return 0;
} else {
return NO_MORE_DOCS;
}
@@ -560,16 +555,15 @@ public class DefaultTermVectorsReader ex
@Override
public int advance(int target) {
- if (!didNext && target <= docID) {
+ if (!didNext && target == 0) {
return nextDoc();
} else {
return NO_MORE_DOCS;
}
}
- public void reset(Bits liveDocs, int docID, int freq) {
+ public void reset(Bits liveDocs, int freq) {
this.liveDocs = liveDocs;
- this.docID = docID;
this.freq = freq;
didNext = false;
}
@@ -578,7 +572,6 @@ public class DefaultTermVectorsReader ex
private static class TVDocsAndPositionsEnum extends DocsAndPositionsEnum {
private final OffsetAttribute offsetAtt;
private boolean didNext;
- private int docID;
private int nextPos;
private Bits liveDocs;
private int[] positions;
@@ -609,14 +602,14 @@ public class DefaultTermVectorsReader ex
@Override
public int docID() {
- return docID;
+ return 0;
}
@Override
public int nextDoc() {
- if (!didNext && (liveDocs == null || liveDocs.get(docID))) {
+ if (!didNext && (liveDocs == null || liveDocs.get(0))) {
didNext = true;
- return docID;
+ return 0;
} else {
return NO_MORE_DOCS;
}
@@ -624,16 +617,15 @@ public class DefaultTermVectorsReader ex
@Override
public int advance(int target) {
- if (!didNext && target <= docID) {
+ if (!didNext && target == 0) {
return nextDoc();
} else {
return NO_MORE_DOCS;
}
}
- public void reset(Bits liveDocs, int docID, int[] positions, int[] startOffsets, int[] endOffsets) {
+ public void reset(Bits liveDocs, int[] positions, int[] startOffsets, int[] endOffsets) {
this.liveDocs = liveDocs;
- this.docID = docID;
this.positions = positions;
this.startOffsets = startOffsets;
this.endOffsets = endOffsets;
@@ -677,7 +669,9 @@ public class DefaultTermVectorsReader ex
if (tvx != null) {
Fields fields = new TVFields(docID);
if (fields.getUniqueFieldCount() == 0) {
- // nocommit writer should write in this case!?
+ // TODO: we can improve writer here, eg write 0 into
+ // tvx file, so we know on first read from tvx that
+ // this doc has no TVs
return null;
} else {
return fields;
Modified: lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/DefaultTermVectorsWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/DefaultTermVectorsWriter.java?rev=1201461&r1=1201460&r2=1201461&view=diff
==============================================================================
--- lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/DefaultTermVectorsWriter.java (original)
+++ lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/DefaultTermVectorsWriter.java Sun Nov 13 17:12:28 2011
@@ -35,6 +35,15 @@ import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.IOUtils;
import org.apache.lucene.util.StringHelper;
+// TODO: make a new 4.0 TV format that encodes better
+// - use startOffset (not endOffset) as base for delta on
+// next startOffset because today for syns or ngrams or
+// WDF or shingles etc. we are encoding negative vints
+// (= slow, 5 bytes per)
+// - if doc has no term vectors, write 0 into the tvx
+// file; saves a seek to tvd only to read a 0 vint (and
+// saves a byte in tvd)
+
public final class DefaultTermVectorsWriter extends TermVectorsWriter {
private final Directory directory;
private final String segment;
Modified: lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/TermVectorsReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/TermVectorsReader.java?rev=1201461&r1=1201460&r2=1201461&view=diff
==============================================================================
--- lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/TermVectorsReader.java (original)
+++ lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/TermVectorsReader.java Sun Nov 13 17:12:28 2011
@@ -30,11 +30,13 @@ import org.apache.lucene.index.Fields;
*/
public abstract class TermVectorsReader implements Cloneable,Closeable {
- /** nocommit jdocs; returns null if TVs not in this
- * index. If offsets are available they are in an {@link
- * OffsetAttribute} */
+ /** Returns term vectors for this document, or null if
+ * term vectors were not indexed. If offsets are
+ * available they are in an {@link OffsetAttribute}
+ * available from the {@link DocsAndPositionsEnum}. */
public abstract Fields get(int doc) throws IOException;
- // nocommit really needed?
+ /** Create a clone that one caller at a time may use to
+ * read term vectors. */
public abstract TermVectorsReader clone();
}
Modified: lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/TermVectorsWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/TermVectorsWriter.java?rev=1201461&r1=1201460&r2=1201461&view=diff
==============================================================================
--- lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/TermVectorsWriter.java (original)
+++ lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/TermVectorsWriter.java Sun Nov 13 17:12:28 2011
@@ -185,14 +185,12 @@ public abstract class TermVectorsWriter
final FieldInfo fieldInfo = fieldInfos.fieldInfo(fieldName);
- // nocommit O(N^2) under here:
- // nocommit just cast to int right off....? single
- // doc w/ > 2.1 B terms is surely crazy...?
final Terms terms = vectors.terms(fieldName);
if (terms == null) {
continue;
}
- final long numTerms = terms.getUniqueTermCount();
+ final int numTerms = (int) terms.getUniqueTermCount();
+ assert numTerms >= 0;
final boolean positions;
@@ -224,9 +222,9 @@ public abstract class TermVectorsWriter
offsetAtt = null;
}
- startField(fieldInfo, (int) numTerms, positions, offsetAtt != null);
+ startField(fieldInfo, numTerms, positions, offsetAtt != null);
- long termCount = 1;
+ int termCount = 1;
// NOTE: we already .next()'d the TermsEnum above, to
// peek @ first term to see if positions/offsets are
Modified: lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/perfield/PerFieldPostingsFormat.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/perfield/PerFieldPostingsFormat.java?rev=1201461&r1=1201460&r2=1201461&view=diff
==============================================================================
--- lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/perfield/PerFieldPostingsFormat.java (original)
+++ lucene/dev/branches/lucene2621/lucene/src/java/org/apache/lucene/index/codecs/perfield/PerFieldPostingsFormat.java Sun Nov 13 17:12:28 2011
@@ -213,7 +213,7 @@ public abstract class PerFieldPostingsFo
}
@Override
- public String next() {
+ public String next() throws IOException {
if (it.hasNext()) {
current = it.next();
} else {