package org.apache.hadoop.hbase.regionserver.pbase;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.regionserver.InternalRecordScanner;
import org.apache.hadoop.hbase.regionserver.RowScanner;
import org.apache.hadoop.hbase.regionserver.memstore.PMemStore;
import org.apache.hadoop.hbase.regionserver.memstore.PMemStoreImpl;
import org.apache.hadoop.hbase.regionserver.memstore.PMemStoreSnapshot;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Assert;
import org.junit.Test;
import javax.swing.plaf.PanelUI;
import java.io.IOException;
import java.util.List;
/**
* Created by wangxiaoyi on 15/7/2.
*/
public class TestPMemStoreImpl {
public static final Log LOG = LogFactory.getLog(TestPMemStoreImpl.class);
public static PMemStore memStore = new PMemStoreImpl(null);
/**
* init the Pmemstore
* 1. row length = 100
* 2. row key ranges form 1 to 100
* 3. table schema {name, age, job}
*/
public void initMemStore(){
if(memStore.getRecordCount() != 0){
LOG.error("memstore size should be zero at init stage! ");
return;
}
final int ROWS_LEN = 100;
for(int i = 1 ; i <= ROWS_LEN; ++i){
Put put = new Put(String.format("%10d", i).getBytes());
put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("name"), ("wangxiaoyi" + i).getBytes());
put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("age"), ("age" + i).getBytes());
put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("job"), ("student" + i).getBytes());
try {
memStore.add(put);
}catch (IOException ioe){
ioe.printStackTrace();
}
}
}
public void clearMemStore(){
memStore = null; //todo: really clear the memestore
}
@Test
public void testSnapshot(){
initMemStore();
PMemStoreSnapshot snapshot = memStore.snapshot();
long snapshotId = snapshot.getId();
Assert.assertEquals("snapshot size should be equal to ", 100, snapshot.getMutationCount());
Assert.assertArrayEquals("start key should be equal to ", String.format("%10d", 1).getBytes(), snapshot.getStartKey());
Assert.assertArrayEquals("end key should be equal to ", String.format("%10d", 100).getBytes(), snapshot.getEndKey());
try {
memStore.clearSnapshot(snapshotId);
Assert.assertEquals("curr snapshot id ", -1l, memStore.getCurrSnapshotId());
}catch (IOException ioe){
LOG.error(ioe.getMessage());
}
memStore = new PMemStoreImpl(HBaseConfiguration.create());
}
@Test
public void testStartKeyAndEndKey(){
initMemStore();
Assert.assertArrayEquals("start key should be equal to ", String.format("%10d", 1).getBytes(), memStore.getStartKey());
Assert.assertArrayEquals("end key should be equal to ", String.format("%10d", 100).getBytes(), memStore.getEndKey());
memStore = new PMemStoreImpl(HBaseConfiguration.create());
}
@Test
public void testGetScanner(){
initMemStore();
RowScanner scanner = memStore.getScanner(null);
for(int i = 1; i<= 100; ++i){
Assert.assertEquals("should has next", true, scanner.hasNext());
List<Cell> peek = scanner.peek();
Assert.assertEquals("peek should not be empty ", true, !peek.isEmpty());
String peekRow = Bytes.toString(peek.get(0).getRow());
Assert.assertEquals("peek row should be equal to", String.format("%10d", i), peekRow);
//test peek info
List<Cell>result = scanner.next();
Assert.assertEquals("result should not be empty ", true, ! result.isEmpty());
String resultRow = Bytes.toString(result.get(0).getRow());
Assert.assertEquals("row should be equal ", String.format("%10d", i), resultRow);
//test result
}
memStore = new PMemStoreImpl(HBaseConfiguration.create());
}
@Test
public void testScanWithSchema(){
initMemStore();
Scan scan = new Scan();
String scanSchema = " message people { " +
"required binary cf:name;" +
// "required binary cf:age;" +
" }";
scan.setAttribute(HConstants.SCAN_TABLE_SCHEMA, scanSchema.getBytes());
RowScanner scanner = memStore.getScanner(scan);
InternalRecordScanner iscanner = (InternalRecordScanner) scanner;
while (iscanner.hasNext()){
List<Cell> cells = iscanner.next();
for(Cell cell: cells){
//System.out.println(new String(cell.getQualifier()) + " " + new String(cell.getValue()));
}
}
}
@Test
public void testScannerSeek(){
initMemStore();
RowScanner scanner = memStore.getScanner(null);
scanner.seek(String.format("%10d", 0).getBytes());
List<Cell> peek = scanner.peek();
Assert.assertEquals("peek should not be empty ", true, !peek.isEmpty());
String peekRow = Bytes.toString(peek.get(0).getRow());
Assert.assertEquals("peek row should be equal to", String.format("%10d", 1), peekRow);
for(int i = 1; i<= 100; i += 2){
Assert.assertEquals("should has next", true, scanner.hasNext());
scanner.seek(String.format("%10d", i).getBytes());
List<Cell> peek1 = scanner.peek();
Assert.assertEquals("peek should not be empty ", true, !peek1.isEmpty());
String peekRow1 = Bytes.toString(peek1.get(0).getRow());
Assert.assertEquals("peek row should be equal to", String.format("%10d", i), peekRow1);
}
scanner.seek(String.format("%10d", 200).getBytes());
List<Cell> peek3 = scanner.peek();
Assert.assertEquals("peek should be empty ", true, peek3.isEmpty());
memStore = new PMemStoreImpl(HBaseConfiguration.create());
}
}