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}