package org.jumbodb.database.service.query;
import org.apache.commons.io.IOUtils;
import org.jumbodb.data.common.snappy.SnappyChunks;
import org.jumbodb.data.common.snappy.SnappyChunksUtil;
import org.xerial.snappy.Snappy;
import java.io.*;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* User: carsten
* Date: 3/14/13
* Time: 2:22 PM
* To change this template use File | Settings | File Templates.
*/
public class SnappyTestIn {
protected static long calculateChunkOffsetUncompressed(long chunkIndex, int snappyChunkSize) {
return chunkIndex * snappyChunkSize;
}
protected static long calculateChunkOffsetCompressed(long chunkIndex, List<Integer> snappyChunks) {
long result = 0l;
for(int i = 0; i < chunkIndex; i++) {
result += snappyChunks.get(i) + 4; // 4 byte for length of chunk
}
return result + 16;
}
public static void main(String[] args) throws Exception {
String s = "/Users/carsten/testen/part-r-00009";
File file = new File(s);
SnappyChunks snappyChunks = SnappyChunksUtil.getSnappyChunksByFile(file);
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(fis);
long compressedFileStreamPosition = 0l;
//
long searchOffset = 16148062;
long chunkIndex = (searchOffset / snappyChunks.getChunkSize());
long chunkOffsetCompressed = calculateChunkOffsetCompressed(chunkIndex, snappyChunks.getChunks());
long chunkOffsetUncompressed = calculateChunkOffsetUncompressed(chunkIndex, snappyChunks.getChunkSize());
long chunkOffsetToSkip = chunkOffsetCompressed - compressedFileStreamPosition;
compressedFileStreamPosition += dis.skip(chunkOffsetCompressed);
// int i2 = dis.readInt();
// System.out.println(i2);
// byte[] buffer2 = new byte[i2];
// filePosition += dis.read(buffer2) + 4;
//
//
// searchOffset = 16148062;
// chunkIndex = (searchOffset / snappyChunks.getChunkSize());
// chunkOffsetCompressed = calculateChunkOffsetCompressed(chunkIndex, snappyChunks.getChunks());
// dis.skip(chunkOffsetCompressed - filePosition);
// dis.skip(2674046);
int i = dis.readInt();
System.out.println(i);
byte[] buffer = new byte[i];
dis.read(buffer);
System.out.println(new String(Snappy.uncompress(buffer)));
// dis.skip(16);
// while(dis.available() > 0) {
// int i = dis.readInt();
// byte[] buffer = new byte[i];
// dis.read(buffer);
// }
IOUtils.closeQuietly(dis);
IOUtils.closeQuietly(bis);
IOUtils.closeQuietly(fis);
//
//
// public static double readDouble(byte[] buffer, int pos) {
// long val = readLong(buffer, pos);
// return Double.longBitsToDouble(val);
// }
//
// public static float readFloat(byte[] buffer, int pos) {
// long val = readInt(buffer, pos);
// return Float.floatToIntBits(val);
// }
//
// public static int readInt(byte[] buffer, int pos) {
// int b1 = (buffer[pos] & 0xFF) << 24;
// int b2 = (buffer[pos + 1] & 0xFF) << 16;
// int b3 = (buffer[pos + 2] & 0xFF) << 8;
// int b4 = buffer[pos + 3] & 0xFF;
// return b1 | b2 | b3 | b4;
// }
//
// public static long readLong(byte[] buffer, int pos) {
// return (((long)buffer[pos] << 56) +
// ((long)(buffer[pos + 1] & 255) << 48) +
// ((long)(buffer[pos + 2] & 255) << 40) +
// ((long)(buffer[pos + 3] & 255) << 32) +
// ((long)(buffer[pos + 4] & 255) << 24) +
// ((buffer[pos + 5] & 255) << 16) +
// ((buffer[pos + 6] & 255) << 8) +
// ((buffer[pos + 7] & 255) << 0));
// }
// long b1 = (buffer[pos] & 0xFF) << 56;
// long b2 = (buffer[pos + 1] & 0xFF) << 48;
// long b3 = (buffer[pos + 2] & 0xFF) << 40;
// long b4 = (buffer[pos + 3] & 0xFF) << 32;
// long b5 = (buffer[pos + 4] & 0xFF) << 24;
// long b6 = (buffer[pos + 5] & 0xFF) << 16;
// long b7 = (buffer[pos + 6] & 0xFF) << 8;
// long b8 = buffer[pos + 7] & 0xFF;
// return b1 | b2 | b3 | b4 | b5 | b6 | b7 | b8;
}
}