001 package railo.runtime.sql; 002 003 import java.util.ArrayList; 004 import java.util.Iterator; 005 import java.util.List; 006 007 import railo.runtime.sql.exp.Column; 008 import railo.runtime.sql.exp.Expression; 009 import railo.runtime.sql.exp.op.Operation; 010 import railo.runtime.sql.exp.value.ValueNumber; 011 012 public class Selects { 013 014 private List orderbys=new ArrayList(); 015 private List selects=new ArrayList(); 016 017 018 019 public void addOrderByExpression(Column exp) { 020 this.orderbys.add(exp); 021 } 022 023 /** 024 * @return the orderbys 025 */ 026 public Column[] getOrderbys() { 027 if(orderbys==null) return new Column[0]; 028 return (Column[]) orderbys.toArray(new Column[orderbys.size()]); 029 } 030 031 public void addSelect(Select select) { 032 selects.add(select); 033 } 034 035 public Select[] getSelects() { 036 if(selects==null) return new Select[0]; 037 return (Select[]) selects.toArray(new Select[selects.size()]); 038 } 039 040 041 /** 042 * 043 * @see java.lang.Object#toString() 044 */ 045 046 public String toString() { 047 return _toString(this); 048 } 049 public static String _toString(Selects __selects) { 050 Select[] _selects = __selects.getSelects(); 051 Select s; 052 StringBuffer sb=new StringBuffer(); 053 054 for(int y=0;y<_selects.length;y++) { 055 s = _selects[y]; 056 057 if(y>0) { 058 if(s.isUnionDistinct())sb.append("union distinct\n\n"); 059 else sb.append("union\n\n"); 060 } 061 062 sb.append("select\n\t"); 063 064 if(s.isDistinct()) sb.append("distinct\n\t"); 065 ValueNumber top = s.getTop(); 066 if(top!=null) sb.append("top "+top.getString()+"\n\t"); 067 // select 068 Expression[] sels = s.getSelects(); 069 Expression exp; 070 boolean first=true; 071 for(int i=0;i<sels.length;i++) { 072 if(!first)sb.append("\t,"); 073 exp=sels[i]; 074 sb.append(exp.toString(false)+"\n"); 075 first=false; 076 } 077 078 // from 079 sb.append("from\n\t"); 080 Column[] forms = s.getFroms(); 081 first=true; 082 for(int i=0;i<forms.length;i++) { 083 if(!first)sb.append("\t,"); 084 exp=forms[i]; 085 sb.append(exp.toString(false)+"\n"); 086 first=false; 087 } 088 089 // where 090 if(s.getWhere()!=null){ 091 sb.append("where \n\t"); 092 sb.append(s.getWhere().toString(true)); 093 sb.append("\n"); 094 } 095 096 // group by 097 Column[] gbs = s.getGroupbys(); 098 if(gbs.length>0) { 099 sb.append("group by\n\t"); 100 first=true; 101 for(int i=0;i<gbs.length;i++) { 102 if(!first)sb.append("\t,"); 103 exp=gbs[i]; 104 sb.append(exp.toString(false)+"\n"); 105 first=false; 106 } 107 } 108 109 110 // having 111 Operation having = s.getHaving(); 112 if(having!=null){ 113 sb.append("having \n\t"); 114 sb.append(having.toString(true)); 115 sb.append("\n"); 116 } 117 118 } 119 120 // order by 121 if(__selects.orderbys!=null && __selects.orderbys.size()>0) { 122 sb.append("order by\n\t"); 123 Iterator it = __selects.orderbys.iterator(); 124 Expression exp; 125 boolean first = true; 126 while(it.hasNext()) { 127 if(!first)sb.append("\t,"); 128 exp=(Expression) it.next(); 129 sb.append(exp.toString(false)+" "+(exp.isDirectionBackward()?"DESC":"ASC")+"\n"); 130 first=false; 131 } 132 } 133 return sb.toString(); 134 } 135 136 public Column[] getTables() { 137 Iterator it = selects.iterator(); 138 Select s; 139 ArrayList rtn=new ArrayList(); 140 Column[] froms; 141 while(it.hasNext()) { 142 s=(Select) it.next(); 143 froms = s.getFroms(); 144 for(int i=0;i<froms.length;i++) { 145 rtn.add(froms[i]); 146 } 147 } 148 return (Column[]) rtn.toArray(new Column[rtn.size()]); 149 } 150 151 public boolean isDistinct() { 152 Select s; 153 int len=selects.size(); 154 if(len==1) { 155 s=(Select)selects.get(0); 156 return s.isDistinct(); 157 } 158 for(int i=1;i<len;i++) { 159 s=(Select)selects.get(i); 160 if(!s.isUnionDistinct()) return false; 161 } 162 return true; 163 } 164 }