/** * */ package smartkv.client.tables; import java.io.Serializable; import java.util.Collection; import java.util.Map; import smartkv.client.ColumnProxy; import smartkv.client.KeyValueColumnDatastoreProxy; import smartkv.client.util.JavaSerializer; import smartkv.client.util.Serializer; import com.google.common.collect.Lists; /** * @author fabiim * */ public class ColumnTable_<K, V> extends AbstractTable<K, V> implements ColumnTable<K, V> { private KeyValueColumnDatastoreProxy datastore; private ColumnObject<V> valueSerializer; /** * @param proxy * @param tableName * @param keySerializer * @param valueSerializer */ public static <K,V> ColumnTable_<K,V> getTable(ColumnProxy proxy, String tableName, Serializer<K> keySerializer, ColumnObject<V> valueSerializer){ return new ColumnTable_<K, V>(proxy, tableName, keySerializer, valueSerializer); } //FIXME: do builder for tables... Then when id and name is the same , it just returns the same object.... public static <K extends Serializable,V> ColumnTable_<K,V> getTableDefault(String tableName , Class<V> clazz) { return new ColumnTable_<K,V>(new ColumnProxy((int) Thread.currentThread().getId()),tableName, JavaSerializer.<K>getJavaSerializer(), AnnotatedColumnObject.newAnnotatedColumnObject(clazz)); } //FIXME: constructor... //FIXME: this is a good point favoring uniting the Table - KeyValue - Column interface hierarchie in a single line... At least it is a good point showing that this code sucks... private ColumnTable_(ColumnProxy proxy, String tableName, Serializer<K> keySerializer, ColumnObject<V> valueSerializer) { super(proxy, tableName, keySerializer); datastore = proxy; this.valueSerializer = valueSerializer; } /* (non-Javadoc) * @see bonafide.datastore.tables.ColumnTable#getColumn(java.lang.Object, java.lang.String) */ @Override public <C> C getColumn(K key, String columnName) { return (C) deserializeColumn(columnName, datastore.getColumn(tableName, serializeKey(key), columnName)) ; } /* (non-Javadoc) * @see bonafide.datastore.tables.ColumnTable#getColumnByReference(java.lang.Object, java.lang.String) */ @Override public <C> C getColumnByReference(K key, String columnName) { return (C) deserializeColumn(columnName, datastore.getColumnByReference(tableName, serializeKey(key), columnName)) ; } public boolean setColumn(K key, String columnName, Object value){ return datastore.setColumn(tableName, serializeKey(key), columnName, serializeColumn(columnName, value)); } /* (non-Javadoc) * @see bonafide.datastore.tables.KeyValueTable#remove(java.lang.Object, java.lang.Object) */ @Override public boolean remove(K key, V value) { return datastore.remove(tableName, serializeKey(key), serializeValue(value)); } /* (non-Javadoc) * @see bonafide.datastore.tables.KeyValueTable#putIfAbsent(java.lang.Object, java.lang.Object) */ @Override public V putIfAbsent(K key, V value) { return deserializeValue(datastore.putIfAbsent(tableName, serializeKey(key), serializeValue(value))); } /* (non-Javadoc) * @see bonafide.datastore.tables.KeyValueTable#remove(java.lang.Object) */ @Override public V remove(K key) { return deserializeValue(datastore.removeValue(tableName, serializeKey(key))); } /* (non-Javadoc) * @see bonafide.datastore.tables.KeyValueTable#put(java.lang.Object, java.lang.Object) */ @Override public V put(K key, V value) { return deserializeValue(datastore.put(tableName, serializeKey(key), serializeValue(value))); } /* (non-Javadoc) * @see bonafide.datastore.tables.KeyValueTable#get(java.lang.Object) */ @Override public V get(K key) { return deserializeValue(datastore.getValue(tableName, serializeKey(key))); } /* (non-Javadoc) * @see bonafide.datastore.tables.KeyValueTable#getValueByReference(java.lang.Object) */ @SuppressWarnings("unchecked") @Override public <V1> V1 getValueByReference(K key) { return (V1) deserializeValue(datastore.getValueByReference(tableName, serializeKey(key))); } /* (non-Javadoc) * @see bonafide.datastore.tables.Table#putAll(java.util.Map) */ @Override public void putAll(Map<? extends K, ? extends V> m) { throw new UnsupportedOperationException("Not yet implemented!"); } /** * @param columnName * @param column * @return */ @SuppressWarnings("unchecked") //FIXME:see what can be done with static typing and cast... protected <C> C deserializeColumn(String columnName, byte[] value) { return (C) valueSerializer.deserializeColumn(columnName, value); } protected byte[] serializeColumn(String columnName, Object value){ return valueSerializer.serializeColumn(columnName, value); } /** * @param value * @return */ private Map<String, byte[]> serializeValue(V value) { Map<String, byte[]> val = valueSerializer.toColumns(value); return val; } /** * @param putIfAbsent * @return */ private V deserializeValue(Map<String, byte[]> values) { return values != null ? valueSerializer.fromColumns(values) : null; } /* (non-Javadoc) * @see bonafide.datastore.tables.KeyValueTable#insert(java.lang.Object, java.lang.Object) */ @Override public boolean insert(K key, V value) { return datastore.insert(tableName, serializeKey(key), serializeValue(value)); } @Override public Collection<V> values(){ Collection<Map<String,byte[]>> byte_values = datastore.valueS(tableName); Collection<V> values = Lists.newArrayList(); for (Map<String,byte[]> m : byte_values){ values.add(deserializeValue(m)); } return values; } /* (non-Javadoc) * @see bonafide.datastore.tables.KeyValueTable#replace(java.lang.Object, java.lang.Object, java.lang.Object) */ @Override public boolean replace(K key, V currentValue, V newValue) { return datastore.replace(tableName, serializeKey(key), serializeValue(currentValue), serializeValue(newValue)); } }