package avrobase.shard;
import avrobase.AvroBase;
import avrobase.AvroBaseException;
import avrobase.Creator;
import avrobase.Mutator;
import avrobase.Row;
import org.apache.avro.specific.SpecificRecord;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
import static avrobase.shard.SC.STRATEGY;
/**
* Implementation of sharding for non-indexed avrobases.
* <p/>
* User: sam
* Date: 10/9/10
* Time: 6:22 PM
*/
public class ShardedAvroBase<T extends SpecificRecord, K> implements AvroBase<T, K> {
private final ShardingStrategy<T, K> strategy;
public ShardedAvroBase(@Inject(STRATEGY) ShardingStrategy<T, K> strategy) {
this.strategy = strategy;
}
// Delegating
@Override
public Row<T, K> get(K row) throws AvroBaseException {
Shard<T, K> shard = strategy.find(row);
try {
AvroBase<T, K> ab = shard.avrobase();
return ab.get(row);
} finally {
strategy.done(shard);
}
}
@Override
public K create(T value) throws AvroBaseException {
throw new NotImplementedException();
}
@Override
public void put(K row, T value) throws AvroBaseException {
Shard<T, K> shard = strategy.find(row);
try {
AvroBase<T, K> ab = shard.avrobase();
ab.put(row, value);
} finally {
strategy.done(shard);
}
}
@Override
public boolean put(K row, T value, long version) throws AvroBaseException {
Shard<T, K> shard = strategy.find(row);
try {
AvroBase<T, K> ab = shard.avrobase();
return ab.put(row, value, version);
} finally {
strategy.done(shard);
}
}
@Override
public void delete(K row) throws AvroBaseException {
Shard<T, K> shard = strategy.find(row);
try {
AvroBase<T, K> ab = shard.avrobase();
ab.delete(row);
} finally {
strategy.done(shard);
}
}
@Override
public Iterable<Row<T, K>> scan(K startRow, K stopRow) throws AvroBaseException {
throw new NotImplementedException();
}
@Override
public Row<T, K> mutate(K row, Mutator<T> tMutator) throws AvroBaseException {
throw new NotImplementedException();
}
@Override
public Row<T, K> mutate(K row, Mutator<T> tMutator, Creator<T> tCreator) throws AvroBaseException {
throw new NotImplementedException();
}
// Sharding
public void addShard(ShardableAvroBase<T, K> avroBase, double weight, boolean wait) throws AvroBaseException {
strategy.add(avroBase, weight);
if (wait) {
try {
strategy.waitForBalance();
} catch (InterruptedException e) {
throw new AvroBaseException("Shard balancing interrupted", e);
}
}
}
}