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}