001 002package gudusoft.gsqlparser.dlineage.dataflow.model; 003 004import gudusoft.gsqlparser.TCustomSqlStatement; 005import gudusoft.gsqlparser.TSourceToken; 006import gudusoft.gsqlparser.dlineage.util.Pair3; 007import gudusoft.gsqlparser.nodes.TCTE; 008import gudusoft.gsqlparser.nodes.TTable; 009import gudusoft.gsqlparser.stmt.TMergeSqlStatement; 010import gudusoft.gsqlparser.util.SQLUtil; 011 012public class QueryTable extends ResultSet { 013 014 private String alias; 015 private Pair3<Long, Long, String> startPosition; 016 private Pair3<Long, Long, String> endPosition; 017 018 private TTable tableObject; 019 020 public QueryTable(TMergeSqlStatement mergeStmt) { 021 super(mergeStmt, false); 022 this.tableObject = mergeStmt.getUsingTable(); 023 024 TSourceToken startToken = tableObject.getStartToken(); 025 TSourceToken endToken = tableObject.getEndToken(); 026 027 if (tableObject.getAliasClause() != null) { 028 startToken = tableObject.getAliasClause().getStartToken(); 029 endToken = tableObject.getAliasClause().getEndToken(); 030 } 031 032 this.startPosition = new Pair3<Long, Long, String>(startToken.lineNo, startToken.columnNo, 033 ModelBindingManager.getGlobalHash()); 034 this.endPosition = new Pair3<Long, Long, String>(endToken.lineNo, 035 endToken.columnNo + SQLUtil.endTrim(endToken.getAstext()).length(), ModelBindingManager.getGlobalHash()); 036 037 if (tableObject.getAliasClause() != null) { 038 this.alias = tableObject.getAliasName(); 039 } 040 } 041 042 public QueryTable(TTable tableObject) { 043 super(tableObject.getCTE() != null ? getCTEQuery(tableObject.getCTE()) 044 : (tableObject.getTableExpr() != null ? tableObject.getTableExpr().getSubQuery() 045 : tableObject.getOutputMerge() != null ? tableObject.getOutputMerge() 046 : tableObject.getSubquery() != null ? tableObject.getSubquery() 047 : tableObject.getValueClause() != null ? tableObject.getValueClause(): tableObject), 048 false); 049 050 this.tableObject = tableObject; 051 052 TSourceToken startToken = tableObject.getStartToken(); 053 TSourceToken endToken = tableObject.getEndToken(); 054 055 if (tableObject.getAliasClause() != null) { 056 startToken = tableObject.getAliasClause().getStartToken(); 057 endToken = tableObject.getAliasClause().getEndToken(); 058 } 059 060 this.startPosition = new Pair3<Long, Long, String>(startToken.lineNo, 061 startToken.columnNo, ModelBindingManager.getGlobalHash()); 062 this.endPosition = new Pair3<Long, Long, String>(endToken.lineNo, 063 endToken.columnNo + SQLUtil.endTrim(endToken.getAstext()).length(), ModelBindingManager.getGlobalHash()); 064 065 if (tableObject.getAliasClause() != null) { 066 this.alias = tableObject.getAliasName(); 067 } 068 } 069 070 private static TCustomSqlStatement getCTEQuery(TCTE cte) { 071 if (cte.getSubquery() != null) 072 return cte.getSubquery(); 073 else if (cte.getUpdateStmt() != null) { 074 return cte.getUpdateStmt(); 075 } else if (cte.getInsertStmt() != null) { 076 return cte.getInsertStmt(); 077 } else if (cte.getDeleteStmt() != null) { 078 return cte.getDeleteStmt(); 079 } else if (cte.getDescribeStmt() != null) { 080 // Databricks: DESCRIBE HISTORY as a CTE body (Mantis 4641). The 081 // result set is engine-generated metadata, so there is no query to 082 // trace columns through; the describe statement itself anchors the 083 // model instead of crashing ResultSet with a null argument. 084 return cte.getDescribeStmt(); 085 } else 086 return null; 087 } 088 089 public String getAlias() { 090 return alias; 091 } 092 093 public Pair3<Long, Long, String> getStartPosition() { 094 return startPosition; 095 } 096 097 public Pair3<Long, Long, String> getEndPosition() { 098 return endPosition; 099 } 100 101 public TTable getTableObject() { 102 return tableObject; 103 } 104 105}