Index: lucene/src/test/org/apache/lucene/TestExternalCodecs.java =================================================================== --- lucene/src/test/org/apache/lucene/TestExternalCodecs.java (revision 944313) +++ lucene/src/test/org/apache/lucene/TestExternalCodecs.java (working copy) @@ -436,11 +436,6 @@ } @Override - public int getPayloadLength() { - return 0; - } - - @Override public BytesRef getPayload() { return null; } Index: lucene/src/test/org/apache/lucene/index/TestPayloads.java =================================================================== --- lucene/src/test/org/apache/lucene/index/TestPayloads.java (revision 944313) +++ lucene/src/test/org/apache/lucene/index/TestPayloads.java (working copy) @@ -309,14 +309,6 @@ * Test multiple call of getPayload() */ tp.getPayload(null, 0); - try { - // it is forbidden to call getPayload() more than once - // without calling nextPosition() - tp.getPayload(null, 0); - fail("Expected exception not thrown"); - } catch (Exception expected) { - // expected exception - } reader.close(); Index: lucene/src/test/org/apache/lucene/index/FlexTestUtil.java =================================================================== --- lucene/src/test/org/apache/lucene/index/FlexTestUtil.java (revision 944313) +++ lucene/src/test/org/apache/lucene/index/FlexTestUtil.java (working copy) @@ -190,8 +190,8 @@ assertEquals(position, termPos.nextPosition()); assertEquals(postings.hasPayload(), termPos.isPayloadAvailable()); if (postings.hasPayload()) { - assertEquals(postings.getPayloadLength(), termPos.getPayloadLength()); BytesRef payload = postings.getPayload(); + assertEquals(payload.length, termPos.getPayloadLength()); byte[] b2 = termPos.getPayload(null, 0); assertNotNull(payload); assertNotNull(b2); @@ -337,9 +337,9 @@ assertEquals(position, termPos.nextPosition()); assertEquals(postings.hasPayload(), termPos.isPayloadAvailable()); if (postings.hasPayload()) { - assertEquals(postings.getPayloadLength(), termPos.getPayloadLength()); if (rand.nextInt(3) <= 1) { BytesRef payload = postings.getPayload(); + assertEquals(payload.length, termPos.getPayloadLength()); byte[] b2 = termPos.getPayload(null, 0); assertNotNull(payload); assertNotNull(b2); @@ -525,8 +525,8 @@ assertEquals(pos1, pos2); assertEquals(postings.hasPayload(), termPositions.isPayloadAvailable()); if (postings.hasPayload()) { - assertEquals(postings.getPayloadLength(), termPositions.getPayloadLength()); BytesRef b1 = postings.getPayload(); + assertEquals(b1.length, termPositions.getPayloadLength()); byte[] b2 = termPositions.getPayload(null, 0); assertNotNull(b1); assertNotNull(b2); Index: lucene/src/java/org/apache/lucene/search/MultiPhraseQuery.java =================================================================== --- lucene/src/java/org/apache/lucene/search/MultiPhraseQuery.java (revision 944313) +++ lucene/src/java/org/apache/lucene/search/MultiPhraseQuery.java (working copy) @@ -509,11 +509,6 @@ } @Override - public int getPayloadLength() { - throw new UnsupportedOperationException(); - } - - @Override public BytesRef getPayload() { throw new UnsupportedOperationException(); } Index: lucene/src/java/org/apache/lucene/index/LegacyFieldsEnum.java =================================================================== --- lucene/src/java/org/apache/lucene/index/LegacyFieldsEnum.java (revision 944313) +++ lucene/src/java/org/apache/lucene/index/LegacyFieldsEnum.java (working copy) @@ -305,11 +305,6 @@ return tp.nextPosition(); } - @Override - public int getPayloadLength() { - return tp.getPayloadLength(); - } - private BytesRef payload; @Override Index: lucene/src/java/org/apache/lucene/index/ParallelReader.java =================================================================== --- lucene/src/java/org/apache/lucene/index/ParallelReader.java (revision 944313) +++ lucene/src/java/org/apache/lucene/index/ParallelReader.java (working copy) @@ -721,7 +721,7 @@ return ((TermPositions)termDocs).nextPosition(); } - public int getPayloadLength() { + public int getPayloadLength() throws IOException { return ((TermPositions)termDocs).getPayloadLength(); } Index: lucene/src/java/org/apache/lucene/index/SegmentReader.java =================================================================== --- lucene/src/java/org/apache/lucene/index/SegmentReader.java (revision 944313) +++ lucene/src/java/org/apache/lucene/index/SegmentReader.java (working copy) @@ -1653,19 +1653,31 @@ throw new UnsupportedOperationException("TermPositions does not support processing multiple documents in one call. Use TermDocs instead."); } - public int nextPosition() throws IOException { + public int nextPosition() throws IOException { + pendingPayload = null; if (!any || postingsEnum == null) { return 0; } else { return postingsEnum.nextPosition(); } } + + private BytesRef pendingPayload; - public int getPayloadLength() { + public int getPayloadLength() throws IOException { if (!any || postingsEnum == null) { return 0; } else { - return postingsEnum.getPayloadLength(); + if (pendingPayload == null) { + if (!postingsEnum.hasPayload()) { + return 0; + } + pendingPayload = postingsEnum.getPayload(); + } + if (pendingPayload == null) { + return 0; + } + return pendingPayload.length; } } @@ -1673,17 +1685,26 @@ if (!any || postingsEnum == null) { return null; } - final BytesRef payload = postingsEnum.getPayload(); + if (pendingPayload == null) { + if (!postingsEnum.hasPayload()) { + return null; + } + pendingPayload = postingsEnum.getPayload(); + } + if (pendingPayload == null) { + return null; + } + // old API would always used passed in bytes if it // "fits", else allocate new: - if (bytes != null && payload.length <= bytes.length - offset) { - System.arraycopy(payload.bytes, payload.offset, bytes, offset, payload.length); + if (bytes != null && pendingPayload.length <= bytes.length - offset) { + System.arraycopy(pendingPayload.bytes, pendingPayload.offset, bytes, offset, pendingPayload.length); return bytes; - } else if (payload.offset == 0 && payload.length == payload.bytes.length) { - return payload.bytes; + } else if (pendingPayload.offset == 0 && pendingPayload.length == pendingPayload.bytes.length) { + return pendingPayload.bytes; } else { - final byte[] retBytes = new byte[payload.length]; - System.arraycopy(payload.bytes, payload.offset, retBytes, 0, payload.length); + final byte[] retBytes = new byte[pendingPayload.length]; + System.arraycopy(pendingPayload.bytes, pendingPayload.offset, retBytes, 0, pendingPayload.length); return retBytes; } } Index: lucene/src/java/org/apache/lucene/index/CheckIndex.java =================================================================== --- lucene/src/java/org/apache/lucene/index/CheckIndex.java (revision 944313) +++ lucene/src/java/org/apache/lucene/index/CheckIndex.java (working copy) @@ -685,7 +685,7 @@ throw new RuntimeException("term " + term + ": doc " + doc + ": pos " + pos + " < lastPos " + lastPos); } lastPos = pos; - if (postings.getPayloadLength() != 0) { + if (postings.hasPayload()) { postings.getPayload(); } } Index: lucene/src/java/org/apache/lucene/index/DocsAndPositionsEnum.java =================================================================== --- lucene/src/java/org/apache/lucene/index/DocsAndPositionsEnum.java (revision 944313) +++ lucene/src/java/org/apache/lucene/index/DocsAndPositionsEnum.java (working copy) @@ -29,9 +29,6 @@ * the behavior is not defined. */ public abstract int nextPosition() throws IOException; - /** Returns length of payload at current position */ - public abstract int getPayloadLength(); - /** Returns the payload at this position, or null if no * payload was indexed. */ public abstract BytesRef getPayload() throws IOException; Index: lucene/src/java/org/apache/lucene/index/DirectoryReader.java =================================================================== --- lucene/src/java/org/apache/lucene/index/DirectoryReader.java (revision 944313) +++ lucene/src/java/org/apache/lucene/index/DirectoryReader.java (working copy) @@ -1393,7 +1393,7 @@ return ((TermPositions)current).nextPosition(); } - public int getPayloadLength() { + public int getPayloadLength() throws IOException { return ((TermPositions)current).getPayloadLength(); } Index: lucene/src/java/org/apache/lucene/index/FilterIndexReader.java =================================================================== --- lucene/src/java/org/apache/lucene/index/FilterIndexReader.java (revision 944313) +++ lucene/src/java/org/apache/lucene/index/FilterIndexReader.java (working copy) @@ -67,7 +67,7 @@ return ((TermPositions) this.in).nextPosition(); } - public int getPayloadLength() { + public int getPayloadLength() throws IOException { return ((TermPositions) this.in).getPayloadLength(); } Index: lucene/src/java/org/apache/lucene/index/TermPositions.java =================================================================== --- lucene/src/java/org/apache/lucene/index/TermPositions.java (revision 944313) +++ lucene/src/java/org/apache/lucene/index/TermPositions.java (working copy) @@ -46,7 +46,7 @@ * the first time.
* @return length of the current payload in number of bytes */ - int getPayloadLength(); + int getPayloadLength() throws IOException; /** * Returns the payload data at the current term position. Index: lucene/src/java/org/apache/lucene/index/MultiDocsAndPositionsEnum.java =================================================================== --- lucene/src/java/org/apache/lucene/index/MultiDocsAndPositionsEnum.java (revision 944313) +++ lucene/src/java/org/apache/lucene/index/MultiDocsAndPositionsEnum.java (working copy) @@ -112,11 +112,6 @@ } @Override - public int getPayloadLength() { - return current.getPayloadLength(); - } - - @Override public boolean hasPayload() { return current.hasPayload(); } Index: lucene/src/java/org/apache/lucene/index/codecs/MappingMultiDocsAndPositionsEnum.java =================================================================== --- lucene/src/java/org/apache/lucene/index/codecs/MappingMultiDocsAndPositionsEnum.java (revision 944313) +++ lucene/src/java/org/apache/lucene/index/codecs/MappingMultiDocsAndPositionsEnum.java (working copy) @@ -102,13 +102,7 @@ return current.nextPosition(); } - @Override - public int getPayloadLength() { - return current.getPayloadLength(); - } - - @Override public BytesRef getPayload() throws IOException { BytesRef payload = current.getPayload(); if (mergeState.currentPayloadProcessor[upto] != null) { Index: lucene/src/java/org/apache/lucene/index/codecs/pulsing/PulsingPostingsReaderImpl.java =================================================================== --- lucene/src/java/org/apache/lucene/index/codecs/pulsing/PulsingPostingsReaderImpl.java (revision 944313) +++ lucene/src/java/org/apache/lucene/index/codecs/pulsing/PulsingPostingsReaderImpl.java (working copy) @@ -358,11 +358,6 @@ } @Override - public int getPayloadLength() { - return payloadRetrieved || pos.payload == null ? 0 : pos.payload.length; - } - - @Override public boolean hasPayload() { return !payloadRetrieved && pos.payload != null && pos.payload.length > 0; } Index: lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsReaderImpl.java =================================================================== --- lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsReaderImpl.java (revision 944313) +++ lucene/src/java/org/apache/lucene/index/codecs/sep/SepPostingsReaderImpl.java (working copy) @@ -638,11 +638,6 @@ return position; } - @Override - public int getPayloadLength() { - return payloadLength; - } - private BytesRef payload; @Override Index: lucene/src/java/org/apache/lucene/index/codecs/PostingsConsumer.java =================================================================== --- lucene/src/java/org/apache/lucene/index/codecs/PostingsConsumer.java (revision 944313) +++ lucene/src/java/org/apache/lucene/index/codecs/PostingsConsumer.java (working copy) @@ -79,9 +79,8 @@ this.startDoc(doc, freq); for(int i=0;i 0) { + if (postingsEnum.hasPayload()) { payload = postingsEnum.getPayload(); } else { payload = null; Index: lucene/src/java/org/apache/lucene/index/codecs/preflex/PreFlexFields.java =================================================================== --- lucene/src/java/org/apache/lucene/index/codecs/preflex/PreFlexFields.java (revision 944313) +++ lucene/src/java/org/apache/lucene/index/codecs/preflex/PreFlexFields.java (working copy) @@ -457,11 +457,6 @@ } @Override - public int getPayloadLength() { - return pos.getPayloadLength(); - } - - @Override public boolean hasPayload() { return pos.isPayloadAvailable(); }