package com.airbnb.airpal.core.store.usage;
import com.airbnb.airpal.presto.Table;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.collect.Iterables;
import io.dropwizard.util.Duration;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
public class CachingUsageStore implements UsageStore
{
private final UsageStore delegate;
private final LoadingCache<Table, Long> cache;
public CachingUsageStore(final UsageStore delegate, final Duration expireAfter)
{
this.delegate = delegate;
this.cache = CacheBuilder
.newBuilder()
.expireAfterWrite(expireAfter.getQuantity(), expireAfter.getUnit())
.build(new CacheLoader<Table, Long>()
{
@Override
public Long load(Table table)
throws Exception
{
return delegate.getUsages(table);
}
});
}
@Override
public long getUsages(Table table)
{
try {
return cache.get(table);
}
catch (ExecutionException e) {
return 0;
}
}
@Override
public Map<Table, Long> getUsages(Iterable<Table> tables)
{
Map<Table, Long> usages = new HashMap<>(Iterables.size(tables));
for (Table table : tables) {
usages.put(table, getUsages(table));
}
return usages;
}
@Override
public void markUsage(Table table)
{
delegate.markUsage(table);
}
@Override
public Duration window()
{
return delegate.window();
}
}