/**
*
*/
package eu.play_project.dcep.distributedetalis.join;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.play_project.dcep.distributedetalis.api.EcConnectionManager;
import eu.play_project.dcep.distributedetalis.api.EcConnectionmanagerException;
import eu.play_project.dcep.distributedetalis.api.HistoricalDataEngine;
import eu.play_project.dcep.distributedetalis.api.VariableBindings;
import eu.play_project.play_platformservices.api.HistoricalData;
import eu.play_project.play_platformservices.api.HistoricalQuery;
/**
* @author Ningyuan Pan
*
*/
public class Engine implements HistoricalDataEngine {
private final EcConnectionManager ecConnection;
private final Logger logger;
public Engine(EcConnectionManager ecm){
if(ecm == null)
throw new IllegalArgumentException("EcConnection must not be null");
ecConnection = ecm;
logger = LoggerFactory.getLogger(this.getClass());
}
@Override
public HistoricalData get(
List<HistoricalQuery> queries,
VariableBindings variableBindings) {
Map<String, String> historicalQueries = new HashMap<String, String>();
Map<String, List<String>> variableNames = new HashMap<String, List<String>>();
for (HistoricalQuery historicalQuery : queries) {
historicalQueries.put(historicalQuery.getCloudId(), historicalQuery.getQuery());
variableNames.put(historicalQuery.getCloudId(), historicalQuery.getVariables());
}
return this.get(historicalQueries, variableNames, variableBindings);
}
public HistoricalData get(Map<String, String> queries, Map<String, List<String>> variableNames, VariableBindings variableBindings){
HistoricalData ret = new HistoricalData();
// data structures used by core
List<SelectResults> rrs = new ArrayList<SelectResults>();
Map<String, SelectVariable> svs = new HashMap<String, SelectVariable>();
// init data structures used by core
// separate the variables per stream:
for(String stream : queries.keySet()){
String query = queries.get(stream);
VariableBindings vb = new VariableBindings();
List<String> vars = variableNames.get(stream);
for(String var : vars){
vb.put(var, variableBindings.get(var));
}
HistoricalQueryContainer hq = new HistoricalQueryContainer(query, vb);
if(!addResultRegistry(stream, hq.getQuery(), rrs, svs, variableNames)){
return ret;
}
}
Core.make(svs, rrs);
transform(ret, rrs.get(0));
return ret;
}
private boolean addResultRegistry(String stream, String hquery, List<SelectResults> rrs, Map<String, SelectVariable> svs, Map<String, List<String>> variableNames) {
SelectResults rr;
try {
rr = ecConnection.getDataFromCloud(hquery, stream);
} catch (EcConnectionmanagerException e) {
logger.error(e.getMessage(), e);
return false;
}
if(rr.getSize() == 0)
return false;
else{
List<String> vars = variableNames.get(stream);
for(String var : vars){
SelectVariable sv = svs.get(var);
if(sv == null){
sv = new SelectVariable();
svs.put(var, sv);
}
sv.addRelResult(rr);
}
rrs.add(rr);
return true;
}
}
private void transform(Map<String, List<String>> m, SelectResults rr){
List<String> vars = rr.getVariables();
List<List> result = rr.getResult();
List<String>[] values = new ArrayList[vars.size()];
for(int i = 0; i < vars.size(); i++){
values[i] = new ArrayList<String>();
m.put(vars.get(i), values[i]);
}
// every row in result
for(int i = 0; i < result.size(); i++){
List<String> r = result.get(i);
// every column in one row
for(int j = 0; j < r.size(); j++){
values[j].add(r.get(j));
}
}
}
}