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}