package edu.washington.escience.myria.column.builder; import java.util.ArrayList; import java.util.List; import edu.washington.escience.myria.Schema; import edu.washington.escience.myria.Type; import edu.washington.escience.myria.column.Column; import edu.washington.escience.myria.proto.DataProto.ColumnMessage; /** * A column of a batch of tuples. * * */ public final class ColumnFactory { /** * Allocate a ColumnBuilder for the specified Myria type. * * @param type the Myria type of the returned Builder. * @return a ColumnBuilder for the specified Myria type. */ public static ColumnBuilder<?> allocateColumn(final Type type) { switch (type) { case BOOLEAN_TYPE: return new BooleanColumnBuilder(); case DOUBLE_TYPE: return new DoubleColumnBuilder(); case FLOAT_TYPE: return new FloatColumnBuilder(); case INT_TYPE: return new IntColumnBuilder(); case LONG_TYPE: return new LongColumnBuilder(); case STRING_TYPE: return new StringColumnBuilder(); case DATETIME_TYPE: return new DateTimeColumnBuilder(); case BLOB_TYPE: return new BlobColumnBuilder(); } throw new IllegalArgumentException("Cannot allocate a ColumnBuilder for unknown type " + type); } /** * Allocates an array of Columns to match the given Schema. * * @param schema the Schema * @return the list of Columns */ public static List<ColumnBuilder<?>> allocateColumns(final Schema schema) { return allocateColumns(schema.getColumnTypes()); } /** * Allocates an array of Columns to match the given Type array. * * @param columnTypes the Types of the columns * @return the allocated Columns */ public static List<ColumnBuilder<?>> allocateColumns(final List<Type> columnTypes) { final ArrayList<ColumnBuilder<?>> columns = new ArrayList<ColumnBuilder<?>>(columnTypes.size()); for (Type type : columnTypes) { columns.add(allocateColumn(type)); } return columns; } /** * Deserializes a ColumnMessage into the appropriate Column. * * @param message the ColumnMessage to be deserialized. * @param numTuples num tuples in the column message * @return a Column of the appropriate type and contents. */ public static Column<?> columnFromColumnMessage( final ColumnMessage message, final int numTuples) { switch (message.getType()) { case BOOLEAN: return BooleanColumnBuilder.buildFromProtobuf(message, numTuples); case DOUBLE: return DoubleColumnBuilder.buildFromProtobuf(message, numTuples); case FLOAT: return FloatColumnBuilder.buildFromProtobuf(message, numTuples); case INT: return IntColumnBuilder.buildFromProtobuf(message, numTuples); case LONG: return LongColumnBuilder.buildFromProtobuf(message, numTuples); case STRING: return StringColumnBuilder.buildFromProtobuf(message, numTuples); case DATETIME: return DateTimeColumnBuilder.buildFromProtobuf(message, numTuples); case BLOB: return BlobColumnBuilder.buildFromProtobuf(message, numTuples); } return null; } /** Inaccessible. */ private ColumnFactory() { throw new AssertionError(); } }