package water.udf.specialized; import water.fvec.Chunk; import water.fvec.Vec; import water.parser.BufferedString; import water.udf.ColumnFactory; import water.udf.DataChunk; import water.udf.DataColumn; import water.udf.DataColumns; /** * Factory for strings column */ public class Strings extends DataColumns.BaseFactory<String> { public static final Strings Strings = new Strings(); public Strings() { super(Vec.T_STR, "Strings"); } static class StringChunk extends DataChunk<String> { /** * deserialization :( */ public StringChunk() {} public StringChunk(Chunk c) { super(c); } @Override public String get(int idx) { return asString(c.atStr(new BufferedString(), idx)); } @Override public void set(int idx, String value) { c.set(idx, value); } } @Override public DataChunk<String> apply(final Chunk c) { return new StringChunk(c); } static class StringColumn extends DataColumn<String> { /** * deserialization :( */ public StringColumn() {} StringColumn(Vec vec, ColumnFactory<String> factory) { super(vec, factory); } @Override public String get(long idx) { return isNA(idx) ? null : asString(vec().atStr(new BufferedString(), idx)); } @Override public void set(long idx, String value) { vec().set(idx, value); } } @Override public DataColumn<String> newColumn(final Vec vec) { if (vec.get_type() != Vec.T_STR) throw new IllegalArgumentException("Expected type T_STR, got " + vec.get_type_str()); return new StringColumn(vec, this); } private static String asString(Object x) { return x == null ? null : x.toString(); } }