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 @Override 042 043 public String toString() { 044 return _toString(this); 045 } 046 public static String _toString(Selects __selects) { 047 Select[] _selects = __selects.getSelects(); 048 Select s; 049 StringBuffer sb=new StringBuffer(); 050 051 for(int y=0;y<_selects.length;y++) { 052 s = _selects[y]; 053 054 if(y>0) { 055 if(s.isUnionDistinct())sb.append("union distinct\n\n"); 056 else sb.append("union\n\n"); 057 } 058 059 sb.append("select\n\t"); 060 061 if(s.isDistinct()) sb.append("distinct\n\t"); 062 ValueNumber top = s.getTop(); 063 if(top!=null) sb.append("top "+top.getString()+"\n\t"); 064 // select 065 Expression[] sels = s.getSelects(); 066 Expression exp; 067 boolean first=true; 068 for(int i=0;i<sels.length;i++) { 069 if(!first)sb.append("\t,"); 070 exp=sels[i]; 071 sb.append(exp.toString(false)+"\n"); 072 first=false; 073 } 074 075 // from 076 sb.append("from\n\t"); 077 Column[] forms = s.getFroms(); 078 first=true; 079 for(int i=0;i<forms.length;i++) { 080 if(!first)sb.append("\t,"); 081 exp=forms[i]; 082 sb.append(exp.toString(false)+"\n"); 083 first=false; 084 } 085 086 // where 087 if(s.getWhere()!=null){ 088 sb.append("where \n\t"); 089 sb.append(s.getWhere().toString(true)); 090 sb.append("\n"); 091 } 092 093 // group by 094 Column[] gbs = s.getGroupbys(); 095 if(gbs.length>0) { 096 sb.append("group by\n\t"); 097 first=true; 098 for(int i=0;i<gbs.length;i++) { 099 if(!first)sb.append("\t,"); 100 exp=gbs[i]; 101 sb.append(exp.toString(false)+"\n"); 102 first=false; 103 } 104 } 105 106 107 // having 108 Operation having = s.getHaving(); 109 if(having!=null){ 110 sb.append("having \n\t"); 111 sb.append(having.toString(true)); 112 sb.append("\n"); 113 } 114 115 } 116 117 // order by 118 if(__selects.orderbys!=null && __selects.orderbys.size()>0) { 119 sb.append("order by\n\t"); 120 Iterator it = __selects.orderbys.iterator(); 121 Expression exp; 122 boolean first = true; 123 while(it.hasNext()) { 124 if(!first)sb.append("\t,"); 125 exp=(Expression) it.next(); 126 sb.append(exp.toString(false)+" "+(exp.isDirectionBackward()?"DESC":"ASC")+"\n"); 127 first=false; 128 } 129 } 130 return sb.toString(); 131 } 132 133 public Column[] getTables() { 134 Iterator it = selects.iterator(); 135 Select s; 136 ArrayList rtn=new ArrayList(); 137 Column[] froms; 138 while(it.hasNext()) { 139 s=(Select) it.next(); 140 froms = s.getFroms(); 141 for(int i=0;i<froms.length;i++) { 142 rtn.add(froms[i]); 143 } 144 } 145 return (Column[]) rtn.toArray(new Column[rtn.size()]); 146 } 147 148 public boolean isDistinct() { 149 Select s; 150 int len=selects.size(); 151 if(len==1) { 152 s=(Select)selects.get(0); 153 return s.isDistinct(); 154 } 155 for(int i=1;i<len;i++) { 156 s=(Select)selects.get(i); 157 if(!s.isUnionDistinct()) return false; 158 } 159 return true; 160 } 161 }