package jef.database.cache;
import java.util.List;
import jef.database.IQueryableEntity;
import jef.database.jsqlparser.statement.delete.Delete;
import jef.database.jsqlparser.statement.insert.Insert;
import jef.database.jsqlparser.statement.truncate.Truncate;
import jef.database.jsqlparser.statement.update.Update;
/**
* 缓存链
* @author jiyi
*
*/
@SuppressWarnings("rawtypes")
public final class CacheChain implements Cache{
private Cache[] chains;
/**
* 构造缓存链,本级在前,上级在后
* @param chain
*/
public CacheChain(Cache... chain) {
this.chains=chain;
}
@Override
public boolean contains(Class cls, Object primaryKey) {
for(Cache c: chains) {
if(c.contains(cls, primaryKey)) {
return true;
}
}
return false;
}
@Override
public void evict(Class cls, Object primaryKey) {
for(Cache c: chains) {
c.evict(cls,primaryKey);
}
}
@Override
public void evict(Class cls) {
for(Cache c: chains) {
c.evict(cls);
}
}
@Override
public void evictAll() {
for(Cache c: chains) {
c.evictAll();
}
}
@Override
public <T> void onLoad(CacheKey key, List<T> result, Class<T> clz) {
for(Cache c: chains) {
//重新考虑一下,算不算需要每级缓存都记录?是不是可以是从最顶层缓存起。。。
c.onLoad(key, result, clz);
}
}
@Override
public List load(CacheKey key) {
if(key==null)return null;
for(Cache c: chains) {
List l=c.load(key);
if(l!=null) {
return l;
}
}
return null;
}
@Override
public void evict(CacheKey cacheKey) {
for(Cache c: chains) {
c.evict(cacheKey);
}
}
@Override
public void evict(IQueryableEntity cacheKey) {
for(Cache c: chains) {
c.evict(cacheKey);
}
}
@Override
public void onInsert(IQueryableEntity obj, String table) {
for(Cache c: chains) {
c.onInsert(obj, table);
}
}
@Override
public void onDelete(String table, String where, List<Object> bind) {
for(Cache c: chains) {
//FIXME 这样做造成SQL解析两次,待改进
c.onDelete(table, where, bind);
}
}
@Override
public void onUpdate(String table, String where, List<Object> bind) {
for(Cache c: chains) {
//FIXME 这样做造成SQL解析两次,待改进
c.onUpdate(table, where, bind);
}
}
@Override
public boolean isDummy() {
for(Cache c: chains) {
if(!c.isDummy()) {
return false;
}
}
return true;
}
@Override
public void process(Truncate st, List<Object> list) {
for(Cache c: chains) {
c.process(st, list);
}
}
@Override
public void process(Delete st, List<Object> list) {
for(Cache c: chains) {
c.process(st, list);
}
}
@Override
public void process(Insert st, List<Object> list) {
for(Cache c: chains) {
c.process(st, list);
}
}
@Override
public void process(Update st, List<Object> list) {
for(Cache c: chains) {
c.process(st, list);
}
}
@Override
public long getHitCount() {
long total=0;
for(Cache c: chains) {
total+=c.getHitCount();
}
return total;
}
@Override
public long getMissCount() {
long total=0;
for(Cache c: chains) {
total+=c.getMissCount();
}
return total;
}
@Override
public <T> T unwrap(Class<T> cls) {
return this.chains[0].unwrap(cls);
}
}