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.TSQLEnv;
008import gudusoft.gsqlparser.sqlenv.TSQLSchema;
009import gudusoft.gsqlparser.sqlenv.TSQLTable;
010
011import java.util.List;
012import java.util.Map;
013import java.util.logging.Level;
014import java.util.logging.Logger;
015
016@SuppressWarnings("rawtypes")
017public class MultipleSQLDepSQLEnv extends TSQLEnv {
018
019        private List jsonArray;
020
021        private Boolean init = false;
022
023        public MultipleSQLDepSQLEnv(String defaultServer, String defaultDatabase, String defaultSchema, EDbVendor dbVendor, List jsonArray) {
024                super(dbVendor);
025                if(!SQLUtil.isEmpty(defaultServer) && !defaultServer.equals(TSQLEnv.DEFAULT_SERVER_NAME)) {
026                        setDefaultServerName(defaultServer);
027                }
028                if(!SQLUtil.isEmpty(defaultDatabase) && !defaultDatabase.equals(TSQLEnv.DEFAULT_DB_NAME)) {
029                        setDefaultCatalogName(defaultDatabase);
030                }
031                if(!SQLUtil.isEmpty(defaultSchema) && !defaultSchema.equals(TSQLEnv.DEFAULT_SCHEMA_NAME)) {
032                        setDefaultSchemaName(defaultSchema);
033                }
034                this.jsonArray = jsonArray;
035                initSQLEnv();
036        }
037
038        @Override
039        public void initSQLEnv() {
040                synchronized (init) {
041                        if (jsonArray == null || init)
042                                return;
043
044                        for (int x = 0; x < jsonArray.size(); x++) {
045                                String sql = ((Map) jsonArray.get(x)).get("sql").toString().trim();
046                                if (!sql.startsWith("{") && !sql.endsWith("}")) {
047                                        continue;
048                                }
049
050                                try {
051                                        Map jsonContent = (Map) JSON.parseObject(sql);
052                                        List databases = (List) jsonContent.get("databases");
053                                        if (databases != null) {
054                                                for (int i = 0; i < databases.size(); i++) {
055                                                        Map jsonDatabase = (Map) databases.get(i);
056                                                        String databaseName = (String) jsonDatabase.get("name");
057                                                        List tables = (List) jsonDatabase.get("tables");
058                                                        for (int j = 0; j < tables.size(); j++) {
059                                                                Map jsonTable = (Map) tables.get(j);
060                                                                String schemeName = (String) jsonTable.get("schema");
061                                                                String tableName = (String) jsonTable.get("name");
062                                                                TSQLSchema sqlSchema = getSQLSchema(databaseName + "." + schemeName, true);
063                                                                TSQLTable sqlTable = sqlSchema.createTable(DlineageUtil.getSimpleTableName(tableName));
064                                                                if (jsonTable.containsKey("isView")) {
065                                                                        sqlTable.setView(Boolean.parseBoolean((String) jsonTable.get("isView")));
066                                                                }
067                                                                List columns = (List) jsonTable.get("columns");
068                                                                for (int k = 0; k < columns.size(); k++) {
069                                                                        Map jsonColumn = (Map) columns.get(k);
070                                                                        sqlTable.addColumn((String) jsonColumn.get("name"));
071                                                                }
072                                                        }
073                                                }
074                                        }
075                                } catch (Exception e) {
076                                        Logger.getLogger(MultipleSQLDepSQLEnv.class.getName()).log(Level.WARNING, "Parse json failed.", e);
077                                }
078                        }
079
080                        jsonArray = null;
081                        init = true;
082                }
083        }
084
085}