001 package railo.runtime.util; 002 003 import railo.runtime.PageContext; 004 import railo.runtime.exp.DeprecatedException; 005 import railo.runtime.exp.PageRuntimeException; 006 import railo.runtime.op.Duplicator; 007 import railo.runtime.type.Collection.Key; 008 import railo.runtime.type.KeyImpl; 009 import railo.runtime.type.Null; 010 import railo.runtime.type.Objects; 011 import railo.runtime.type.Query; 012 import railo.runtime.type.QueryColumn; 013 014 /** 015 * Stack for Query Objects 016 */ 017 public final class QueryStackImpl implements QueryStack { 018 Query[] queries=new Query[20]; 019 int start=queries.length; 020 021 @Override 022 public QueryStack duplicate(boolean deepCopy){ 023 QueryStackImpl qs=new QueryStackImpl(); 024 if(deepCopy) { 025 qs.queries=new Query[queries.length]; 026 for(int i=0;i<queries.length;i++) { 027 qs.queries[i]=(Query)Duplicator.duplicate(queries[i],deepCopy); 028 } 029 } 030 else qs.queries=queries; 031 032 qs.start=start; 033 return qs; 034 } 035 036 @Override 037 public void addQuery(Query query) { 038 if(start<1)grow(); 039 queries[--start]= query; 040 } 041 042 @Override 043 public void removeQuery() { 044 //print.ln("queries["+start+"]=null;"); 045 queries[start++]=null; 046 } 047 048 @Override 049 public boolean isEmpty() { 050 return start==queries.length; 051 } 052 053 @Override 054 public Object getDataFromACollection(String key) { 055 throw new PageRuntimeException(new DeprecatedException("this method is no longer supported, use instead getDataFromACollection(PageContext pc,Key key, Object defaultValue)")); 056 } 057 058 @Override 059 public Object getDataFromACollection(PageContext pc,String key) { 060 throw new PageRuntimeException(new DeprecatedException("this method is no longer supported, use instead getDataFromACollection(PageContext pc,Key key, Object defaultValue)")); 061 } 062 063 @Override 064 public Object getDataFromACollection(Key key) { 065 throw new PageRuntimeException(new DeprecatedException("this method is no longer supported, use instead getDataFromACollection(PageContext pc,Key key, Object defaultValue)")); 066 } 067 068 @Override 069 public Object getDataFromACollection(PageContext pc,Key key) { 070 throw new PageRuntimeException(new DeprecatedException("this method is no longer supported, use instead getDataFromACollection(PageContext pc,Key key, Object defaultValue)")); 071 } 072 073 // FUTURE add to interface and set above to deprecated 074 public Object getDataFromACollection(PageContext pc,Key key, Object defaultValue) { 075 Object rtn; 076 077 // get data from queries 078 for(int i=start;i<queries.length;i++) { 079 rtn=((Objects)queries[i]).get(pc,key,Null.NULL); 080 if(rtn!=Null.NULL) return rtn; 081 } 082 return defaultValue; 083 } 084 085 @Override 086 public QueryColumn getColumnFromACollection(String key) { 087 return getColumnFromACollection(KeyImpl.init(key)); 088 } 089 090 @Override 091 public QueryColumn getColumnFromACollection(Key key) { 092 QueryColumn rtn=null; 093 094 // get data from queries 095 for(int i=start;i<queries.length;i++) { 096 rtn=queries[i].getColumn(key,null); 097 if(rtn!=null) { 098 return rtn; 099 } 100 } 101 return null; 102 } 103 104 @Override 105 public void clear() { 106 for(int i=start;i<queries.length;i++) { 107 queries[i]=null; 108 } 109 start=queries.length; 110 } 111 112 private void grow() { 113 Query[] tmp=new Query[queries.length+20]; 114 for(int i=0;i<queries.length;i++) { 115 tmp[i+20]=queries[i]; 116 } 117 queries=tmp; 118 start+=20; 119 } 120 121 @Override 122 public Query[] getQueries() { 123 Query[] tmp=new Query[queries.length-start]; 124 int count=0; 125 for(int i=start;i<queries.length;i++) { 126 tmp[count++]=queries[i]; 127 } 128 return tmp; 129 } 130 }