package eu.play_project.dcep.distributedetalis.join;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This is a data structure that is used to represent a selected variable in queries. It's attribute
* relIndex indicates how many queries have selected this variable and in relRes all these relevant
* queries are stored in decreased oder on size of query result.
*
*
* @author Ningyuan Pan
*
*/
public class SelectVariable <T>{
// index of how many queries select this variable
private int relIndex = 0;
private List<T> values;
// queries that select this variable
private TreeSet<SelectResults> relRes = new TreeSet<SelectResults>(new Comparator<SelectResults>(){
@Override
public int compare(SelectResults o1, SelectResults o2) {
return o1.getSize() - o2.getSize();
}
});
private Logger logger = LoggerFactory.getLogger(SelectVariable.class);
public int getRelevantIndex(){
return relIndex;
}
public List<T> getValues(){
return values;
}
public boolean addRelResult(SelectResults r){
boolean done = relRes.add(r);
if(done){
relIndex++;
//logger.debug("addResult(): add "+r.getNum()+" relIndex"+relIndex);
}
return done;
}
public boolean removeRelResult(SelectResults r){
boolean done = relRes.remove(r);
if(done){
relIndex--;
//logger.debug("removeResult(): remove "+r.getNum()+" relIndex"+relIndex);
}
return done;
}
public TreeSet<SelectResults> getRelResult(){
return relRes;
}
/**
* Add new values to this variable, the result is a union of original values and new
* values. If list v is null, it means new values are any allowed data.
* @param v
* @param n
*/
public void addValues(List<T> v){
if(v != null){
if(values == null){
values = new ArrayList<T>();
for(int i = 0; i < v.size(); i++){
values.add(v.get(i));
}
}
else{
List<T> union = new ArrayList<T>();
for(int i = 0; i < values.size(); i++){
T t = values.get(i);
for(int j = 0; j < v.size(); j++){
if(t.equals(v.get(j))){
union.add(t);
logger.debug("addValues(): union "+t);
break;
}
}
}
values = union;
}
}
// if v == null, it means there is no value restriction on this variable
}
}