package cassandra.cql;
import cassandra.cql.type.CQL3Type;
import cassandra.cql.type.CQL3TypeError;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.util.*;
public class Row {
private final RowMetadata metadata;
private final List<ByteBuffer> row;
public Row(RowMetadata metadata, List<ByteBuffer> row) {
this.metadata = metadata;
this.row = row;
}
public RowMetadata getMetadata() {
return metadata;
}
public boolean isApplied() {
return isNull("[applied]") || getBool("[applied]");
}
public boolean isNull(String column) {
return isNull(metadata.getColumnIndex(column));
}
public boolean isNull(int column) {
return metadata.getColumn(column) == null || row.get(column) == null;
}
public boolean getBool(String column) {
return getBool(metadata.getColumnIndex(column));
}
public boolean getBool(int column) {
return getBool(column, false);
}
public boolean getBool(String column, boolean defaultValue) {
return getBool(metadata.getColumnIndex(column), defaultValue);
}
public boolean getBool(int column, boolean defaultValue) {
return getValue(column, CQL3Type.Name.BOOLEAN, defaultValue);
}
public ByteBuffer getBlob(String column) {
return getBlob(metadata.getColumnIndex(column));
}
public ByteBuffer getBlob(int column) {
return getBlob(column, null);
}
public ByteBuffer getBlob(String column, ByteBuffer defaultValue) {
return getBlob(metadata.getColumnIndex(column), defaultValue);
}
public ByteBuffer getBlob(int column, ByteBuffer defaultValue) {
return getValue(column, CQL3Type.Name.BLOB, defaultValue);
}
public Date getDate(String column) {
return getDate(metadata.getColumnIndex(column));
}
public Date getDate(int column) {
return getDate(column, null);
}
public Date getDate(String column, Date defaultValue) {
return getDate(metadata.getColumnIndex(column), defaultValue);
}
public Date getDate(int column, Date defaultValue) {
return getValue(column, CQL3Type.Name.TIMESTAMP, defaultValue);
}
public BigDecimal getDecimal(String column) {
return getDecimal(metadata.getColumnIndex(column));
}
public BigDecimal getDecimal(int column) {
return getDecimal(column, null);
}
public BigDecimal getDecimal(String column, BigDecimal defaultValue) {
return getDecimal(metadata.getColumnIndex(column), defaultValue);
}
public BigDecimal getDecimal(int column, BigDecimal defaultValue) {
return getValue(column, CQL3Type.Name.DECIMAL, defaultValue);
}
public double getDouble(String column) {
return getDouble(metadata.getColumnIndex(column));
}
public double getDouble(int column) {
return getDouble(column, 0.0D);
}
public double getDouble(String column, double defaultValue) {
return getDouble(metadata.getColumnIndex(column), defaultValue);
}
public double getDouble(int column, double defaultValue) {
return getValue(column, CQL3Type.Name.DOUBLE, defaultValue);
}
public float getFloat(String column) {
return getFloat(metadata.getColumnIndex(column));
}
public float getFloat(int column) {
return getFloat(column, 0.0F);
}
public float getFloat(String column, float defaultValue) {
return getFloat(metadata.getColumnIndex(column), defaultValue);
}
public float getFloat(int column, float defaultValue) {
return getValue(column, CQL3Type.Name.FLOAT, defaultValue);
}
public int getInt(String column) {
return getInt(metadata.getColumnIndex(column));
}
public int getInt(int column) {
return getInt(column, 0);
}
public int getInt(String column, int defaultValue) {
return getInt(metadata.getColumnIndex(column), defaultValue);
}
public int getInt(int column, int defaultValue) {
return getValue(column, CQL3Type.Name.INT, defaultValue);
}
public long getLong(String column) {
return getLong(metadata.getColumnIndex(column));
}
public long getLong(int column) {
return getLong(column, 0L);
}
public long getLong(String column, long defaultValue) {
return getLong(metadata.getColumnIndex(column), defaultValue);
}
public long getLong(int column, long defaultValue) {
return getValue(column, CQL3Type.Name.BIGINT, CQL3Type.Name.COUNTER, defaultValue);
}
public String getString(String column) {
return getString(metadata.getColumnIndex(column));
}
public String getString(int column) {
return getString(column, null);
}
public String getString(String column, String defaultValue) {
return getString(metadata.getColumnIndex(column), defaultValue);
}
public String getString(int column, String defaultValue) {
return getValue(column, CQL3Type.Name.VARCHAR, CQL3Type.Name.TEXT, CQL3Type.Name.ASCII, defaultValue);
}
public InetAddress getInet(String column) {
return getInet(metadata.getColumnIndex(column));
}
public InetAddress getInet(int column) {
return getInet(column, null);
}
public InetAddress getInet(String column, InetAddress defaultValue) {
return getInet(metadata.getColumnIndex(column), defaultValue);
}
public InetAddress getInet(int column, InetAddress defaultValue) {
return getValue(column, CQL3Type.Name.INET, defaultValue);
}
public BigInteger getVarint(String column) {
return getVarint(metadata.getColumnIndex(column));
}
public BigInteger getVarint(int column) {
return getVarint(column, null);
}
public BigInteger getVarint(String column, BigInteger defaultValue) {
return getVarint(metadata.getColumnIndex(column), defaultValue);
}
public BigInteger getVarint(int column, BigInteger defaultValue) {
return getValue(column, CQL3Type.Name.VARINT, defaultValue);
}
public UUID getUUID(String column) {
return getUUID(metadata.getColumnIndex(column));
}
public UUID getUUID(int column) {
return getUUID(column, null);
}
public UUID getUUID(String column, UUID defaultValue) {
return getUUID(metadata.getColumnIndex(column), defaultValue);
}
public UUID getUUID(int column, UUID defaultValue) {
return getValue(column, CQL3Type.Name.UUID, CQL3Type.Name.TIMEUUID, defaultValue);
}
public <T> List<T> getList(String column, Class<T> valueClass) {
return getList(metadata.getColumnIndex(column), valueClass);
}
public <T> List<T> getList(int column, Class<T> valueClass) {
return getList(column, valueClass, Collections.<T>emptyList());
}
public <T> List<T> getList(String column, Class<T> valueClass, List<T> defaultValue) {
return getList(metadata.getColumnIndex(column), valueClass, defaultValue);
}
public <T> List<T> getList(int column, Class<T> valueClass, List<T> defaultValue) {
CQL3Type columnType = metadata.validateColumnType(column, CQL3Type.Name.LIST);
Class<?> expectedClass = columnType.typeArguments().get(0).name().javaType;
if (expectedClass.isAssignableFrom(valueClass)) {
throw new CQL3TypeError(String.format("column type does not match: %s, List<%s> (expected: List<%s>)", metadata.getColumnName(column), valueClass.getName(), expectedClass.getName()));
}
return getValue(columnType, row.get(column), defaultValue);
}
public <T> Set<T> getSet(String column, Class<T> valueClass) {
return getSet(metadata.getColumnIndex(column), valueClass);
}
public <T> Set<T> getSet(int column, Class<T> valueClass) {
return getSet(column, valueClass, Collections.<T>emptySet());
}
public <T> Set<T> getSet(String column, Class<T> valueClass, Set<T> defaultValue) {
return getSet(metadata.getColumnIndex(column), valueClass, defaultValue);
}
public <T> Set<T> getSet(int column, Class<T> valueClass, Set<T> defaultValue) {
CQL3Type columnType = metadata.validateColumnType(column, CQL3Type.Name.SET);
Class<?> expectedClass = columnType.typeArguments().get(0).name().javaType;
if (!expectedClass.isAssignableFrom(valueClass)) {
throw new CQL3TypeError(String.format("column type does not match: %s, Set<%s> (expected: Set<%s>)", metadata.getColumnName(column), valueClass.getName(), expectedClass.getName()));
}
return getValue(columnType, row.get(column), defaultValue);
}
public <K, V> Map<K, V> getMap(String column, Class<K> keyClass, Class<V> valueClass) {
return getMap(metadata.getColumnIndex(column), keyClass, valueClass);
}
public <K, V> Map<K, V> getMap(int column, Class<K> keyClass, Class<V> valueClass) {
return getMap(column, keyClass, valueClass, Collections.<K, V>emptyMap());
}
public <K, V> Map<K, V> getMap(String column, Class<K> keyClass, Class<V> valueClass, Map<K, V> defaultValue) {
return getMap(metadata.getColumnIndex(column), keyClass, valueClass, defaultValue);
}
public <K, V> Map<K, V> getMap(int column, Class<K> keyClass, Class<V> valueClass, Map<K, V> defaultValue) {
CQL3Type columnType = metadata.validateColumnType(column, CQL3Type.Name.MAP);
Class<?> expectedKeyClass = columnType.typeArguments().get(0).name().javaType;
Class<?> expectedValueClass = columnType.typeArguments().get(1).name().javaType;
if (!expectedKeyClass.isAssignableFrom(keyClass) || !expectedValueClass.isAssignableFrom(valueClass)) {
throw new CQL3TypeError(String.format("column type does not match: %s, Map<%s, %s> (expected: Map<%s, %s>)", metadata.getColumnName(column), keyClass.getName(), valueClass.getName(), expectedKeyClass.getName(), expectedValueClass.getName()));
}
return getValue(columnType, row.get(column), defaultValue);
}
private <T> T getValue(int index, CQL3Type.Name name, T defaultValue) {
return getValue(metadata.validateColumnType(index, name), row.get(index), defaultValue);
}
private <T> T getValue(int index, CQL3Type.Name name1, CQL3Type.Name name2, T defaultValue) {
return getValue(metadata.validateColumnType(index, name1, name2), row.get(index), defaultValue);
}
private <T> T getValue(int index, CQL3Type.Name name1, CQL3Type.Name name2, CQL3Type.Name name3, T defaultValue) {
return getValue(metadata.validateColumnType(index, name1, name2, name3), row.get(index), defaultValue);
}
@SuppressWarnings("unchecked")
private <T> T getValue(CQL3Type columnType, ByteBuffer buf, T defaultValue) {
if (buf == null || buf.remaining() == 0) {
return defaultValue;
}
return (T)columnType.deserialize(buf);
}
}