package water.udf; import water.DKV; import water.Key; import water.fvec.Vec; /** * A Column based on actual data in a Vec (hence implementing Vec.Holder) */ public abstract class DataColumn<T> extends ColumnBase<T> { protected transient Vec vec = null; private Key<Vec> vecKey; public final byte type; private ChunkFactory<T> chunkFactory; /** * Deserialization only; pls don't use */ public DataColumn() { type = Vec.T_BAD; } public abstract T get(long idx); public abstract void set(long idx, T value); @Override public T apply(Long idx) { return get(idx); } @Override public T apply(long idx) { return get(idx); } @Override public int rowLayout() { return vec()._rowLayout; } @Override public long size() { return vec().length(); } @Override public TypedChunk<T> chunkAt(int i) { return chunkFactory.apply(vec().chunkForChunkIdx(i)); } protected DataColumn(Vec vec, ChunkFactory<T> factory) { this.vec = vec; this.vecKey = vec._key; this.type = factory.typeCode(); this.chunkFactory = factory; } public boolean isNA(long idx) { return vec().isNA(idx); } public Vec vec() { if (vec == null) vec = DKV.get(vecKey).get(); return vec; } @Override public String toString() { return "DataColumn(type=" + type + ", factory=" + chunkFactory + ", vec=" + vec() + ")"; } @Override public boolean equals(Object o) { if (this == o) return true; if (o instanceof DataColumn<?>) { DataColumn<?> that = (DataColumn<?>) o; return (type == that.type) && vecKey.equals(that.vecKey); } else return false; } @Override public int hashCode() { return 61 * vecKey.hashCode() + type; } }