001package gudusoft.gsqlparser;
002
003import gudusoft.gsqlparser.nodes.TParseTreeNode;
004import gudusoft.gsqlparser.nodes.TParseTreeNodeList;
005import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
006import gudusoft.gsqlparser.stmt.teradata.TTeradataUsing;
007
008
009import java.util.ArrayList;
010import java.util.Iterator;
011
012/**
013 * List of SQL statements which is instance of class that descends from {@link TCustomSqlStatement}.
014 */
015public class TStatementList extends TParseTreeNode implements Iterable<TCustomSqlStatement> {
016
017
018    @Override
019    public Iterator<TCustomSqlStatement> iterator() {
020        return new TStatementList.StatementSetIterator();
021    }
022
023    private class StatementSetIterator implements Iterator {
024        private int currentIndex = 0;
025
026        @Override
027        public boolean hasNext() {
028            return (currentIndex < size())&&(size()>0);
029        }
030
031        @Override
032        public TCustomSqlStatement next() {
033            return get(currentIndex++);
034        }
035
036        @Override
037        public void remove() {
038            throw new UnsupportedOperationException();
039        }
040    }
041
042//    int iteratorpos = 0;
043//
044//    public void resetiterator(){
045//        iteratorpos = 0;
046//    }
047//
048//
049//    public boolean hasNext(){
050//       return iteratorpos < items.size();
051//      }
052//
053//    public TCustomSqlStatement next(){
054//       return (TCustomSqlStatement)items.get(iteratorpos++) ;
055//    }
056//
057//    public void remove(){
058//     throw new UnsupportedOperationException();
059//    }
060
061    ArrayList items;
062   public TStatementList(){
063        super();
064        items = new ArrayList();
065       // resetiterator();
066    }
067
068    public int size(){
069        return items.size();
070    }
071
072    public void clear(){
073        items.clear();
074    }
075
076    public void add(TCustomSqlStatement p){
077       if (p == null) {
078           TBaseType.log("Add null statement to procedure body",TLog.WARNING);
079           //System.out.println("Add null statement to procedure body");
080           return;
081       }
082       items.add(p);
083    }
084
085    public void add(int index,TCustomSqlStatement p){
086        items.add(index,p);
087    }
088
089    public void remove(int index){
090        items.remove(index);
091    }
092
093    public TCustomSqlStatement get(int p) {
094       TCustomSqlStatement ret = (TCustomSqlStatement)items.get(p);
095       if (ret.sqlstatementtype == ESqlStatementType.sstteradatausing){
096           TCustomSqlStatement sqlInside = ((TTeradataUsing)ret).getSqlRequest();
097           if (sqlInside == null){
098               TCustomSqlStatement stmt = ret;
099               TSourceToken st = stmt.getStartToken();
100               String errorMsg = String.format("Statement(%d,%d) prefix with using clause is null, this usually caused by parse error: %s",st.lineNo,st.columnNo,stmt.getErrormessage());
101               // System.out.println(errorMsg);
102               TBaseType.log(errorMsg,TLog.DEBUG,st);
103           }else{
104             ret = sqlInside;
105           }
106       }
107        return ret;
108    }
109
110    public TCustomSqlStatement getRawSql(int p) {
111        return  (TCustomSqlStatement)items.get(p);
112    }
113
114    public void init(Object arg1)
115    {
116        add((TCustomSqlStatement)arg1);
117    }
118
119    public void doParse(TCustomSqlStatement psql, ESqlClause plocation){
120      for(int i=0;i<size();i++){
121          get(i).doParseStatement(psql);
122      }
123    }
124
125    public void accept(TParseTreeVisitor v){
126        v.preVisit(this);
127        v.postVisit(this);
128    }
129
130    public void acceptChildren(TParseTreeVisitor v){
131        v.preVisit(this);
132        for(int i=0;i<this.size();i++){
133            this.get(i).acceptChildren(v);
134        }
135        v.postVisit(this);
136    }
137
138}