package utils.test.data;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* Created by ricardolorenzo on 31/07/2014.
*/
public class YCSBMeasure implements Measure {
private String nodeAddress;
private Long time;
private TimeUnit timeUnit;
private Map<Integer, Integer> operations;
private Map<Integer, Float> latency;
public YCSBMeasure(String nodeAddress) {
setNodeAddress(nodeAddress);
timeUnit = TimeUnit.SECONDS;
operations = new HashMap<>();
latency = new HashMap<>();
}
@Override
public String getNodeAddress() {
return nodeAddress;
}
@Override
public Long getTime() {
return time;
}
@Override
public TimeUnit getTimeUnit() {
return timeUnit;
}
@Override
public Float getAverageLatencyByType(int type) {
Float total = latency.get(type);
if(total == null) {
return 0F;
}
return total;
}
@Override
public Integer getTotalOperationsByType(int type) {
Integer total = operations.get(type);
if(total == null) {
return 0;
}
return total;
}
@Override
public void setNodeAddress(String address) {
this.nodeAddress = address;
}
@Override
public void setTime(Long time) {
this.time = time;
}
@Override
public void setTimeUnit(TimeUnit timeUnit) {
this.timeUnit = timeUnit;
}
@Override
public void setAverageLatencyByType(int type, Float average) {
this.latency.put(type, average);
}
@Override
public void setTotalOperationsByType(int type, Integer total) {
this.operations.put(type, total);
}
public static YCSBMeasure parseMeasure(String nodeAddress, String data) {
if(data == null || data.isEmpty() || !data.startsWith("[") || !data.contains("]") || !data.contains(",")) {
return null;
}
data = data.trim();
if(data.contains("\n")) {
data = data.substring(data.indexOf("\n"));
}
String[] tokens = data.split(",");
if(tokens.length < 4) {
return null;
}
for(int i = 0; i < tokens.length; i++) {
tokens[i] = tokens[i].trim();
}
if(!tokens[0].startsWith("[") || !tokens[0].endsWith("]")) {
return null;
}
Float average;
Long second;
Integer count;
YCSBMeasure measure = new YCSBMeasure(nodeAddress);
if(tokens[3].matches("^[0-9]{1,13}(\\.[0-9]+)?$")) {
try {
count = Integer.parseInt(tokens[3]);
} catch(NumberFormatException e) {
return null;
}
} else {
return null;
}
if(tokens[2].matches("^[0-9]{1,13}(\\.[0-9]+)?$")) {
try {
average = Float.parseFloat(tokens[2]);
} catch(NumberFormatException e) {
return null;
}
} else {
return null;
}
if(tokens[1].matches("^[0-9]{1,13}(\\.[0-9]+)?$")) {
try {
second = Long.parseLong(tokens[1]);
} catch(NumberFormatException e) {
return null;
}
} else {
return null;
}
measure.setTime(second);
measure.setTimeUnit(TimeUnit.SECONDS);
switch(tokens[0].substring(1, data.indexOf("]"))) {
case "INSERT":
measure.setTotalOperationsByType(Measure.INSERT, count);
measure.setAverageLatencyByType(Measure.INSERT, average);
break;
case "UPDATE":
measure.setTotalOperationsByType(Measure.UPDATE, count);
measure.setAverageLatencyByType(Measure.UPDATE, average);
break;
case "DELETE":
measure.setTotalOperationsByType(Measure.DELETE, count);
measure.setAverageLatencyByType(Measure.DELETE, average);
break;
case "SCAN":
measure.setTotalOperationsByType(Measure.SCAN, count);
measure.setAverageLatencyByType(Measure.SCAN, average);
break;
case "READ":
measure.setTotalOperationsByType(Measure.READ, count);
measure.setAverageLatencyByType(Measure.READ, average);
break;
default:
return null;
}
return measure;
}
}