Merge branch 'pipeline_multi' of https://github.com/ivowiblo/jedis into pipeline_multi

This commit is contained in:
Jonathan Leibiusky
2012-05-06 19:20:44 -03:00
2 changed files with 82 additions and 4 deletions

View File

@@ -10,8 +10,51 @@ import redis.clients.jedis.BinaryClient.LIST_POSITION;
import redis.clients.jedis.exceptions.JedisDataException;
public class Pipeline extends Queable {
private Client client;
private MultiResponseBuilder currentMulti;
private class MultiResponseBuilder extends Builder<List<Object>>{
private List<Response<?>> responses = new ArrayList<Response<?>>();
@Override
public List<Object> build(Object data) {
@SuppressWarnings("unchecked")
List<Object> list = (List<Object>)data;
List<Object> values = new ArrayList<Object>();
if(list.size() != responses.size()){
throw new JedisDataException("Expected data size " + responses.size() + " but was " + list.size());
}
for(int i=0;i<list.size();i++){
Response<?> response = responses.get(i);
response.set(list.get(i));
values.add(response.get());
}
return values;
}
public void addResponse(Response<?> response){
responses.add(response);
}
}
@Override
protected <T> Response<T> getResponse(Builder<T> builder) {
if(currentMulti != null){
super.getResponse(BuilderFactory.STRING); //Expected QUEUED
Response<T> lr = new Response<T>(builder);
currentMulti.addResponse(lr);
return lr;
}
else{
return super.getResponse(builder);
}
}
private Client client;
public void setClient(Client client) {
this.client = client;
}
@@ -40,9 +83,10 @@ public class Pipeline extends Queable {
public List<Object> syncAndReturnAll() {
List<Object> unformatted = client.getAll();
List<Object> formatted = new ArrayList<Object>();
for (Object o : unformatted) {
try {
formatted.add(generateResponse(o).get());
formatted.add(generateResponse(o).get());
} catch (JedisDataException e) {
formatted.add(e);
}
@@ -1213,12 +1257,17 @@ public class Pipeline extends Queable {
return getResponse(BuilderFactory.STRING);
}
public void exec() {
public Response<List<Object>> exec() {
client.exec();
Response<List<Object>> response = super.getResponse(currentMulti);
currentMulti = null;
return response;
}
public void multi() {
client.multi();
getResponse(BuilderFactory.STRING); //Expecting OK
currentMulti = new MultiResponseBuilder();
}
public Response<Long> publish(String channel, String message) {
@@ -1269,5 +1318,5 @@ public class Pipeline extends Queable {
public Response<String> select(int index){
client.select(index);
return getResponse(BuilderFactory.STRING);
}
}
}