001 002package gudusoft.gsqlparser.dlineage.dataflow.model; 003 004import java.util.LinkedHashSet; 005import java.util.Set; 006 007import gudusoft.gsqlparser.EDbVendor; 008import gudusoft.gsqlparser.EExpressionType; 009import gudusoft.gsqlparser.ESetOperatorType; 010import gudusoft.gsqlparser.TSourceToken; 011import gudusoft.gsqlparser.dlineage.util.DlineageUtil; 012import gudusoft.gsqlparser.dlineage.util.Pair3; 013import gudusoft.gsqlparser.nodes.TObjectName; 014import gudusoft.gsqlparser.nodes.TResultColumn; 015import gudusoft.gsqlparser.sqlenv.TSQLEnv; 016import gudusoft.gsqlparser.stmt.TSelectSqlStatement; 017import gudusoft.gsqlparser.util.SQLUtil; 018 019public class SelectSetResultColumn extends ResultColumn { 020 021 private LinkedHashSet<String> aliasSet = new LinkedHashSet<String>(); 022 023 public SelectSetResultColumn(ResultSet resultSet, 024 TResultColumn resultColumnObject, int index) { 025 super(resultSet, resultColumnObject); 026 aliasSet.clear(); 027 if (isNotSameAlias(resultSet, index)) { 028 this.name = aliasSet.iterator().next(); 029 } else { 030 if (resultColumnObject.getAliasClause() != null) { 031 this.name = resultColumnObject.getAliasClause().toString(); 032 } else if (resultColumnObject.getColumnNameOnly() != null 033 && !"".equals(resultColumnObject.getColumnNameOnly())) { 034 this.name = resultColumnObject.getColumnNameOnly(); 035 } else if (resultColumnObject.getExpr().getExpressionType() == EExpressionType.simple_constant_t) { 036 this.name = resultColumnObject.getExpr().toString(); 037 } 038 else { 039 this.name = quote(resultColumnObject.toString()); 040 } 041 } 042 043 this.fullName = this.name; 044 } 045 046 private boolean isNotSameAlias(ResultSet resultSet, int index) { 047 if (resultSet instanceof SelectSetResultSet) { 048 SelectSetResultSet selectSetResultSet = (SelectSetResultSet) resultSet; 049 if (selectSetResultSet 050 .getSetOperatorType() == ESetOperatorType.none) { 051 return false; 052 } 053 TSelectSqlStatement select = selectSetResultSet.getSelectObject(); 054 return isNotSameAlias(select, index); 055 } else if (resultSet instanceof SelectResultSet) { 056 SelectResultSet selectResultSet = (SelectResultSet) resultSet; 057 if (selectResultSet.getSelectStmt() 058 .getSetOperatorType() == ESetOperatorType.none) { 059 return false; 060 } 061 TSelectSqlStatement select = selectResultSet.getSelectStmt(); 062 return isNotSameAlias(select, index); 063 } 064 return false; 065 } 066 067 private boolean isNotSameAlias(TSelectSqlStatement select, int index) { 068 collectSelectAlias(select, index, aliasSet); 069 aliasSet.remove("*"); 070 return aliasSet.size() > 1; 071 } 072 073 private void collectSelectAlias(TSelectSqlStatement select, int index, 074 Set<String> aliasSet) { 075 if (select.getSetOperatorType() == ESetOperatorType.none) { 076 if (select.getResultColumnList() == null) { 077 return; 078 } 079 TResultColumn column = select.getResultColumnList() 080 .getResultColumn(index); 081 082 String alias = null; 083 if(column == null){ 084 return; 085 } 086 if (column.getAliasClause() != null) { 087 alias = column.getAliasClause().toString(); 088 } else if (column.getColumnNameOnly() != null && !"".equals(column.getColumnNameOnly())) { 089 alias = column.getColumnNameOnly(); 090 } else if (column.getExpr().getExpressionType() == EExpressionType.simple_constant_t) { 091 alias = column.getExpr().toString(); 092 } else { 093 alias = quote(column.toString()); 094 } 095 aliasSet.add(alias); 096 097 } else { 098 collectSelectAlias(select.getLeftStmt(), index, aliasSet); 099 collectSelectAlias(select.getRightStmt(), index, aliasSet); 100 } 101 } 102 103 private String quote(String column) { 104 EDbVendor vendor = ModelBindingManager.getGlobalVendor(); 105 String delimitedChar = TSQLEnv.delimitedChar(vendor); 106 if (!DlineageUtil.isQuote(column)){ 107 if(vendor == EDbVendor.dbvmssql || vendor == EDbVendor.dbvazuresql) { 108 return "[" + column + "]"; 109 } 110 else { 111 return delimitedChar + column + delimitedChar; 112 } 113 } 114 else return column; 115 } 116 117 public SelectSetResultColumn(ResultSet resultSet, 118 ResultColumn resultColumn) { 119 if (resultColumn == null || resultSet == null) 120 throw new IllegalArgumentException( 121 "ResultColumn arguments can't be null."); 122 123 id = ++ModelBindingManager.get().TABLE_COLUMN_ID; 124 125 this.resultSet = resultSet; 126 resultSet.addColumn(this); 127 this.setStruct(resultColumn.isStruct()); 128 129 if(resultColumn.getRefColumnName()!=null) { 130 TResultColumn resultColumnObject = (TResultColumn) resultColumn 131 .getColumnObject(); 132 TSourceToken startToken = resultColumnObject.getStartToken(); 133 TSourceToken endToken = resultColumnObject.getEndToken(); 134 this.startPosition = new Pair3<Long, Long, String>(startToken.lineNo, 135 startToken.columnNo, ModelBindingManager.getGlobalHash()); 136 this.endPosition = new Pair3<Long, Long, String>(endToken.lineNo, 137 endToken.columnNo + SQLUtil.endTrim(endToken.astext).length(), ModelBindingManager.getGlobalHash()); 138 this.columnObject = resultColumnObject; 139 this.refColumnName = resultColumn.getRefColumnName(); 140 this.name = resultColumn.getName(); 141 } 142 else if (resultColumn.getColumnObject() instanceof TResultColumn) { 143 TResultColumn resultColumnObject = (TResultColumn) resultColumn 144 .getColumnObject(); 145 if (resultColumnObject.getAliasClause() != null) { 146 this.alias = resultColumnObject.getAliasClause().toString(); 147 TSourceToken startToken = resultColumnObject.getAliasClause() 148 .getStartToken(); 149 TSourceToken endToken = resultColumnObject.getAliasClause() 150 .getEndToken(); 151 this.aliasStartPosition = new Pair3<Long, Long, String>( 152 startToken.lineNo, startToken.columnNo, ModelBindingManager.getGlobalHash()); 153 this.aliasEndPosition = new Pair3<Long, Long, String>(endToken.lineNo, 154 endToken.columnNo + SQLUtil.endTrim(endToken.astext).length(), ModelBindingManager.getGlobalHash()); 155 156 this.name = this.alias; 157 } else if (resultColumnObject.getExpr() 158 .getExpressionType() == EExpressionType.simple_object_name_t) { 159 this.name = resultColumnObject.getColumnNameOnly(); 160 } else if (resultColumnObject.getFieldAttr() != null) { 161 this.name = resultColumnObject.getColumnNameOnly(); 162 } else { 163 if (resultColumnObject.getExpr() 164 .getExpressionType() == EExpressionType.simple_constant_t) { 165 this.name = resultColumnObject.toString(); 166 } else if (resultColumnObject.getExpr() 167 .getExpressionType() == EExpressionType.function_t) { 168 this.name = resultColumnObject.getCompactString(); 169 } else if (resultColumnObject.getColumnNameOnly() != null 170 && !"".equals( 171 resultColumnObject.getColumnNameOnly())) { 172 this.name = resultColumnObject.getColumnNameOnly(); 173 } else { 174 this.name = resultColumnObject.toString(); 175 } 176 } 177 178 if (resultColumnObject.getExpr() 179 .getExpressionType() == EExpressionType.function_t) { 180 this.fullName = resultColumnObject.getExpr() 181 .getFunctionCall() 182 .getFunctionName() 183 .toString(); 184 } else { 185 this.fullName = resultColumnObject.toString(); 186 } 187 188 TSourceToken startToken = resultColumnObject.getStartToken(); 189 TSourceToken endToken = resultColumnObject.getEndToken(); 190 this.startPosition = new Pair3<Long, Long, String>(startToken.lineNo, 191 startToken.columnNo, ModelBindingManager.getGlobalHash()); 192 this.endPosition = new Pair3<Long, Long, String>(endToken.lineNo, 193 endToken.columnNo + SQLUtil.endTrim(endToken.astext).length(), ModelBindingManager.getGlobalHash()); 194 this.columnObject = resultColumnObject; 195 } else if (resultColumn.getColumnObject() instanceof TObjectName) { 196 TObjectName resultColumnObject = (TObjectName) resultColumn 197 .getColumnObject(); 198 199 if (resultColumnObject.getColumnNameOnly() != null 200 && !"".equals(resultColumnObject.getColumnNameOnly())) { 201 this.name = resultColumnObject.getColumnNameOnly(); 202 } else { 203 this.name = resultColumnObject.toString(); 204 } 205 206 this.fullName = this.name; 207 208 TSourceToken startToken = resultColumnObject.getStartToken(); 209 TSourceToken endToken = resultColumnObject.getEndToken(); 210 this.startPosition = new Pair3<Long, Long, String>(startToken.lineNo, 211 startToken.columnNo, ModelBindingManager.getGlobalHash()); 212 this.endPosition = new Pair3<Long, Long, String>(endToken.lineNo, 213 endToken.columnNo + SQLUtil.endTrim(endToken.astext).length(), ModelBindingManager.getGlobalHash()); 214 this.columnObject = resultColumnObject; 215 } else { 216 this.name = resultColumn.getName(); 217 this.fullName = this.name; 218 219 TSourceToken startToken = resultColumn.getColumnObject() 220 .getStartToken(); 221 TSourceToken endToken = resultColumn.getColumnObject() 222 .getEndToken(); 223 this.startPosition = new Pair3<Long, Long, String>(startToken.lineNo, 224 startToken.columnNo, ModelBindingManager.getGlobalHash()); 225 this.endPosition = new Pair3<Long, Long, String>(endToken.lineNo, 226 endToken.columnNo + SQLUtil.endTrim(endToken.astext).length(), ModelBindingManager.getGlobalHash()); 227 this.columnObject = resultColumn.getColumnObject(); 228 } 229 } 230 231 public Set<String> getAliasSet() { 232 return aliasSet; 233 } 234}