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    }