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