001package gudusoft.gsqlparser.nodes; 002 003import gudusoft.gsqlparser.ESqlClause; 004import gudusoft.gsqlparser.TCustomSqlStatement; 005import gudusoft.gsqlparser.TSourceToken; 006 007import java.util.ArrayList; 008import java.util.Collections; 009 010/* 011* Date: 2010-2-3 012* Time: 11:13:19 013*/ 014public class TResultColumnList extends TParseTreeNodeList <TResultColumn>{ 015 016 private ArrayList<TResultColumn> sortedResultColumns = null; 017 018 private boolean isSorted = false; 019 020 public ArrayList<TResultColumn> getSortedColumns(){ 021 if (isSorted) return sortedResultColumns; 022 if (sortedResultColumns == null){ 023 sortedResultColumns = new ArrayList<>(); 024 } 025 for(int i=0;i<size();i++){ 026 TResultColumn rc = getResultColumn(i); 027 sortedResultColumns.add(rc); 028 } 029 Collections.sort(sortedResultColumns); 030 isSorted = true; 031 return sortedResultColumns; 032 } 033 034 public TResultColumnList() 035 { 036 } 037 038 039 public void removeResultColumn(int index){ 040 this.removeItem(index); 041 } 042 043 public TParseTreeNode removeItem(int index){ 044 TSourceToken st=null ; 045 if ((index<0)||(index>size())) return null; 046 047 if (TParseTreeNode.doubleLinkedTokenListToString){ 048 // getResultColumn(index).removeTokens(); 049 050 }else { 051 if (size() > 1){ 052 if (index != size() - 1){ 053 st = getResultColumn(index).getEndToken().searchToken(",",1); 054 }else{ 055 st = getResultColumn(index).getStartToken().searchToken(",",-1); 056 } 057 } 058 getResultColumn(index).removeAllMyTokensFromTokenList(st); 059 } 060 061 062 return super.removeItem(index); 063 } 064 065 /** 066 * Used to add a result column manually when re-construct a select list 067 * There must exist at least one column in column list in order to this function. 068 * @param ptext 069 */ 070 public void addResultColumn(String ptext){ 071 if (size() == 0) return; 072 073 TResultColumn column = new TResultColumn(); 074 column.setGsqlparser(this.getGsqlparser()); 075 column.setString(","+ptext); 076 077 TResultColumn last_column = getResultColumn(size()-1); 078 TSourceToken last_token = last_column.getEndToken(); 079 080 column.addAllMyTokensToTokenList(last_token.container, last_token.posinlist + 1); 081 082 for(int i=0;i<last_token.getNodesEndWithThisToken().size();i++){ 083 TParseTreeNode node = last_token.getNodesEndWithThisToken().get(i); 084 if (!(node instanceof TResultColumn)){ 085 // change all end token of parse tree node except the last result column 086 node.setEndToken(column.getEndToken()); 087 } 088 } 089 090 } 091 092 /** 093 * Add a ResultColumn to the list 094 * 095 * @param resultColumn The ResultColumn to add to the list 096 */ 097 098 public void addResultColumn(TResultColumn resultColumn) 099 { 100 /* Vectors are 0-based, ResultColumns are 1-based */ 101 // resultColumn.setVirtualColumnId(size() + 1); 102 addElement(resultColumn); 103 } 104 105 /** 106 * Get a ResultColumn from a column position (0-based) in the list 107 * 108 * @param position The ResultColumn to get from the list (1-based) 109 * 110 * @return the column at that position. 111 */ 112 113 public TResultColumn getResultColumn(int position) 114 { 115 if (position < size()) 116 { 117 return (TResultColumn)elementAt(position); 118 }else{ 119 return null; 120 } 121 } 122 123 void addParseTreeNode(Object arg1){ 124 addResultColumn((TResultColumn)arg1); 125 } 126 127 128 /** 129 * In teradata, the whole result column can be null, so this result column 130 * should be ingored when get start token in result column list. 131 * @return 132 */ 133 public TSourceToken getStartToken() { 134 TSourceToken ret = null; 135 for(int i=0;i<this.size();i++){ 136 ret = this.getResultColumn(i).getStartToken(); 137 if (ret != null){ 138 break; 139 }; 140 } 141 return ret; 142 } 143 144 public TSourceToken getEndToken() { 145 TSourceToken ret = null; 146 for(int i = this.size() -1; i >= 0; i--){ 147 ret = this.getResultColumn(i).getEndToken(); 148 if (ret != null){ 149 break; 150 }; 151 } 152 return ret; 153 } 154 155 public void doParse(TCustomSqlStatement psql, ESqlClause plocation){ 156 for(int i=0;i<size();i++){ 157 getResultColumn(i).doParse(psql,plocation); 158 } 159 } 160 161 public void accept(TParseTreeVisitor v){ 162 v.preVisit(this); 163 v.postVisit(this); 164 } 165// 166 public void acceptChildren(TParseTreeVisitor v){ 167 v.preVisit(this); 168 for(int i=0;i<this.size();i++){ 169 this.getResultColumn(i).acceptChildren(v); 170 } 171 v.postVisit(this); 172 } 173 174}