package edu.isi.karma.rep.hierarchicalheadings;
import java.util.HashMap;
import java.util.List;
import java.util.TreeSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import edu.isi.karma.rep.hierarchicalheadings.Coordinate.Position;
public class ColumnCoordinateSet {
final private TreeSet<Coordinate> coordinates = new TreeSet<Coordinate>();
private static Logger logger = LoggerFactory.getLogger(ColumnCoordinateSet.class);
public ColumnCoordinateSet(HHTree hHtree, ColspanMap cspanmap) {
HashMap<HHTNode, Span> spanMap = cspanmap.getSpanMap();
// Add the integer coordinates
List<HHTNode> roots = hHtree.getRootNodes();
for(HHTNode root:roots) {
Span span = spanMap.get(root);
for(int i = span.getStartIndex(); i <= span.getEndIndex(); i++) {
coordinates.add(new Coordinate(i));
}
}
// Add the column separators coordinates
for(HHTNode node: spanMap.keySet()) {
Span span = spanMap.get(node);
if(!node.isLeaf()){
coordinates.add(new Coordinate(span.getStartIndex(), Position.left, node.getDepth()));
coordinates.add(new Coordinate(span.getEndIndex(), Position.right, node.getDepth()));
}
}
// for(Coordinate cr:coordinates){
// System.out.println(cr);
// }
}
public int getNumberOfCoordinatesBetweenTwoIndexes(int startIndex, int endIndex, int depth) {
// If any column separators exist around the indexes
Coordinate cs1 = new Coordinate(startIndex, Position.left, depth);
Coordinate cs2 = new Coordinate(endIndex, Position.right, depth);
if(coordinates.contains(cs1) && coordinates.contains(cs2)) {
return coordinates.subSet(cs1, false, cs2, false).size();
}
// If the column separators do not exist
Coordinate c1 = new Coordinate(startIndex);
Coordinate c2 = new Coordinate(endIndex);
if(!coordinates.contains(c1) || !coordinates.contains(c2)) {
logger.error("Coordinates not found for the input indexes! Start Index: "
+ startIndex + " EndIndex: " + endIndex);
return 0;
}
return coordinates.subSet(c1, true, c2, true).size();
}
public int getCoordinatesCountForIndex (int index) {
int count = 0;
for(Coordinate c : coordinates) {
if(c.getIndex() > index)
break;
if (c.getIndex() == index)
count++;
}
return count;
}
}