package resa.evaluation.util;
import org.codehaus.jackson.map.ObjectMapper;
import redis.clients.jedis.Jedis;
import resa.metrics.MeasuredData;
import java.io.BufferedWriter;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* Created by ding on 14-5-2.
*/
public class RedisDataSource {
public static List<MeasuredData> readData(String host, int port, String queue, int maxLen) {
ObjectMapper objectMapper = new ObjectMapper();
Jedis jedis = new Jedis(host, port);
List<MeasuredData> ret = new ArrayList<>();
try {
String line = null;
int count = 0;
while ((line = jedis.lpop(queue)) != null && count++ < maxLen) {
String[] tmp = line.split("->");
String[] head = tmp[0].split(":");
ret.add(new MeasuredData(head[0], Integer.valueOf(head[1]), System.currentTimeMillis(),
objectMapper.readValue(tmp[1], Map.class)));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
jedis.disconnect();
}
return ret;
}
public static List<MeasuredData> iterData(String host, int port, String queue, int maxLen) {
ObjectMapper objectMapper = new ObjectMapper();
Jedis jedis = new Jedis(host, port);
List<MeasuredData> ret = new ArrayList<>();
try {
Iterator<String> strings = jedis.lrange(queue, 0, maxLen - 1).iterator();
String line;
int count = 0;
while (strings.hasNext() && count++ < maxLen) {
line = strings.next();
String[] tmp = line.split("->");
String[] head = tmp[0].split(":");
ret.add(new MeasuredData(head[0], Integer.valueOf(head[1]), System.currentTimeMillis(),
objectMapper.readValue(tmp[1], Map.class)));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
jedis.disconnect();
}
return ret;
}
public static void writeData2File(String host, int port, String queue, int maxLen, String outputFile) {
Jedis jedis = new Jedis(host, port);
try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(outputFile))) {
String line = null;
int count = 0;
while ((line = jedis.lpop(queue)) != null && count++ < maxLen) {
writer.append(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
jedis.disconnect();
}
}
public static List<MeasuredData> readData(String host, int port, String queue) {
return readData(host, port, queue, Integer.MAX_VALUE);
}
public static void main(String[] args) {
writeData2File(args[0], Integer.parseInt(args[1]), args[2], Integer.parseInt(args[3]), args[4]);
}
public static void clearQueue(String host, int port, String queue) {
Jedis jedis = new Jedis(host, port);
try {
jedis.del(queue);
} catch (Exception e) {
e.printStackTrace();
} finally {
jedis.disconnect();
}
}
}