001package gudusoft.gsqlparser.nodes;
002
003
004import gudusoft.gsqlparser.*;
005
006import java.util.ArrayList;
007
008public class TPivotedTable extends TParseTreeNode {
009
010    private TPivotClause pivotClause;
011    private TFromTable fromTableSource;
012    //private TAliasClause aliasClause = null;
013    private TTable tableSource;
014    private TPTNodeList <TPivotClause> pivotClauseList;
015
016    public TJoinList getJoins() {
017        return joins;
018    }
019
020    public TPTNodeList<TPivotClause> getPivotClauseList() {
021        return pivotClauseList;
022    }
023
024    private TJoinList joins;
025
026    public void setTableSource(TTable tableSource) {
027        this.tableSource = tableSource;
028    }
029
030    public TPivotClause getPivotClause() {
031        return pivotClause;
032    }
033
034    public TFromTable getFromTableSource() {
035        return fromTableSource;
036    }
037
038//    @Override
039//    public TAliasClause getAliasClause() {
040//        return aliasClause;
041//    }
042
043    public void init(Object arg1,Object arg2){
044        joins = new TJoinList();
045        pivotClauseList = new TPTNodeList <TPivotClause>() ;
046        fromTableSource = (TFromTable)arg1;
047        pivotClause = (TPivotClause)arg2;
048        pivotClauseList.addElement(pivotClause);
049    }
050
051//    public void init(Object arg1,Object arg2,Object arg3){
052//        init(arg1,arg2);
053//        aliasClause = (TAliasClause)arg3;
054//    }
055
056    public TTable getTableSource() {
057        return tableSource;
058    }
059
060    protected TJoinExpr fromSourceJoin;
061    protected TTable tmpFromSourceTable;
062    public void doParse(TCustomSqlStatement psql, ESqlClause plocation){
063        //tableSource = psql.analyzeFromTable(fromTableSource,false);
064        //pivotClauseList.addElement();
065//        if (psql instanceof TPivotedTable){
066//
067//        }
068        TJoin lcJoin = null;
069        TTable lcTable = null;
070        if (fromTableSource.getFromtableType() != ETableSource.join){
071            lcJoin = new TJoin();
072            lcTable = psql.analyzeFromTable(fromTableSource, true);
073            tableSource = lcTable;
074            lcTable.setEffectType(ETableEffectType.tetSelect);
075            lcJoin.setTable(lcTable);
076            lcJoin.setStartToken(lcJoin.getTable().getStartToken());
077            lcJoin.setEndToken(lcJoin.getTable().getEndToken());
078            lcJoin.setGsqlparser(getGsqlparser());
079            this.getRelations().add(lcTable);
080           // System.out.println("add table to reations:"+this.getRelations().get(0).toString());
081        }else{
082
083            this.fromSourceJoin = fromTableSource.getJoinExpr();
084
085            this.tmpFromSourceTable = new TTable();
086            this.tmpFromSourceTable.setTableType(ETableSource.join);
087            this.tmpFromSourceTable.setAliasClause(fromTableSource.getJoinExpr().getAliasClause());
088            this.tmpFromSourceTable.setStartToken(fromTableSource.getStartToken());
089            this.tmpFromSourceTable.setEndToken(fromTableSource.getEndToken());
090            this.tmpFromSourceTable.setGsqlparser(fromTableSource.getGsqlparser());
091            this.tmpFromSourceTable.setJoinExpr(this.fromSourceJoin);
092            this.getRelations().add(this.tmpFromSourceTable);
093
094            lcJoin = psql.analyzeJoin(fromTableSource.getJoinExpr(), null, true);
095            lcJoin.doParse(psql, ESqlClause.join);
096        }
097
098        joins.addJoin(lcJoin);
099
100//        for (int i=0;i<pivotClauseList.size();i++){
101//            TPivotClause pivotClause = pivotClauseList.getElement(i);
102//            if (pivotClause.getPivotTable() != null){
103//                pivotClause.getPivotTable().setSourceTableOfPivot(psql.getTables().getTable(0));
104//            }
105//        }
106        pivotClauseList.doParse(psql,plocation);
107
108
109//        if (aliasClause != null){
110//            aliasClause.doParse(psql,plocation);
111//        }
112    }
113
114    public void accept(TParseTreeVisitor v){
115        v.preVisit(this);
116        v.postVisit(this);
117    }
118    private ArrayList<TTable> relations = new ArrayList<>();
119
120    public ArrayList<TTable> getRelations() {
121        return relations;
122    }
123
124    public void acceptChildren(TParseTreeVisitor v){
125        v.preVisit(this);
126
127        if (TBaseType.USE_JOINEXPR_INSTEAD_OF_JOIN){
128            for(TTable table:getRelations()){
129               table.acceptChildren(v);
130            }
131        }else {
132            joins.acceptChildren(v);
133        }
134
135        pivotClauseList.acceptChildren(v);
136        v.postVisit(this);
137    }
138
139    public void setPivotClause(TPivotClause pivotClause) {
140        this.pivotClause = pivotClause;
141    }
142
143    public void setFromTableSource(TFromTable fromTableSource) {
144        this.fromTableSource = fromTableSource;
145    }
146
147    public void setPivotClauseList(TPTNodeList<TPivotClause> pivotClauseList) {
148        this.pivotClauseList = pivotClauseList;
149    }
150
151    public void setJoins(TJoinList joins) {
152        this.joins = joins;
153    }
154}