package de.mpicbg.knime.knutils.data.property;
import java.util.HashMap;
import org.knime.core.data.DataCell;
import org.knime.core.data.DataColumnDomain;
import org.knime.core.data.DataColumnSpec;
import org.knime.core.data.DataTableSpec;
import org.knime.core.data.property.ShapeFactory.Shape;
import org.knime.core.data.property.ShapeHandler;
/**
* The class provides methods around KNIME shape model
*
* @author Antje Janosch
*
*/
public class ShapeModelUtils {
/**
* retrieves the index of the column with the shape model attached
* @param tSpec
* @return column index or -1 if there was no column with size model
*/
public static int getShapeColumn(DataTableSpec tSpec) {
for(int i = 0; i < tSpec.getNumColumns(); i++) {
if(tSpec.getColumnSpec(i).getShapeHandler() != null)
return i;
}
return -1;
}
/**
* keys (domain values) and their shapes are extracted from the column spec
* @param columnSpec
* @return a map of data cells (keys) and their shape (as {@link org.knime.core.data.property.ShapeFactory.Shape})
*/
public static HashMap<DataCell, Shape> parseNominalShapeModel(
DataColumnSpec columnSpec) {
HashMap<DataCell, Shape> shapeMap = new HashMap<DataCell, Shape>();
ShapeHandler ch = columnSpec.getShapeHandler();
DataColumnDomain domain = columnSpec.getDomain();
// domain available?
if (domain == null) {
throw new IllegalStateException("No domain information available for column " + columnSpec.getName());
}
// domain contains domain values?
if(!domain.hasValues()) {
throw new IllegalStateException("No domain values available for column " + columnSpec.getName());
}
// extract domain values and their shape
for (DataCell cell : domain.getValues()) {
Shape s = ch.getShape(cell);
shapeMap.put(cell, s);
}
return shapeMap;
}
}