package io.teknek.nibiru.coordinator;
import io.teknek.nibiru.Val;
import io.teknek.nibiru.transport.BaseMessage;
import io.teknek.nibiru.transport.Response;
import io.teknek.nibiru.transport.columnfamily.DeleteMessage;
import io.teknek.nibiru.transport.columnfamily.GetMessage;
import io.teknek.nibiru.transport.columnfamily.PutMessage;
import java.util.List;
import org.codehaus.jackson.map.ObjectMapper;
public class HighestTimestampResultMerger implements ResultMerger {
private static ObjectMapper OM = new ObjectMapper();
@Override
public Response merge(List<Response> responses, BaseMessage message) {
if (message instanceof PutMessage || message instanceof DeleteMessage) {
return new Response();
} else if (message instanceof GetMessage) {
return highestTimestampResponse(responses);
} else {
return new Response().withProperty("exception", "unsupported operation " + message);
}
}
private Response highestTimestampResponse(List<Response> responses){
long highestTimestamp = Long.MIN_VALUE;
int highestIndex = Integer.MIN_VALUE;
for (int i = 0; i < responses.size(); i++) {
Val v = OM.convertValue(responses.get(i).get("payload"), Val.class);
if (v.getTime() > highestTimestamp) {
highestTimestamp = v.getTime();
highestIndex = i;
}
}
return responses.get(highestIndex);
}
}