package org.apache.hadoop.hbase.regionserver.pbase;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.io.pfile.PFileReader;
import org.apache.hadoop.hbase.regionserver.RecordScanner;
import org.apache.hadoop.hbase.regionserver.pbase.util.ParquetReadUtil;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Assert;
import org.junit.Test;
import java.util.List;
/**
* Created by wangxiaoyi on 15/7/2.
*
*/
public class TestPFileReaderAndScanner {
public static Path rootPath = new Path("hdfs://localhost:9000/parquet");
public static List<Path> paths = ParquetReadUtil.loadParquetFiles(new Path(rootPath, "pfile"));
public static List<RecordScanner> scanners = ParquetReadUtil.getParquetFileScanner(paths, null);
@Test
public void testGetStartKeyAndEndKey(){
int i = 0;
for(int j = 0; j < 10; ++ j){
PFileReader.PFileScanner scanner = (PFileReader.PFileScanner)scanners.get(j);
Assert.assertEquals("start key not equal ", String.format("%10d", i + 1), Bytes.toString(scanner.getStartKey()));
Assert.assertEquals("end key not equal ", String.format("%10d", i + 50), Bytes.toString(scanner.getEndKey()));
i += 50;
}
}
@Test
public void testSeek(){// test on scanner0
PFileReader.PFileScanner scanner = (PFileReader.PFileScanner) scanners.get(0);
int start = 2, end = 49;
for(int i = start; i < end; ++ i){
String expectedRowKey = String.format("%10d", i);
scanner.seek(expectedRowKey.getBytes());
List<Cell> result = scanner.peek();
Assert.assertEquals("should have peek", true, !result.isEmpty());
String actualRowkey = Bytes.toString(result.get(0).getRow());
Assert.assertEquals("seek error !", expectedRowKey, actualRowkey);
}
//bigger than startkey
scanner.seek(HConstants.EMPTY_START_ROW);
List<Cell> result = scanner.peek();
Assert.assertEquals("seek error! ", false, result.isEmpty());
if(!result.isEmpty()){
String rowkey = Bytes.toString(result.get(0).getRow());
Assert.assertEquals("seek error !", String.format("%10d", 48), rowkey);
}
//bigger than endKey
scanner.seek(String.format("%10d", 200).getBytes());
List<Cell> result2 = scanner.peek();
Assert.assertEquals("seek error! ", true, result2.isEmpty());
}
@Test
public void testPeekAndNext(){//scanner2
PFileReader.PFileScanner scanner = (PFileReader.PFileScanner) scanners.get(2);
int total = 150;
for (int i = 101; i <= total; ++i){
List<Cell> result = scanner.peek();
Assert.assertEquals(false, result.isEmpty());
Assert.assertEquals(String.format("%10d", i), Bytes.toString(result.get(0).getRow()));
Assert.assertEquals("should has next", true, scanner.hasNext());
List<Cell> result1 = scanner.next();
Assert.assertEquals("should not be false", false, result1.isEmpty());
Assert.assertEquals(String.format("%10d", i), Bytes.toString(result.get(0).getRow()));
}
}
@Test
public void testGetRecordCount(){//scanner1
PFileReader.PFileScanner scanner = (PFileReader.PFileScanner)scanners.get(1);
for(int i = 50; i >= 1; --i){
//System.out.println("record left count : "+ scanner.getMaxResultsCount());
Assert.assertEquals("lasting count should be equal to" + i, i, scanner.getMaxResultsCount());
scanner.next();
}
}
}