package edu.washington.escience.myria.storage;
import java.io.Serializable;
import java.nio.ByteBuffer;
import javax.annotation.Nonnull;
import org.joda.time.DateTime;
import com.google.common.base.Preconditions;
import edu.washington.escience.myria.Schema;
import edu.washington.escience.myria.column.builder.WritableColumn;
import edu.washington.escience.myria.util.MyriaArrayUtils;
/**
* A single row relation.
*/
public class Tuple implements Cloneable, AppendableTable, ReadableTable, Serializable {
/***/
private static final long serialVersionUID = 1L;
/**
* The schema.
*/
private final Schema schema;
/**
* The data of the tuple.
*/
private final MutableTupleBuffer data;
/**
* @param schema the schema of the tuple
*/
public Tuple(final Schema schema) {
data = new MutableTupleBuffer(schema);
this.schema = schema;
}
/**
* @param data
* @param row
* @param cols
*/
public Tuple(final ReadableTable data, final int row, final int[] cols) {
this.schema = data.getSchema().getSubSchema(cols);
this.data = new MutableTupleBuffer(schema);
for (int i = 0; i < cols.length; ++i) {
this.data.put(i, data.asColumn(cols[i]), row);
}
}
/**
* @return the schema
*/
@Override
public Schema getSchema() {
return schema;
}
@Override
public boolean getBoolean(final int column, final int row) {
return data.getBoolean(column, row);
}
@Override
public double getDouble(final int column, final int row) {
return data.getDouble(column, row);
}
@Override
public float getFloat(final int column, final int row) {
return data.getFloat(column, row);
}
@Override
public int getInt(final int column, final int row) {
return data.getInt(column, row);
}
@Override
public long getLong(final int column, final int row) {
return data.getLong(column, row);
}
@Override
public String getString(final int column, final int row) {
return data.getString(column, row);
}
@Override
public DateTime getDateTime(final int column, final int row) {
return data.getDateTime(column, row);
}
@Override
public ByteBuffer getBlob(final int column, final int row) {
return data.getBlob(column, row);
}
@Override
public Object getObject(final int column, final int row) {
return data.getObject(column, row);
}
@Override
public int numColumns() {
return getSchema().numColumns();
}
@Override
public int numTuples() {
return 1;
}
@Override
public ReadableColumn asColumn(final int column) {
return new ReadableSubColumn(
this, Preconditions.checkElementIndex(column, schema.numColumns()));
}
@Override
public Tuple clone() {
return new Tuple(data.clone(), 0, MyriaArrayUtils.range(0, numColumns()));
}
@Override
public void putBoolean(final int column, final boolean value) {
data.putBoolean(column, value);
}
@Override
public void putDateTime(final int column, @Nonnull final DateTime value) {
data.putDateTime(column, value);
}
@Override
public void putDouble(final int column, final double value) {
data.putDouble(column, value);
}
@Override
public void putFloat(final int column, final float value) {
data.putFloat(column, value);
}
@Override
public void putInt(final int column, final int value) {
data.putInt(column, value);
}
@Override
public void putLong(final int column, final long value) {
data.putLong(column, value);
}
@Override
public void putString(final int column, final @Nonnull String value) {
data.putString(column, value);
}
@Override
@Deprecated
public void putObject(final int column, final @Nonnull Object value) {
data.putObject(column, value);
}
@Override
public void putBlob(final int column, @Nonnull final ByteBuffer value) {
data.putBlob(column, value);
}
@Override
public WritableColumn asWritableColumn(final int column) {
return data.asWritableColumn(column);
}
@Override
public final String toString() {
return data.getAll().get(0).toString();
}
}