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    }