package lucee.runtime.cache.tag.query;
import java.io.Serializable;
import java.util.Date;
import lucee.runtime.PageContext;
import lucee.runtime.cache.tag.CacheItem;
import lucee.runtime.dump.DumpData;
import lucee.runtime.dump.DumpProperties;
import lucee.runtime.dump.Dumpable;
import lucee.runtime.type.Duplicable;
import lucee.runtime.type.Query;
import lucee.runtime.type.query.QueryArray;
import lucee.runtime.type.query.QueryResult;
import lucee.runtime.type.query.QueryStruct;
public abstract class QueryResultCacheItem implements CacheItem, Dumpable, Serializable,Duplicable {
private static final long serialVersionUID = -2322582053856364084L;
private static final String[] EMPTY=new String[0];
private QueryResult queryResult;
private final long creationDate;
private String[] tags;
protected QueryResultCacheItem(QueryResult qr, String[] tags) {
this.queryResult=qr;
this.creationDate=System.currentTimeMillis();
this.tags=tags==null?EMPTY:tags;
}
public static CacheItem newInstance(QueryResult qr, String[] tags, CacheItem defaultValue) {
if(qr instanceof Query)
return new QueryCacheItem((Query) qr,tags);
else if(qr instanceof QueryArray)
return new QueryArrayItem((QueryArray) qr,tags);
else if(qr instanceof QueryStruct)
return new QueryStructItem((QueryStruct) qr,tags);
return defaultValue;
}
public final QueryResult getQueryResult() {
return queryResult;
}
@Override
public final String getName() {
return queryResult.getName();
}
@Override
public final long getPayload() {
return queryResult.getRecordcount();
}
@Override
public final String getMeta() {
return queryResult.getSql().getSQLString();
}
@Override
public final long getExecutionTime() {
return queryResult.getExecutionTime();
}
public final String[] getTags() {
return tags;
}
@Override
public final DumpData toDumpData(PageContext pageContext, int maxlevel, DumpProperties properties) {
return queryResult.toDumpData(pageContext, maxlevel, properties);
}
public boolean isCachedAfter(Date cacheAfter) {
if(cacheAfter==null) return true;
if(creationDate>=cacheAfter.getTime()){
return true;
}
return false;
}
}