package water.udf; import water.MRTask; import water.fvec.Chunk; import water.fvec.Frame; import water.fvec.Vec; import water.util.fp.Function; import water.udf.specialized.Enums; import static water.udf.DataColumns.*; import java.io.IOException; /** * Single column frame that knows its data type */ public class TypedFrame<X> extends Frame { private final ColumnFactory<X> factory; private final long length; private final Function<Long, X> function; private Column<X> column; /** * deserialization :( */ public TypedFrame() { factory = null; length = -1; function = null; } public TypedFrame(BaseFactory<X> factory, long length, Function<Long, X> function) { super(); this.factory = factory; this.length = length; this.function = function; } public static <X> TypedFrame<X> forColumn(final BaseFactory<X> factory, final Column<X> column) { return new TypedFrame<X>(factory, column.size(), column) { @Override protected Vec buildZeroVec() { return factory.buildZeroVec(column); } }; } public final static class EnumFrame extends TypedFrame<Integer> { private final String[] domain; public EnumFrame(long length, Function<Long, Integer> function, String[] domain) { super(Enums.enums(domain), length, function); this.domain = domain; } } protected Vec buildZeroVec() { return factory.buildZeroVec(length); } protected Vec makeVec() throws IOException { final Vec vec0 = buildZeroVec(); MRTask task = new MRTask() { @Override public void map(Chunk[] cs) { for (Chunk c : cs) { DataChunk<X> tc = factory.apply(c); for (int r = 0; r < c._len; r++) { long i = r + c.start(); tc.set(r, function.apply(i)); } } } }; MRTask mrTask = task.doAll(vec0); return mrTask._fr.vecs()[0]; } protected DataColumn<X> newColumn(Vec vec) throws IOException { return factory.newColumn(vec); } public DataColumn<X> newColumn() throws IOException { return newColumn(makeVec()); } }