001 package railo.runtime.util; 002 003 import railo.runtime.PageContext; 004 import railo.runtime.engine.ThreadLocalPageContext; 005 import railo.runtime.type.Collection.Key; 006 import railo.runtime.type.Objects; 007 import railo.runtime.type.Query; 008 import railo.runtime.type.QueryColumn; 009 010 /** 011 * Stack for Query Objects 012 */ 013 public final class QueryStackImpl implements QueryStack { 014 Query[] queries=new Query[20]; 015 int start=queries.length; 016 017 // FUTURE add to interface 018 public QueryStack duplicate(boolean deepCopy){ 019 QueryStackImpl qs=new QueryStackImpl(); 020 if(deepCopy) { 021 qs.queries=new Query[queries.length]; 022 for(int i=0;i<queries.length;i++) { 023 qs.queries[i]=(Query)queries[i].duplicate(deepCopy); 024 } 025 } 026 else qs.queries=queries; 027 028 qs.start=start; 029 return qs; 030 } 031 032 033 /** 034 * @see railo.runtime.util.QueryStack#addQuery(railo.runtime.type.Query) 035 */ 036 public void addQuery(Query query) { 037 if(start<1)grow(); 038 queries[--start]= query; 039 } 040 /*public void addQueryImpl(QueryImpl query) { 041 if(start<1)grow(); 042 queries[--start]=query; 043 }*/ 044 045 /** 046 * @see railo.runtime.util.QueryStack#removeQuery() 047 */ 048 public void removeQuery() { 049 //print.ln("queries["+start+"]=null;"); 050 queries[start++]=null; 051 } 052 053 /** 054 * @see railo.runtime.util.QueryStack#isEmpty() 055 */ 056 public boolean isEmpty() { 057 return start==queries.length; 058 } 059 060 /** 061 * @see railo.runtime.util.QueryStack#getDataFromACollection(java.lang.String) 062 */ 063 public Object getDataFromACollection(String key) { 064 return getDataFromACollection(ThreadLocalPageContext.get(),key); 065 } 066 067 /** 068 * @see railo.runtime.util.QueryStack#getDataFromACollection(railo.runtime.PageContext, java.lang.String) 069 */ 070 public Object getDataFromACollection(PageContext pc,String key) { 071 Object rtn=null; 072 073 // get data from queries 074 for(int i=start;i<queries.length;i++) { 075 rtn=((Objects)queries[i]).get(pc,key,""); 076 if(rtn!=null) { 077 return rtn; 078 } 079 } 080 return null; 081 } 082 083 /** 084 * @see railo.runtime.util.QueryStack#getDataFromACollection(railo.runtime.type.Collection.Key) 085 */ 086 public Object getDataFromACollection(Key key) { 087 return getDataFromACollection(ThreadLocalPageContext.get(),key); 088 } 089 090 /** 091 * @see railo.runtime.util.QueryStack#getDataFromACollection(railo.runtime.PageContext, railo.runtime.type.Collection.Key) 092 */ 093 public Object getDataFromACollection(PageContext pc,Key key) { 094 Object rtn=null; 095 096 // get data from queries 097 for(int i=start;i<queries.length;i++) { 098 099 rtn=((Objects)queries[i]).get(pc,key,""); 100 if(rtn!=null) { 101 return rtn; 102 } 103 } 104 return null; 105 } 106 107 /** 108 * @see railo.runtime.util.QueryStack#getColumnFromACollection(java.lang.String) 109 */ 110 public QueryColumn getColumnFromACollection(String key) { 111 QueryColumn rtn=null; 112 113 // get data from queries 114 for(int i=start;i<queries.length;i++) { 115 rtn=queries[i].getColumn(key,null); 116 if(rtn!=null) { 117 return rtn; 118 } 119 } 120 return null; 121 } 122 123 /** 124 * 125 * @see railo.runtime.util.QueryStack#getColumnFromACollection(railo.runtime.type.Collection.Key) 126 */ 127 public QueryColumn getColumnFromACollection(Key key) { 128 QueryColumn rtn=null; 129 130 // get data from queries 131 for(int i=start;i<queries.length;i++) { 132 rtn=queries[i].getColumn(key,null); 133 if(rtn!=null) { 134 return rtn; 135 } 136 } 137 return null; 138 } 139 140 /** 141 * @see railo.runtime.util.QueryStack#clear() 142 */ 143 public void clear() { 144 for(int i=start;i<queries.length;i++) { 145 queries[i]=null; 146 } 147 start=queries.length; 148 } 149 150 private void grow() { 151 Query[] tmp=new Query[queries.length+20]; 152 for(int i=0;i<queries.length;i++) { 153 tmp[i+20]=queries[i]; 154 } 155 queries=tmp; 156 start+=20; 157 } 158 159 /** 160 * @see railo.runtime.util.QueryStack#getQueries() 161 */ 162 public Query[] getQueries() { 163 Query[] tmp=new Query[queries.length-start]; 164 int count=0; 165 for(int i=start;i<queries.length;i++) { 166 tmp[count++]=queries[i]; 167 } 168 return tmp; 169 } 170 }