001package gudusoft.gsqlparser.sqlenv.parser.sqldep; 002 003import gudusoft.gsqlparser.EDbVendor; 004import gudusoft.gsqlparser.dlineage.util.DlineageUtil; 005import gudusoft.gsqlparser.util.SQLUtil; 006import gudusoft.gsqlparser.util.json.JSON; 007import gudusoft.gsqlparser.sqlenv.IdentifierProfile; 008import gudusoft.gsqlparser.sqlenv.TSQLEnv; 009import gudusoft.gsqlparser.sqlenv.TSQLSchema; 010import gudusoft.gsqlparser.sqlenv.TSQLTable; 011 012import java.util.List; 013import java.util.Map; 014import java.util.logging.Level; 015import java.util.logging.Logger; 016 017@SuppressWarnings("rawtypes") 018public class MultipleSQLDepSQLEnv extends TSQLEnv { 019 020 private List jsonArray; 021 022 private Boolean init = false; 023 024 public MultipleSQLDepSQLEnv(String defaultServer, String defaultDatabase, String defaultSchema, EDbVendor dbVendor, List jsonArray) { 025 this(defaultServer, defaultDatabase, defaultSchema, dbVendor, jsonArray, null); 026 } 027 028 /** 029 * Same input, analyzed under an explicit identifier configuration. 030 * 031 * <p>The metadata this environment registers is indexed with {@code identifierProfile}, so the 032 * analysis that reads it back asks the catalog the same question it was filled with. A profile 033 * belonging to another vendor is not applied ({@link IdentifierProfile#forVendorOr}); null means 034 * the vendor default. 035 */ 036 public MultipleSQLDepSQLEnv(String defaultServer, String defaultDatabase, String defaultSchema, EDbVendor dbVendor, List jsonArray, IdentifierProfile identifierProfile) { 037 super(dbVendor, IdentifierProfile.forVendorOr(identifierProfile, dbVendor)); 038 if(!SQLUtil.isEmpty(defaultServer) && !defaultServer.equals(TSQLEnv.DEFAULT_SERVER_NAME)) { 039 setDefaultServerName(defaultServer); 040 } 041 if(!SQLUtil.isEmpty(defaultDatabase) && !defaultDatabase.equals(TSQLEnv.DEFAULT_DB_NAME)) { 042 setDefaultCatalogName(defaultDatabase); 043 } 044 if(!SQLUtil.isEmpty(defaultSchema) && !defaultSchema.equals(TSQLEnv.DEFAULT_SCHEMA_NAME)) { 045 setDefaultSchemaName(defaultSchema); 046 } 047 this.jsonArray = jsonArray; 048 initSQLEnv(); 049 } 050 051 @Override 052 public void initSQLEnv() { 053 synchronized (init) { 054 if (jsonArray == null || init) 055 return; 056 057 for (int x = 0; x < jsonArray.size(); x++) { 058 String sql = ((Map) jsonArray.get(x)).get("sql").toString().trim(); 059 if (!sql.startsWith("{") && !sql.endsWith("}")) { 060 continue; 061 } 062 063 try { 064 Map jsonContent = (Map) JSON.parseObject(sql); 065 List databases = (List) jsonContent.get("databases"); 066 if (databases != null) { 067 for (int i = 0; i < databases.size(); i++) { 068 Map jsonDatabase = (Map) databases.get(i); 069 String databaseName = (String) jsonDatabase.get("name"); 070 List tables = (List) jsonDatabase.get("tables"); 071 for (int j = 0; j < tables.size(); j++) { 072 Map jsonTable = (Map) tables.get(j); 073 String schemeName = (String) jsonTable.get("schema"); 074 String tableName = (String) jsonTable.get("name"); 075 TSQLSchema sqlSchema = getSQLSchema(databaseName + "." + schemeName, true); 076 TSQLTable sqlTable = sqlSchema.createTable(DlineageUtil.getSimpleTableName(tableName)); 077 if (jsonTable.containsKey("isView")) { 078 sqlTable.setView(Boolean.parseBoolean((String) jsonTable.get("isView"))); 079 } 080 List columns = (List) jsonTable.get("columns"); 081 for (int k = 0; k < columns.size(); k++) { 082 Map jsonColumn = (Map) columns.get(k); 083 sqlTable.addColumn((String) jsonColumn.get("name")); 084 } 085 } 086 } 087 } 088 } catch (Exception e) { 089 Logger.getLogger(MultipleSQLDepSQLEnv.class.getName()).log(Level.WARNING, "Parse json failed.", e); 090 } 091 } 092 093 jsonArray = null; 094 init = true; 095 } 096 } 097 098}