package railo.runtime.util;
import railo.runtime.PageContext;
import railo.runtime.config.NullSupportHelper;
import railo.runtime.exp.DeprecatedException;
import railo.runtime.exp.PageRuntimeException;
import railo.runtime.op.Duplicator;
import railo.runtime.type.Collection.Key;
import railo.runtime.type.KeyImpl;
import railo.runtime.type.Query;
import railo.runtime.type.QueryColumn;
/**
* Stack for Query Objects
*/
public final class QueryStackImpl implements QueryStack {
Query[] queries=new Query[20];
int start=queries.length;
@Override
public QueryStack duplicate(boolean deepCopy){
QueryStackImpl qs=new QueryStackImpl();
if(deepCopy) {
qs.queries=new Query[queries.length];
for(int i=0;i<queries.length;i++) {
qs.queries[i]=(Query)Duplicator.duplicate(queries[i],deepCopy);
}
}
else qs.queries=queries;
qs.start=start;
return qs;
}
@Override
public void addQuery(Query query) {
if(start<1)grow();
queries[--start]= query;
}
@Override
public void removeQuery() {
//print.ln("queries["+start+"]=null;");
queries[start++]=null;
}
@Override
public boolean isEmpty() {
return start==queries.length;
}
@Override
public Object getDataFromACollection(String key) {
throw new PageRuntimeException(new DeprecatedException("this method is no longer supported, use instead getDataFromACollection(PageContext pc,Key key, Object defaultValue)"));
}
@Override
public Object getDataFromACollection(PageContext pc,String key) {
throw new PageRuntimeException(new DeprecatedException("this method is no longer supported, use instead getDataFromACollection(PageContext pc,Key key, Object defaultValue)"));
}
@Override
public Object getDataFromACollection(Key key) {
throw new PageRuntimeException(new DeprecatedException("this method is no longer supported, use instead getDataFromACollection(PageContext pc,Key key, Object defaultValue)"));
}
@Override
public Object getDataFromACollection(PageContext pc,Key key) {
throw new PageRuntimeException(new DeprecatedException("this method is no longer supported, use instead getDataFromACollection(PageContext pc,Key key, Object defaultValue)"));
}
// FUTURE add to interface and set above to deprecated
public Object getDataFromACollection(PageContext pc,Key key, Object defaultValue) {
//Object rtn;
QueryColumn col;
// get data from queries
for(int i=start;i<queries.length;i++) {
col = queries[i].getColumn(key,null);
if(col!=null) return col.get(queries[i].getCurrentrow(pc.getId()),NullSupportHelper.empty());
//rtn=((Objects)queries[i]).get(pc,key,Null.NULL);
//if(rtn!=Null.NULL) return rtn;
}
return defaultValue;
}
@Override
public QueryColumn getColumnFromACollection(String key) {
return getColumnFromACollection(KeyImpl.init(key));
}
@Override
public QueryColumn getColumnFromACollection(Key key) {
QueryColumn rtn=null;
// get data from queries
for(int i=start;i<queries.length;i++) {
rtn=queries[i].getColumn(key,null);
if(rtn!=null) {
return rtn;
}
}
return null;
}
@Override
public void clear() {
for(int i=start;i<queries.length;i++) {
queries[i]=null;
}
start=queries.length;
}
private void grow() {
Query[] tmp=new Query[queries.length+20];
for(int i=0;i<queries.length;i++) {
tmp[i+20]=queries[i];
}
queries=tmp;
start+=20;
}
@Override
public Query[] getQueries() {
Query[] tmp=new Query[queries.length-start];
int count=0;
for(int i=start;i<queries.length;i++) {
tmp[count++]=queries[i];
}
return tmp;
}
}