001 002package gudusoft.gsqlparser.dlineage.dataflow.model; 003 004import gudusoft.gsqlparser.EDbVendor; 005import gudusoft.gsqlparser.TCustomSqlStatement; 006import gudusoft.gsqlparser.TSourceToken; 007import gudusoft.gsqlparser.dlineage.util.DlineageUtil; 008import gudusoft.gsqlparser.dlineage.util.Pair3; 009import gudusoft.gsqlparser.nodes.TParseTreeNode; 010import gudusoft.gsqlparser.sqlenv.TSQLEnv; 011import gudusoft.gsqlparser.util.Logger; 012import gudusoft.gsqlparser.util.LoggerFactory; 013import gudusoft.gsqlparser.util.SQLUtil; 014 015import java.io.ByteArrayInputStream; 016import java.io.IOException; 017import java.util.*; 018import java.util.concurrent.atomic.AtomicInteger; 019 020public class ResultSet { 021 private static final Logger logger = LoggerFactory.getLogger(ResultSet.class); 022 private long id; 023 protected String server; 024 protected String schema; 025 protected String database; 026 private Pair3<Long, Long, String> startPosition; 027 private Pair3<Long, Long, String> endPosition; 028 private List<ResultColumn> columns = new ArrayList<ResultColumn>(); 029 030 private TParseTreeNode gspObject; 031 private boolean isTarget; 032 private boolean isDetermined; 033 034 private ResultSetRelationRows relationRows = new ResultSetRelationRows(this); 035 036 private Map<String, AtomicInteger> aliasMap = new HashMap<>(); 037 038 public ResultSet(TParseTreeNode gspObject, boolean isTarget) { 039 if (gspObject == null) { 040 throw new IllegalArgumentException("ResultSet arguments can't be null."); 041 } 042 043 id = ++ModelBindingManager.get().TABLE_COLUMN_ID; 044 045 this.gspObject = gspObject; 046 this.isTarget = isTarget; 047 048 TSourceToken startToken = gspObject.getStartToken(); 049 TSourceToken endToken = gspObject.getEndToken(); 050 if (startToken != null) { 051 this.startPosition = new Pair3<Long, Long, String>(startToken.lineNo, 052 startToken.columnNo, ModelBindingManager.getGlobalHash()); 053 } 054 055 if (endToken != null) { 056 this.endPosition = new Pair3<Long, Long, String>(endToken.lineNo, 057 endToken.columnNo + SQLUtil.endTrim(endToken.astext).length(), ModelBindingManager.getGlobalHash()); 058 } 059 060 this.schema = ModelBindingManager.getGlobalSchema(); 061 this.database = ModelBindingManager.getGlobalDatabase(); 062 063 EDbVendor vendor = ModelBindingManager.getGlobalOption().getVendor(); 064 boolean supportCatalog = TSQLEnv.supportCatalog(vendor); 065 boolean supportSchema = TSQLEnv.supportSchema(vendor); 066 067 fillSchemaInfo(); 068 069 if (!supportCatalog) { 070 this.database = null; 071 } else if (this.database == null && !TSQLEnv.DEFAULT_DB_NAME.equals(getDefaultDatabase())) { 072 this.database = getDefaultDatabase(); 073 } 074 075 if (!supportSchema) { 076 this.schema = null; 077 } else if (this.schema == null && !TSQLEnv.DEFAULT_SCHEMA_NAME.equals(getDefaultSchema())) { 078 this.schema = getDefaultSchema(); 079 } 080 081 if (this.server == null && !TSQLEnv.DEFAULT_SERVER_NAME.equals(getDefaultServer())) { 082 this.server = getDefaultServer(); 083 } 084 } 085 086 private void fillSchemaInfo() { 087 TCustomSqlStatement stmt = DlineageUtil.getTopStmt(ModelBindingManager.getGlobalStmtStack().peek()); 088 String sqlComment = null; 089 try { 090 sqlComment = stmt.getCommentBeforeNode(); 091 } catch (Exception e) { 092 } 093 if (!SQLUtil.isEmpty(sqlComment) && (sqlComment.indexOf("db") != -1 || sqlComment.indexOf("schema") != -1)) { 094 Properties properties = new Properties(); 095 try { 096 properties.load( 097 new ByteArrayInputStream(sqlComment.replace("--", "").trim().replace(",", "\n").getBytes())); 098 if (SQLUtil.isEmpty(this.server) && properties.containsKey("db-instance")) { 099 this.server = properties.getProperty("db-instance"); 100 } 101 if (SQLUtil.isEmpty(this.database) && properties.containsKey("db")) { 102 this.database = properties.getProperty("db"); 103 if(this.database.indexOf(".")!=-1) { 104 String delimitedChar = TSQLEnv.delimitedChar(ModelBindingManager.getGlobalOption().getVendor()); 105 this.database = delimitedChar + SQLUtil.trimColumnStringQuote(this.database) + delimitedChar; 106 } 107 } 108 if (SQLUtil.isEmpty(this.schema) && properties.containsKey("schema")) { 109 this.schema = properties.getProperty("schema"); 110 if(this.schema.indexOf(".")!=-1) { 111 String delimitedChar = TSQLEnv.delimitedChar(ModelBindingManager.getGlobalOption().getVendor()); 112 this.schema = delimitedChar + SQLUtil.trimColumnStringQuote(this.schema) + delimitedChar; 113 } 114 } 115 } catch (IOException e) { 116 logger.error("load sql comment properties failed.", e); 117 } 118 } 119 } 120 121 protected String getDefaultServer() { 122 String defaultServer = null; 123 if (ModelBindingManager.getGlobalSQLEnv() != null) { 124 defaultServer = ModelBindingManager.getGlobalSQLEnv().getDefaultServerName(); 125 } 126 if (!SQLUtil.isEmpty(defaultServer)) 127 return defaultServer; 128 return TSQLEnv.DEFAULT_SERVER_NAME; 129 } 130 131 protected String getDefaultSchema() { 132 String defaultSchema = null; 133 if (ModelBindingManager.getGlobalSQLEnv() != null) { 134 defaultSchema = ModelBindingManager.getGlobalSQLEnv().getDefaultSchemaName(); 135 } 136 if (!SQLUtil.isEmpty(defaultSchema)) 137 return defaultSchema; 138 return TSQLEnv.DEFAULT_SCHEMA_NAME; 139 } 140 141 protected String getDefaultDatabase() { 142 String defaultDatabase = null; 143 if (ModelBindingManager.getGlobalSQLEnv() != null) { 144 defaultDatabase = ModelBindingManager.getGlobalSQLEnv().getDefaultCatalogName(); 145 } 146 if (!SQLUtil.isEmpty(defaultDatabase)) 147 return defaultDatabase; 148 return TSQLEnv.DEFAULT_DB_NAME; 149 } 150 151 public Pair3<Long, Long, String> getStartPosition() { 152 return startPosition; 153 } 154 155 public Pair3<Long, Long, String> getEndPosition() { 156 return endPosition; 157 } 158 159 public List<ResultColumn> getColumns() { 160 return columns; 161 } 162 163 public void addColumn(ResultColumn column) { 164 if (column != null && !columns.contains(column)) { 165 this.columns.add(column); 166 } 167 } 168 169 public TParseTreeNode getGspObject() { 170 return gspObject; 171 } 172 173 public long getId() { 174 return id; 175 } 176 177 public boolean isTarget() { 178 return isTarget; 179 } 180 181 public String getSchema() { 182 return schema; 183 } 184 185 public String getDatabase() { 186 return database; 187 } 188 189 public ResultSetRelationRows getRelationRows(){ 190 return relationRows; 191 } 192 193 public String getServer() { 194 return server; 195 } 196 197 public boolean isDetermined() { 198 return isDetermined; 199 } 200 201 public void setDetermined(boolean isDetermined) { 202 this.isDetermined = isDetermined; 203 } 204 205 public void setTarget(boolean isTarget) { 206 this.isTarget = isTarget; 207 } 208 209 Map<String, AtomicInteger> getAliasMap() { 210 return aliasMap; 211 } 212}