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}