mirror of https://github.com/apache/lucene.git
LUCENE-3870: allow prefixes across block boundaries in PagedBytes.Reader
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1301423 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
e24e7856f0
commit
f779f83a95
|
@ -193,18 +193,28 @@ public final class PagedBytes {
|
|||
* @lucene.internal
|
||||
**/
|
||||
public BytesRef fillSliceWithPrefix(BytesRef b, long start) {
|
||||
final int index = (int) (start >> blockBits);
|
||||
int index = (int) (start >> blockBits);
|
||||
int offset = (int) (start & blockMask);
|
||||
final byte[] block = blocks[index];
|
||||
byte[] block = blocks[index];
|
||||
final int length;
|
||||
assert offset <= block.length-1;
|
||||
if ((block[offset] & 128) == 0) {
|
||||
length = block[offset];
|
||||
offset = offset+1;
|
||||
} else {
|
||||
if (offset==block.length-1) {
|
||||
final byte[] nextBlock = blocks[++index];
|
||||
length = ((block[offset] & 0x7f) << 8) | (nextBlock[0] & 0xff);
|
||||
offset = 1;
|
||||
block = nextBlock;
|
||||
assert length > 0;
|
||||
} else {
|
||||
assert offset < block.length-1;
|
||||
length = ((block[offset] & 0x7f) << 8) | (block[1+offset] & 0xff);
|
||||
offset = offset+2;
|
||||
assert length > 0;
|
||||
}
|
||||
}
|
||||
assert length >= 0: "length=" + length;
|
||||
b.length = length;
|
||||
|
||||
|
|
|
@ -470,7 +470,6 @@ public class TestDocValuesIndexing extends LuceneTestCase {
|
|||
}
|
||||
break;
|
||||
case VAR_INTS:
|
||||
System.out.println(source.hasArray());
|
||||
assertFalse(source.hasArray());
|
||||
break;
|
||||
case FLOAT_32:
|
||||
|
@ -931,4 +930,34 @@ public class TestDocValuesIndexing extends LuceneTestCase {
|
|||
r.close();
|
||||
dir.close();
|
||||
}
|
||||
|
||||
// LUCENE-3870
|
||||
public void testLengthPrefixAcrossTwoPages() throws Exception {
|
||||
Directory d = newDirectory();
|
||||
IndexWriter w = new IndexWriter(d, new IndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random)));
|
||||
Document doc = new Document();
|
||||
byte[] bytes = new byte[32764];
|
||||
BytesRef b = new BytesRef();
|
||||
b.bytes = bytes;
|
||||
b.length = bytes.length;
|
||||
doc.add(new DocValuesField("field", b, DocValues.Type.BYTES_VAR_DEREF));
|
||||
w.addDocument(doc);
|
||||
bytes[0] = 1;
|
||||
w.addDocument(doc);
|
||||
DirectoryReader r = w.getReader();
|
||||
Source s = r.getSequentialSubReaders()[0].docValues("field").getSource();
|
||||
|
||||
BytesRef bytes1 = s.getBytes(0, new BytesRef());
|
||||
assertEquals(bytes.length, bytes1.length);
|
||||
bytes[0] = 0;
|
||||
assertEquals(b, bytes1);
|
||||
|
||||
bytes1 = s.getBytes(1, new BytesRef());
|
||||
assertEquals(bytes.length, bytes1.length);
|
||||
bytes[0] = 1;
|
||||
assertEquals(b, bytes1);
|
||||
r.close();
|
||||
w.close();
|
||||
d.close();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue