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                // An explicit alias names the generated column outright:
030                // IN ('direct' AS Store) produces a column called Store, not 'direct'.
031                // Oracle, Snowflake, BigQuery and Teradata all behave this way.
032                // Kept verbatim, quote state included, to match
033                // PivotNamespace.inListItemAlias - the name published here and the
034                // name resolver2 lets the column be resolved by must agree.
035                TObjectName itemAlias = (resultColumn.getAliasClause() == null)
036                        ? null : resultColumn.getAliasClause().getAliasName();
037                if (itemAlias != null && itemAlias.toString().length() > 0){
038                    TObjectName newObject = TObjectName.createObjectName (this.dbvendor, EDbObjectType.column, new TSourceToken(itemAlias.toString()));
039                    table.getLinkedColumns().addObjectName(newObject);
040                    newObject.setSourceTable(table);
041                }else if (resultColumn.getExpr().getExpressionType() == EExpressionType.simple_object_name_t){
042                    table.getLinkedColumns().addObjectName(resultColumn.getExpr().getObjectOperand());
043                    resultColumn.getExpr().getObjectOperand().setSourceTable(table);
044                }else if (resultColumn.getExpr().getExpressionType() == EExpressionType.simple_constant_t){
045                    TObjectName newObject= TObjectName.createObjectName (this.dbvendor, EDbObjectType.column,  resultColumn.getExpr().getConstantOperand().getValueToken() );
046                    table.getLinkedColumns().addObjectName(newObject);
047                    newObject.setSourceTable(table);
048                }
049            }
050
051            if (sqlTable != null){
052                for(TResultColumn resultColumn:items){
053                    sqlTable.addColumn(resultColumn.getDisplayName());
054                }
055            }
056        }else if (subQuery != null){
057            for(TResultColumn resultColumn:subQuery.getResultColumnList()){
058                TObjectName pivotColumn = TObjectName.createObjectName (this.dbvendor, EDbObjectType.column,new TSourceToken(resultColumn.getDisplayName()));
059                table.getLinkedColumns().addObjectName(pivotColumn);
060                pivotColumn.setSourceTable(table);
061                pivotColumn.setSourceColumn(resultColumn);
062                if (sqlTable != null){
063                    sqlTable.addColumn(pivotColumn.toString());
064                }
065            }
066        }
067    }
068
069    public TResultColumnList getItems() {
070        return items;
071    }
072
073    public void init(Object arg1){
074        if (arg1 instanceof TResultColumnList){
075            items = (TResultColumnList)arg1;
076        }else if (arg1 instanceof TSelectSqlNode){
077            selectSqlNode = (TSelectSqlNode)arg1;
078        }else{
079            valueList = (ArrayList<TExpressionList>)arg1;
080        }
081
082    }
083
084    public void doParse(TCustomSqlStatement psql, ESqlClause plocation){
085        if (selectSqlNode != null){
086            subQuery = new TSelectSqlStatement(psql.dbvendor);
087            subQuery.rootNode = selectSqlNode;
088            subQuery.setLocation(ESqlClause.pivot_in);
089            subQuery.doParseStatement(psql);
090        }
091    }
092
093    public void accept(TParseTreeVisitor v){
094        v.preVisit(this);
095        v.postVisit(this);
096    }
097
098    public void acceptChildren(TParseTreeVisitor v) {
099        v.preVisit(this);
100        if (items != null) items.accept(v);
101        if (subQuery != null) subQuery.accept(v);
102        v.postVisit(this);
103    }
104
105    public void setItems(TResultColumnList items) {
106        this.items = items;
107    }
108
109    public void setSubQuery(TSelectSqlStatement subQuery) {
110        this.subQuery = subQuery;
111    }
112}