001package gudusoft.gsqlparser.nodes;
002
003
004import gudusoft.gsqlparser.*;
005import gudusoft.gsqlparser.sqlenv.TSQLTable;
006import gudusoft.gsqlparser.stmt.TSelectSqlStatement;
007
008import java.util.ArrayList;
009
010public class TPivotInClause extends TParseTreeNode {
011    private TResultColumnList items;
012    private TSelectSqlNode selectSqlNode;
013    private ArrayList<TExpressionList> valueList;
014
015    public ArrayList<TExpressionList> getValueList() {
016        return valueList;
017    }
018
019    public TSelectSqlStatement getSubQuery() {
020        return subQuery;
021    }
022
023    private TSelectSqlStatement subQuery;
024
025    public void linkColumnToTable(TTable table, TSQLTable sqlTable){
026
027        if (items != null){
028            for(TResultColumn resultColumn:items){
029                if (resultColumn.getExpr().getExpressionType() == EExpressionType.simple_object_name_t){
030                    table.getLinkedColumns().addObjectName(resultColumn.getExpr().getObjectOperand());
031                    resultColumn.getExpr().getObjectOperand().setSourceTable(table);
032                }else if (resultColumn.getExpr().getExpressionType() == EExpressionType.simple_constant_t){
033                    TObjectName newObject= TObjectName.createObjectName (this.dbvendor, EDbObjectType.column,  resultColumn.getExpr().getConstantOperand().getValueToken() );
034                    table.getLinkedColumns().addObjectName(newObject);
035                    newObject.setSourceTable(table);
036                }
037            }
038
039            if (sqlTable != null){
040                for(TResultColumn resultColumn:items){
041                    sqlTable.addColumn(resultColumn.getDisplayName());
042                }
043            }
044        }else if (subQuery != null){
045            for(TResultColumn resultColumn:subQuery.getResultColumnList()){
046                TObjectName pivotColumn = TObjectName.createObjectName (this.dbvendor, EDbObjectType.column,new TSourceToken(resultColumn.getDisplayName()));
047                table.getLinkedColumns().addObjectName(pivotColumn);
048                pivotColumn.setSourceTable(table);
049                pivotColumn.setSourceColumn(resultColumn);
050                if (sqlTable != null){
051                    sqlTable.addColumn(pivotColumn.toString());
052                }
053            }
054        }
055    }
056
057    public TResultColumnList getItems() {
058        return items;
059    }
060
061    public void init(Object arg1){
062        if (arg1 instanceof TResultColumnList){
063            items = (TResultColumnList)arg1;
064        }else if (arg1 instanceof TSelectSqlNode){
065            selectSqlNode = (TSelectSqlNode)arg1;
066        }else{
067            valueList = (ArrayList<TExpressionList>)arg1;
068        }
069
070    }
071
072    public void doParse(TCustomSqlStatement psql, ESqlClause plocation){
073        if (selectSqlNode != null){
074            subQuery = new TSelectSqlStatement(psql.dbvendor);
075            subQuery.rootNode = selectSqlNode;
076            subQuery.setLocation(ESqlClause.pivot_in);
077            subQuery.doParseStatement(psql);
078        }
079    }
080
081    public void accept(TParseTreeVisitor v){
082        v.preVisit(this);
083        v.postVisit(this);
084    }
085
086    public void acceptChildren(TParseTreeVisitor v) {
087        v.preVisit(this);
088        if (items != null) items.accept(v);
089        if (subQuery != null) subQuery.accept(v);
090        v.postVisit(this);
091    }
092
093    public void setItems(TResultColumnList items) {
094        this.items = items;
095    }
096
097    public void setSubQuery(TSelectSqlStatement subQuery) {
098        this.subQuery = subQuery;
099    }
100}