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}