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