Index: src/test/org/apache/lucene/index/TestTermVectorsReader.java =================================================================== --- src/test/org/apache/lucene/index/TestTermVectorsReader.java (revision 590149) +++ src/test/org/apache/lucene/index/TestTermVectorsReader.java (working copy) @@ -329,6 +329,32 @@ } } + // test setDocumentNumber() + IndexReader ir = IndexReader.open(dir); + DocNumAwareMapper docNumAwareMapper = new DocNumAwareMapper(); + assertEquals(-1, docNumAwareMapper.getDocumentNumber()); + + ir.getTermFreqVector(0, docNumAwareMapper); + assertEquals(0, docNumAwareMapper.getDocumentNumber()); + docNumAwareMapper.setDocumentNumber(-1); + + ir.getTermFreqVector(1, docNumAwareMapper); + assertEquals(1, docNumAwareMapper.getDocumentNumber()); + docNumAwareMapper.setDocumentNumber(-1); + + ir.getTermFreqVector(0, "f1", docNumAwareMapper); + assertEquals(0, docNumAwareMapper.getDocumentNumber()); + docNumAwareMapper.setDocumentNumber(-1); + + ir.getTermFreqVector(1, "f2", docNumAwareMapper); + assertEquals(1, docNumAwareMapper.getDocumentNumber()); + docNumAwareMapper.setDocumentNumber(-1); + + ir.getTermFreqVector(0, "f1", docNumAwareMapper); + assertEquals(0, docNumAwareMapper.getDocumentNumber()); + + ir.close(); + } @@ -364,4 +390,33 @@ fail(); } } + + + public static class DocNumAwareMapper extends TermVectorMapper { + + public DocNumAwareMapper() { + } + + private int documentNumber = -1; + + public void setExpectations(String field, int numTerms, boolean storeOffsets, boolean storePositions) { + if (documentNumber == -1) { + throw new RuntimeException("Documentnumber should be set at this point!"); + } + } + + public void map(String term, int frequency, TermVectorOffsetInfo[] offsets, int[] positions) { + if (documentNumber == -1) { + throw new RuntimeException("Documentnumber should be set at this point!"); + } + } + + public int getDocumentNumber() { + return documentNumber; + } + + public void setDocumentNumber(int documentNumber) { + this.documentNumber = documentNumber; + } + } } Index: src/java/org/apache/lucene/index/TermVectorMapper.java =================================================================== --- src/java/org/apache/lucene/index/TermVectorMapper.java (revision 590149) +++ src/java/org/apache/lucene/index/TermVectorMapper.java (working copy) @@ -85,4 +85,12 @@ return ignoringOffsets; } + /** + * Passes down the index of the document whose term vector is currently beeing mapped, + * once for each top level call to a term vector reader. + * @param documentNumber index of document currently beeing mapped + */ + public void setDocumentNumber(int documentNumber) { + } + } Index: src/java/org/apache/lucene/index/TermVectorsReader.java =================================================================== --- src/java/org/apache/lucene/index/TermVectorsReader.java (revision 590149) +++ src/java/org/apache/lucene/index/TermVectorsReader.java (working copy) @@ -163,6 +163,7 @@ for (int i = 0; i <= found; i++) position += tvd.readVLong(); + mapper.setDocumentNumber(docNum); readTermVector(field, position, mapper); } else { //System.out.println("Fieldable not found"); @@ -228,7 +229,7 @@ tvfPointers[i] = position; } - result = readTermVectors(fields, tvfPointers); + result = readTermVectors(docNum, fields, tvfPointers); } } else { //System.out.println("No tvx file"); @@ -268,6 +269,7 @@ tvfPointers[i] = position; } + mapper.setDocumentNumber(docNumber); readTermVectors(fields, tvfPointers, mapper); } } else { @@ -276,12 +278,13 @@ } - private SegmentTermVector[] readTermVectors(String fields[], long tvfPointers[]) + private SegmentTermVector[] readTermVectors(int docNum, String fields[], long tvfPointers[]) throws IOException { SegmentTermVector res[] = new SegmentTermVector[fields.length]; for (int i = 0; i < fields.length; i++) { ParallelArrayTermVectorMapper mapper = new ParallelArrayTermVectorMapper(); - readTermVector(fields[i], tvfPointers[i], mapper); + mapper.setDocumentNumber(docNum); + readTermVector(fields[i], tvfPointers[i], mapper); res[i] = (SegmentTermVector) mapper.materializeVector(); } return res;