package org.apache.hadoop.hive.mastiffFlexibleEncoding.parquet;
import static org.junit.Assert.assertEquals;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import org.junit.Test;
public class TestRunLengthBitPackingHybrid {
/**
* @author Alex Levenson
*/
@Test
public void testRLEOnly() throws Exception {
RunLengthBitPackingHybridEncoder encoder = new RunLengthBitPackingHybridEncoder(3, 5);
for (int i = 0; i < 100; i++) {
encoder.writeInt(4);
}
for (int i = 0; i < 100; i++) {
encoder.writeInt(5);
}
ByteArrayInputStream is = new ByteArrayInputStream(encoder.toBytes().toByteArray());
// header = 100 << 1 = 200
assertEquals(200, BytesUtils.readUnsignedVarInt(is));
// payload = 4
assertEquals(4, BytesUtils.readIntLittleEndianOnOneByte(is));
// header = 100 << 1 = 200
assertEquals(200, BytesUtils.readUnsignedVarInt(is));
// payload = 5
assertEquals(5, BytesUtils.readIntLittleEndianOnOneByte(is));
// end of stream
assertEquals(-1, is.read());
}
// ByteArrayInputStream is = new ByteArrayInputStream(encoder.toBytes().toByteArray());
//
// // header = 25 << 1 = 50
// assertEquals(50, BytesUtils.readUnsignedVarInt(is));
// // payload = 17, stored in 2 bytes
// assertEquals(17, BytesUtils.readIntLittleEndianOnTwoBytes(is));
//
// // header = ((16/8) << 1) | 1 = 5
// assertEquals(5, BytesUtils.readUnsignedVarInt(is));
// List<Integer> values = unpack(9, 16, is);
// int v = 0;
// for (int i = 0; i < 7; i++) {
// assertEquals(7, (int) values.get(v));
// v++;
// }
//
// assertEquals(8, (int) values.get(v++));
// assertEquals(9, (int) values.get(v++));
// assertEquals(10, (int) values.get(v++));
//
// for (int i = 0; i < 6; i++) {
// assertEquals(6, (int) values.get(v));
// v++;
// }
//
// // header = 19 << 1 = 38
// assertEquals(38, BytesUtils.readUnsignedVarInt(is));
// // payload = 6, stored in 2 bytes
// assertEquals(6, BytesUtils.readIntLittleEndianOnTwoBytes(is));
//
// // header = 8 << 1 = 16
// assertEquals(16, BytesUtils.readUnsignedVarInt(is));
// // payload = 5, stored in 2 bytes
// assertEquals(5, BytesUtils.readIntLittleEndianOnTwoBytes(is));
//
// // end of stream
// assertEquals(-1, is.read());
// }
// public void integrationTest() throws Exception {
// for (int i = 0; i <= 32; i++) {
// doIntegrationTest(i);
// }
// }
private static void doIntegrationTest(int bitWidth) throws Exception {
long modValue = 1L << bitWidth;
RunLengthBitPackingHybridEncoder encoder = new RunLengthBitPackingHybridEncoder(bitWidth, 1000);
int numValues = 0;
for (int i = 0; i < 100; i++) {
encoder.writeInt((int) (i % modValue));
}
numValues += 100;
for (int i = 0; i < 100; i++) {
encoder.writeInt((int) (77 % modValue));
}
numValues += 100;
for (int i = 0; i < 100; i++) {
encoder.writeInt((int) (88 % modValue));
}
numValues += 100;
for (int i = 0; i < 1000; i++) {
encoder.writeInt((int) (i % modValue));
encoder.writeInt((int) (i % modValue));
encoder.writeInt((int) (i % modValue));
}
numValues += 3000;
for (int i = 0; i < 1000; i++) {
encoder.writeInt((int) (17 % modValue));
}
numValues += 1000;
byte[] encodedBytes = encoder.toBytes().toByteArray();
ByteArrayInputStream in = new ByteArrayInputStream(encodedBytes);
RunLengthBitPackingHybridDecoder decoder = new RunLengthBitPackingHybridDecoder(bitWidth, in);
for (int i = 0; i < 100; i++) {
assertEquals(i % modValue, decoder.readInt());
}
for (int i = 0; i < 100; i++) {
assertEquals(77 % modValue, decoder.readInt());
}
for (int i = 0; i < 100; i++) {
assertEquals(88 % modValue, decoder.readInt());
}
for (int i = 0; i < 1000; i++) {
assertEquals(i % modValue, decoder.readInt());
assertEquals(i % modValue, decoder.readInt());
assertEquals(i % modValue, decoder.readInt());
}
for (int i = 0; i < 1000; i++) {
assertEquals(17 % modValue, decoder.readInt());
}
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
doIntegrationTest(1);
}
}