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}