package com.ctriposs.tsdb.test;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.Random;
import com.ctriposs.tsdb.DBConfig;
import com.ctriposs.tsdb.DBEngine;
import com.ctriposs.tsdb.ISeekIterator;
import com.ctriposs.tsdb.InternalKey;
import com.ctriposs.tsdb.test.util.TestUtil;
public class DBEngineSeekFunctionTest {
private static final String TEST_DIR = TestUtil.TEST_BASE_DIR +"/seek_test";
private static final int INIT_COUNT = 10*1000*1000;
private static DBEngine engine;
public static void main(String[] args) throws IOException {
int numKeyLimit = 300;
DBConfig config = new DBConfig(TEST_DIR);
engine = new DBEngine(config);
Random random = new Random();
long start = System.nanoTime();
String data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
LinkedHashMap<String,String> map = new LinkedHashMap<String,String>();
String startKey = null;
long startTime = 0;
long lastTime = 0;
String lastValue = null;
for (int i = 0; i < 2*INIT_COUNT; i++) {
String rndKey = String.valueOf(random.nextInt(numKeyLimit));
long time = System.currentTimeMillis();
String key = rndKey+"-"+time;
String value = data+i;
if(i==0){
startKey = rndKey;
startTime = time;
}
engine.put(rndKey, rndKey, time, value.getBytes());
if(rndKey.equals(startKey)){
map.put(key,value);
lastTime= time;
lastValue = value;
}
}
long duration = System.nanoTime() - start;
System.out.printf("Put/get %,d K operations per second single thread%n", (int) (INIT_COUNT * 2 * 1e6 / duration));
System.out.println("start value:"+new String(engine.get(startKey, startKey, startTime)));
ISeekIterator<InternalKey, byte[]> eIt = engine.iterator();
eIt.seek(startKey, startKey, startTime);
Iterator<Entry<String,String>> mIt = map.entrySet().iterator();
int total=0;
int miss = 0;
int error = 0;
while (mIt.hasNext()) {
Entry<InternalKey, byte[]> entry = null;
if(eIt.hasNext()){
entry = eIt.next();
}
Entry<String, String> mEntry = mIt.next();
String value = new String(entry.getValue());
if (!value.equals(mEntry.getValue())) {
error++;
System.out.println("Error----------------------------------"+error+"-----------------------------------------------------" );
System.out.println("engine value:"+eIt.column()+"-" +eIt.key().getTime()+ ":" + value+"|");
System.out.println("cache value:" + mEntry.getKey()+":"+mEntry.getValue()+"|");
System.out.println("Error-----------------------------------"+total+"----------------------------------------------------" );
} else {
System.out.println("OK:"+eIt.key() + ":" + value);
}
total++;
}
miss = map.size() - total;
System.out.println("total:"+total+"miss:"+miss+"error:"+error);
System.out.println("last enging value:"+new String(engine.get(startKey, startKey, lastTime)));
System.out.println("last cache value:"+lastValue);
System.out.println("map size:"+map.size());
}
}