/**
*
*/
package smartkv.client.tables;
import java.util.Collection;
import smartkv.client.DatastoreValue;
import smartkv.client.KeyValueDatastoreProxy;
import smartkv.client.util.Serializer;
import com.google.common.collect.Lists;
/**
* @author fabiim
*
*/
public class KeyValueTable_<K, V> extends AbstractTable<K,V> implements KeyValueTable<K,V>{
//Shadow "re-declaration" of datastore. Because we need a more specific type.
protected KeyValueDatastoreProxy datastore;
protected Serializer<V> valueSerializer;
protected Serializer<Object> referenceSerializer;
public static <K,V> KeyValueTable_<K,V> getTable(KeyValueDatastoreProxy proxy, String tableName,
Serializer<K> keySerializer, Serializer<V> valueSerializer) {
return new KeyValueTable_<K,V>(proxy,tableName, keySerializer, valueSerializer);
}
public static <K,V> KeyValueTable_<K,V> getTable(KeyValueDatastoreProxy proxy, String tableName,
Serializer<K> keySerializer, Serializer<V> valueSerializer, String tableReference, Serializer<Object> referenceSerializer) {
return new KeyValueTable_<K,V>(proxy,tableName, keySerializer, valueSerializer,tableReference , referenceSerializer );
}
/**
* @param proxy
* @param tableName
* @param keySerializer
* @param valueSerializer
*/
protected KeyValueTable_(KeyValueDatastoreProxy proxy, String tableName,
Serializer<K> keySerializer, Serializer<V> valueSerializer){
this(proxy, tableName, keySerializer, valueSerializer, null, null);
}
/**
* @param proxy
* @param tableName
* @param keySerializer
* @param valueSerializer
*/
protected KeyValueTable_(KeyValueDatastoreProxy proxy, String tableName,
Serializer<K> keySerializer, Serializer<V> valueSerializer,String tableReference, Serializer<Object> referenceSerializer) {
super(proxy, tableName, keySerializer, tableReference);
this.valueSerializer = valueSerializer;
datastore = proxy;
this.referenceSerializer = referenceSerializer;
}
/*
* @see bonafide.datastore.tables.Table#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.Table#putIfAbsent(java.lang.Object, java.lang.Object)
*/
@Override
public V putIfAbsent(K key, V value) {
DatastoreValue result = datastore.putIfAbsent(tableName, serializeKey(key), serializeValue(value));
return result != null && result.data != null ? valueSerializer.deserialize(result.data): null;
}
/* (non-Javadoc)
* @see bonafide.datastore.tables.Table#remove(java.lang.Object)
*/
@Override
public V remove(K key) {
DatastoreValue result = datastore.remove(tableName, serializeKey(key));
return result != null && result.data != null? valueSerializer.deserialize(result.data) : null;
}
/* (non-Javadoc)
* @see bonafide.datastore.tables.Table#put(java.lang.Object, java.lang.Object)
*/
@Override
public V put(K key, V value) {
DatastoreValue result = datastore.put(tableName, serializeKey(key), serializeValue(value));
return result != null && result.data != null ? valueSerializer.deserialize(result.data) : 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));
}
/* (non-Javadoc)
* @see bonafide.datastore.tables.Table#get(java.lang.Object)
*/
@Override
public V get(K key) {
//XXX
if (key == null) return null;
DatastoreValue result = datastore.get(tableName, serializeKey(key));
return result != null ? valueSerializer.deserialize(result.data): null;
}
@Override
public Collection<V> values(){
Collection<DatastoreValue> byte_values = datastore.values(tableName);
Collection<V> values = Lists.newArrayList();
for (DatastoreValue ba : byte_values){
values.add(valueSerializer.deserialize(ba.data));
}
return values;
}
/**
* @param value
* @return
*/
protected byte[] serializeValue(V value) {
return valueSerializer.serialize(value);
}
/* (non-Javadoc)
* @see bonafide.datastore.tables.KeyValueTable#getValueByReference(java.lang.Object)
*/
@SuppressWarnings("unchecked")
@Override
public <V1> V1 getValueByReference(K key) {
DatastoreValue val = datastore.getByReference(tableName, keySerializer.serialize(key));
return (V1) (val != null && val.data != null? referenceSerializer.deserialize(val.data) : null);
}
/* (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, keySerializer.serialize(key), valueSerializer.serialize(currentValue), valueSerializer.serialize(newValue));
}
}