001 package railo.runtime.type; 002 003 import java.util.Date; 004 import java.util.Iterator; 005 import java.util.Map.Entry; 006 007 import railo.runtime.PageContext; 008 import railo.runtime.config.NullSupportHelper; 009 import railo.runtime.dump.DumpData; 010 import railo.runtime.dump.DumpProperties; 011 import railo.runtime.dump.DumpUtil; 012 import railo.runtime.engine.ThreadLocalPageContext; 013 import railo.runtime.exp.DatabaseException; 014 import railo.runtime.exp.PageException; 015 import railo.runtime.op.Caster; 016 import railo.runtime.op.Operator; 017 import railo.runtime.op.date.DateCaster; 018 import railo.runtime.type.dt.DateTime; 019 import railo.runtime.type.it.EntryIterator; 020 import railo.runtime.type.it.KeyIterator; 021 import railo.runtime.type.it.StringIterator; 022 import railo.runtime.type.util.CollectionUtil; 023 import railo.runtime.type.util.QueryUtil; 024 025 /** 026 * Recordcount Query Column 027 */ 028 public final class QueryColumnRef implements QueryColumn,Sizeable { 029 030 private Query query; 031 private Collection.Key columnName; 032 private int type; 033 034 /** 035 * Constructor of the class 036 * @param query 037 * @param columnName 038 * @param type 039 */ 040 public QueryColumnRef(Query query, Collection.Key columnName, int type) { 041 this.query=query; 042 this.columnName=columnName; 043 this.type=type; 044 } 045 046 @Override 047 public Object remove(int row) throws DatabaseException { 048 throw new DatabaseException("can't remove "+columnName+" at row "+row+" value from Query",null,null,null); 049 } 050 051 @Override 052 public Object removeEL(int row) { 053 return query.getAt(columnName,row,null); 054 } 055 056 @Override 057 public Object get(int row) throws PageException { 058 return query.getAt(columnName,row); 059 } 060 061 /** 062 * touch a value, means if key dosent exist, it will created 063 * @param row 064 * @return matching value or created value 065 * @throws PageException 066 */ 067 public Object touch(int row) throws PageException { 068 Object o= query.getAt(columnName,row,NullSupportHelper.NULL()); 069 if(o!=NullSupportHelper.NULL()) return o; 070 return query.setAt(columnName,row,new StructImpl()); 071 } 072 073 public Object touchEL(int row) { 074 Object o= query.getAt(columnName,row,NullSupportHelper.NULL()); 075 if(o!=NullSupportHelper.NULL()) return o; 076 return query.setAtEL(columnName,row,new StructImpl()); 077 } 078 079 @Override 080 public Object get(int row, Object defaultValue) { 081 return query.getAt(columnName,row,defaultValue); 082 } 083 084 @Override 085 public Object set(int row, Object value) throws DatabaseException { 086 throw new DatabaseException("can't change "+columnName+" value from Query",null,null,null); 087 } 088 089 @Override 090 public Object setEL(int row, Object value) { 091 return query.getAt(columnName,row,null); 092 } 093 094 @Override 095 public void add(Object value) {} 096 097 @Override 098 public void addRow(int count) {} 099 100 @Override 101 public int getType() { 102 return type; 103 } 104 105 @Override 106 public String getTypeAsString() { 107 return QueryImpl.getColumTypeName(getType()); 108 } 109 110 @Override 111 public void cutRowsTo(int maxrows) {} 112 113 114 @Override 115 public int size() { 116 return query.size(); 117 } 118 119 @Override 120 public Collection.Key[] keys() { 121 Collection.Key[] k=new Collection.Key[size()]; 122 for(int i=1;i<=k.length;i++) { 123 k[i-1]=KeyImpl.init(Caster.toString(i)); 124 } 125 return k; 126 } 127 128 @Override 129 public Object remove(Collection.Key key) throws PageException { 130 throw new DatabaseException("can't remove "+key+" from Query",null,null,null); 131 } 132 133 @Override 134 public Object removeEL(Collection.Key key) { 135 return get(key,null); 136 } 137 138 @Override 139 public void clear() {} 140 141 @Override 142 public Object get(String key) throws PageException { 143 return get(Caster.toIntValue(key)); 144 } 145 146 @Override 147 public Object get(Collection.Key key) throws PageException { 148 return get(Caster.toIntValue(key.getString())); 149 } 150 151 @Override 152 public Object get(String key, Object defaultValue) { 153 return get(Caster.toIntValue(key,query.getCurrentrow(ThreadLocalPageContext.get().getId())),defaultValue); 154 } 155 156 @Override 157 public Object get(Collection.Key key, Object defaultValue) { 158 return get(Caster.toIntValue(key,query.getCurrentrow(ThreadLocalPageContext.get().getId())),defaultValue); 159 } 160 161 @Override 162 public Object set(String key, Object value) throws PageException { 163 return set(Caster.toIntValue(key),value); 164 } 165 166 @Override 167 public Object set(Collection.Key key, Object value) throws PageException { 168 return set(Caster.toIntValue(key),value); 169 } 170 171 @Override 172 public Object setEL(String key, Object value) { 173 return setEL(Caster.toIntValue(key,query.getCurrentrow(ThreadLocalPageContext.get().getId())),value); 174 } 175 176 @Override 177 public Object setEL(Collection.Key key, Object value) { 178 return setEL(Caster.toIntValue(key,query.getCurrentrow(ThreadLocalPageContext.get().getId())),value); 179 } 180 181 @Override 182 public Iterator<Collection.Key> keyIterator() { 183 return new KeyIterator(keys()); 184 } 185 186 @Override 187 public Iterator<String> keysAsStringIterator() { 188 return new StringIterator(keys()); 189 } 190 191 @Override 192 public Iterator<Entry<Key, Object>> entryIterator() { 193 return new EntryIterator(this, keys()); 194 } 195 196 @Override 197 public Iterator<Object> valueIterator() { 198 return query.getColumn(columnName,null).valueIterator(); 199 } 200 201 @Override 202 public boolean containsKey(String key) { 203 return get(key,NullSupportHelper.NULL())!=NullSupportHelper.NULL(); 204 } 205 206 @Override 207 public boolean containsKey(Collection.Key key) { 208 return get(key,NullSupportHelper.NULL())!=NullSupportHelper.NULL(); 209 } 210 211 @Override 212 public DumpData toDumpData(PageContext pageContext, int maxlevel, DumpProperties dp) { 213 return DumpUtil.toDumpData(get(query.getCurrentrow(pageContext.getId()),null), pageContext,maxlevel,dp); 214 } 215 216 @Override 217 public String castToString() throws PageException { 218 return Caster.toString(get(query.getCurrentrow(ThreadLocalPageContext.get().getId()))); 219 } 220 221 @Override 222 public String castToString(String defaultValue) { 223 Object value = get(query.getCurrentrow(ThreadLocalPageContext.get().getId()),NullSupportHelper.NULL()); 224 if(value==NullSupportHelper.NULL())return defaultValue; 225 return Caster.toString(value,defaultValue); 226 } 227 228 @Override 229 public boolean castToBooleanValue() throws PageException { 230 return Caster.toBooleanValue(get(query.getCurrentrow(ThreadLocalPageContext.get().getId()))); 231 } 232 233 @Override 234 public Boolean castToBoolean(Boolean defaultValue) { 235 Object value = get(query.getCurrentrow(ThreadLocalPageContext.get().getId()),NullSupportHelper.NULL()); 236 if(value==NullSupportHelper.NULL())return defaultValue; 237 return Caster.toBoolean(value,defaultValue); 238 } 239 240 @Override 241 public double castToDoubleValue() throws PageException { 242 return Caster.toDoubleValue(get(query.getCurrentrow(ThreadLocalPageContext.get().getId()))); 243 } 244 245 @Override 246 public double castToDoubleValue(double defaultValue) { 247 Object value = get(query.getCurrentrow(ThreadLocalPageContext.get().getId()),NullSupportHelper.NULL()); 248 if(value==NullSupportHelper.NULL())return defaultValue; 249 return Caster.toDoubleValue(value,defaultValue); 250 } 251 252 @Override 253 public DateTime castToDateTime() throws PageException { 254 return Caster.toDate(get(query.getCurrentrow(ThreadLocalPageContext.get().getId())),null); 255 } 256 257 @Override 258 public DateTime castToDateTime(DateTime defaultValue) { 259 Object value = get(query.getCurrentrow(ThreadLocalPageContext.get().getId()),NullSupportHelper.NULL()); 260 if(value==NullSupportHelper.NULL())return defaultValue; 261 return DateCaster.toDateAdvanced(value,true,null,defaultValue); 262 } 263 264 @Override 265 public int compareTo(boolean b) throws PageException { 266 return Operator.compare(castToBooleanValue(), b); 267 } 268 269 @Override 270 public int compareTo(DateTime dt) throws PageException { 271 return Operator.compare((Date)castToDateTime(), (Date)dt); 272 } 273 274 @Override 275 public int compareTo(double d) throws PageException { 276 return Operator.compare(castToDoubleValue(), d); 277 } 278 279 @Override 280 public int compareTo(String str) throws PageException { 281 return Operator.compare(castToString(), str); 282 } 283 284 @Override 285 public String getKeyAsString() throws PageException { 286 return columnName.toString(); 287 } 288 289 @Override 290 public Collection.Key getKey() throws PageException { 291 return columnName; 292 } 293 294 @Override 295 public Object get(PageContext pc) throws PageException { 296 return get(query.getCurrentrow(pc.getId())); 297 } 298 299 @Override 300 public Object get(PageContext pc, Object defaultValue) { 301 return get(query.getCurrentrow(pc.getId()),defaultValue); 302 } 303 304 @Override 305 public Object removeRow(int row) throws DatabaseException { 306 throw new DatabaseException("can't remove row from Query",null,null,null); 307 } 308 309 @Override 310 public Object touch(PageContext pc) throws PageException { 311 return touch(query.getCurrentrow(pc.getId())); 312 } 313 314 @Override 315 public Object touchEL(PageContext pc) { 316 return touchEL(query.getCurrentrow(pc.getId())); 317 } 318 319 @Override 320 public Object set(PageContext pc, Object value) throws PageException { 321 return set(query.getCurrentrow(pc.getId()),value); 322 } 323 324 @Override 325 public Object setEL(PageContext pc, Object value) { 326 return setEL(query.getCurrentrow(pc.getId()),value); 327 } 328 329 @Override 330 public Object remove(PageContext pc) throws PageException { 331 return remove(query.getCurrentrow(pc.getId())); 332 } 333 334 @Override 335 public Object removeEL(PageContext pc) { 336 return removeEL(query.getCurrentrow(pc.getId())); 337 } 338 339 @Override 340 public Object getParent() { 341 return query; 342 } 343 344 @Override 345 public Object clone() { 346 QueryColumn clone=new QueryColumnRef(query,columnName,type); 347 return clone; 348 } 349 350 @Override 351 public Collection duplicate(boolean deepCopy) { 352 // MUST muss deepCopy checken 353 QueryColumn clone=new QueryColumnRef(query,columnName,type); 354 return clone; 355 } 356 357 358 @Override 359 public long sizeOf() { 360 return QueryUtil.sizeOf(this); 361 } 362 363 @Override 364 public java.util.Iterator<String> getIterator() { 365 return keysAsStringIterator(); 366 } 367 368 @Override 369 public boolean equals(Object obj){ 370 if(!(obj instanceof Collection)) return false; 371 return CollectionUtil.equals(this,(Collection)obj); 372 } 373 374 @Override 375 public int hashCode() { 376 return CollectionUtil.hashCode(this); 377 } 378 }