Example usage for org.apache.lucene.util.packed PackedInts getWriterNoHeader

List of usage examples for org.apache.lucene.util.packed PackedInts getWriterNoHeader

Introduction

In this page you can find the example usage for org.apache.lucene.util.packed PackedInts getWriterNoHeader.

Prototype

public static Writer getWriterNoHeader(DataOutput out, Format format, int valueCount, int bitsPerValue,
        int mem) 

Source Link

Document

Expert: Create a packed integer array writer for the given output, format, value count, and number of bits per value.

Usage

From source file:com.lucure.core.codec.CompressingStoredFieldsIndexWriter.java

License:Apache License

private void writeBlock() throws IOException {
    assert blockChunks > 0;
    fieldsIndexOut.writeVInt(blockChunks);

    // The trick here is that we only store the difference from the average start
    // pointer or doc base, this helps save bits per value.
    // And in order to prevent a few chunks that would be far from the average to
    // raise the number of bits per value for all of them, we only encode blocks
    // of 1024 chunks at once
    // See LUCENE-4512

    // doc bases/*from ww w. j av a 2s  .c  o m*/
    final int avgChunkDocs;
    if (blockChunks == 1) {
        avgChunkDocs = 0;
    } else {
        avgChunkDocs = Math.round((float) (blockDocs - docBaseDeltas[blockChunks - 1]) / (blockChunks - 1));
    }
    fieldsIndexOut.writeVInt(totalDocs - blockDocs); // docBase
    fieldsIndexOut.writeVInt(avgChunkDocs);
    int docBase = 0;
    long maxDelta = 0;
    for (int i = 0; i < blockChunks; ++i) {
        final int delta = docBase - avgChunkDocs * i;
        maxDelta |= zigZagEncode(delta);
        docBase += docBaseDeltas[i];
    }

    final int bitsPerDocBase = PackedInts.bitsRequired(maxDelta);
    fieldsIndexOut.writeVInt(bitsPerDocBase);
    PackedInts.Writer writer = PackedInts.getWriterNoHeader(fieldsIndexOut, PackedInts.Format.PACKED,
            blockChunks, bitsPerDocBase, 1);
    docBase = 0;
    for (int i = 0; i < blockChunks; ++i) {
        final long delta = docBase - avgChunkDocs * i;
        assert PackedInts.bitsRequired(zigZagEncode(delta)) <= writer.bitsPerValue();
        writer.add(zigZagEncode(delta));
        docBase += docBaseDeltas[i];
    }
    writer.finish();

    // start pointers
    fieldsIndexOut.writeVLong(firstStartPointer);
    final long avgChunkSize;
    if (blockChunks == 1) {
        avgChunkSize = 0;
    } else {
        avgChunkSize = (maxStartPointer - firstStartPointer) / (blockChunks - 1);
    }
    fieldsIndexOut.writeVLong(avgChunkSize);
    long startPointer = 0;
    maxDelta = 0;
    for (int i = 0; i < blockChunks; ++i) {
        startPointer += startPointerDeltas[i];
        final long delta = startPointer - avgChunkSize * i;
        maxDelta |= zigZagEncode(delta);
    }

    final int bitsPerStartPointer = PackedInts.bitsRequired(maxDelta);
    fieldsIndexOut.writeVInt(bitsPerStartPointer);
    writer = PackedInts.getWriterNoHeader(fieldsIndexOut, PackedInts.Format.PACKED, blockChunks,
            bitsPerStartPointer, 1);
    startPointer = 0;
    for (int i = 0; i < blockChunks; ++i) {
        startPointer += startPointerDeltas[i];
        final long delta = startPointer - avgChunkSize * i;
        assert PackedInts.bitsRequired(zigZagEncode(delta)) <= writer.bitsPerValue();
        writer.add(zigZagEncode(delta));
    }
    writer.finish();
}

From source file:com.lucure.core.codec.CompressingStoredFieldsWriter.java

License:Apache License

private static void saveInts(int[] values, int length, DataOutput out) throws IOException {
    assert length > 0;
    if (length == 1) {
        out.writeVInt(values[0]);//w  ww . ja v a  2 s .c  o  m
    } else {
        boolean allEqual = true;
        for (int i = 1; i < length; ++i) {
            if (values[i] != values[0]) {
                allEqual = false;
                break;
            }
        }
        if (allEqual) {
            out.writeVInt(0);
            out.writeVInt(values[0]);
        } else {
            long max = 0;
            for (int i = 0; i < length; ++i) {
                max |= values[i];
            }
            final int bitsRequired = PackedInts.bitsRequired(max);
            out.writeVInt(bitsRequired);
            final PackedInts.Writer w = PackedInts.getWriterNoHeader(out, PackedInts.Format.PACKED, length,
                    bitsRequired, 1);
            for (int i = 0; i < length; ++i) {
                w.add(values[i]);
            }
            w.finish();
        }
    }
}