package main.java.utils.redis;
import static main.java.utils.constants.WorkberchConstants.INDEX_FIELD;
import static main.java.utils.constants.WorkberchConstants.NAME_DELIMITER;
import static main.java.utils.constants.WorkberchConstants.PROVENANCE_FIELD_E;
import static main.java.utils.constants.WorkberchConstants.PROVENANCE_FIELD_R;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import main.java.utils.WorkberchTuple;
import main.java.utils.cartesianindex.CartesianIndex;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import redis.clients.jedis.Jedis;
public class RedisHandeler {
private static final String REDIS_SERVER = "localhost";
private RedisHandeler() {
}
private static byte[] serializeValue(final Object value) throws RedisException {
final ByteArrayOutputStream streamByteSerialize = new ByteArrayOutputStream();
ObjectOutputStream streamObjectSerialize;
try {
streamObjectSerialize = new ObjectOutputStream(streamByteSerialize);
streamObjectSerialize.writeObject(value);
return streamByteSerialize.toByteArray();
} catch (final IOException e) {
throw new RedisException(e);
}
}
private static WorkberchTuple deserializeValue(final byte[] value) throws RedisException {
final ByteArrayInputStream streamByteSerialize = new ByteArrayInputStream(value);
ObjectInputStream streamObjectSerialize;
try {
streamObjectSerialize = new ObjectInputStream(streamByteSerialize);
final WorkberchTuple tuple = (WorkberchTuple) streamObjectSerialize.readObject();
streamObjectSerialize.close();
return tuple;
} catch (final Exception e) {
throw new RedisException(e);
}
}
public static long increseRecivedState(final String boltId) {
final Jedis jedis = new Jedis(REDIS_SERVER);
final long incr = jedis.hincrBy(boltId, "received", 1);
jedis.close();
return incr;
}
public static long getRecivedState(final String boltId) {
final Jedis jedis = new Jedis(REDIS_SERVER);
final String receivedString = jedis.hget(boltId, "received");
final long recived = receivedString == null ? 0L : Long.valueOf(receivedString);
jedis.close();
return recived;
}
public static long increseEmitedState(final String boltId) {
final Jedis jedis = new Jedis(REDIS_SERVER);
final long incr = jedis.hincrBy(boltId, "emited", 1);
jedis.close();
return incr;
}
public static long getEmitedState(final String boltId) {
final Jedis jedis = new Jedis(REDIS_SERVER);
final String emitedString = jedis.hget(boltId, "emited");
final long emited = emitedString == null ? 0L : Long.valueOf(emitedString);
jedis.close();
return emited;
}
public static void setStateFinished(final String boltId) {
final Jedis jedis = new Jedis(REDIS_SERVER);
jedis.hset(boltId, "finished", Boolean.TRUE.toString());
jedis.close();
}
public static boolean getFinishedState(final String boltId) {
final Jedis jedis = new Jedis(REDIS_SERVER);
final boolean finishState = BooleanUtils.toBoolean(jedis.hget(boltId, "finished"));
jedis.close();
return finishState;
}
public static void saveCartesianIndexObject(final String boltId, final WorkberchTuple input) throws RedisException {
final Jedis jedis = new Jedis(REDIS_SERVER);
jedis.lpush((boltId + "_tuples").getBytes(), serializeValue(input));
jedis.close();
}
public static Map<CartesianIndex, WorkberchTuple> loadCartesianIndexObjects(final String boltId) throws RedisException {
final Map<CartesianIndex, WorkberchTuple> cartesianMap = new HashMap<CartesianIndex, WorkberchTuple>();
final Jedis jedis = new Jedis(REDIS_SERVER);
byte[] serializedTuple = jedis.lpop((boltId + "_tuples").getBytes());
while (serializedTuple != null && serializedTuple.length != 0) {
final WorkberchTuple tuple = deserializeValue(serializedTuple);
final CartesianIndex index = (CartesianIndex) tuple.getValues().get(INDEX_FIELD);
cartesianMap.put(index, tuple);
serializedTuple = jedis.lpop((boltId + "_tuples").getBytes());
}
jedis.close();
return cartesianMap;
}
public static String setProvenanceReceivedInfo(final String guid, final String nodeId, final List<String> outputFields, final List<Object> tuple)
throws RedisException {
final Jedis jedis = new Jedis(REDIS_SERVER);
final Iterator<Object> iterTuple = tuple.iterator();
final Iterator<String> iterFields = outputFields.iterator();
String indexValue = StringUtils.EMPTY;
String indexField = StringUtils.EMPTY;
do {
final Object indexObject = iterTuple.next();
indexField = iterFields.next();
indexValue = String.valueOf(indexObject);
} while (iterFields.hasNext() && !StringUtils.equals(indexField, INDEX_FIELD));
final Iterator<Object> iterTupleReturn = tuple.iterator();
final String uuid = UUID.randomUUID().toString();
for (final String field : outputFields) {
jedis.hset((guid + NAME_DELIMITER + nodeId).getBytes(),
(PROVENANCE_FIELD_R + indexValue + NAME_DELIMITER + field + NAME_DELIMITER + uuid).getBytes(),
serializeValue(iterTupleReturn.next()));
}
jedis.close();
return uuid;
}
public static void setProvenanceEmitedInfo(final String guid, final String nodeId, final List<String> outputFields, final List<Object> tuple,
final String uuid) throws RedisException {
final Jedis jedis = new Jedis(REDIS_SERVER);
final Iterator<Object> iterTuple = tuple.iterator();
final Iterator<String> iterFields = outputFields.iterator();
String indexValue = StringUtils.EMPTY;
String indexField = StringUtils.EMPTY;
do {
final Object indexObject = iterTuple.next();
indexField = iterFields.next();
indexValue = String.valueOf(indexObject);
} while (iterFields.hasNext() && !StringUtils.equals(indexField, INDEX_FIELD));
final Iterator<Object> iterTupleReturn = tuple.iterator();
for (final String field : outputFields) {
jedis.hset((guid + NAME_DELIMITER + nodeId).getBytes(),
(PROVENANCE_FIELD_E + indexValue + NAME_DELIMITER + field + NAME_DELIMITER + uuid).getBytes(),
serializeValue(iterTupleReturn.next()));
}
jedis.close();
}
public static void addOutput(final String guid, final String boltId) {
final Jedis jedis = new Jedis(REDIS_SERVER);
jedis.incr(guid + "_outputs");
jedis.close();
}
public static void addOutputFinished(final String guid, final String boltId) {
final Jedis jedis = new Jedis(REDIS_SERVER);
jedis.incr(guid + "_outputs_finished");
jedis.close();
}
}