001package gudusoft.gsqlparser.sqlenv.parser.grabit;
002
003import gudusoft.gsqlparser.EDbVendor;
004import gudusoft.gsqlparser.sqlenv.ESQLDataObjectType;
005import gudusoft.gsqlparser.sqlenv.IdentifierProfile;
006import gudusoft.gsqlparser.sqlenv.TSQLEnv;
007import gudusoft.gsqlparser.sqlenv.TSQLSchema;
008import gudusoft.gsqlparser.sqlenv.TSQLTable;
009import gudusoft.gsqlparser.util.SQLUtil;
010
011import java.util.List;
012import java.util.Map;
013
014@SuppressWarnings("rawtypes")
015public class GrabitSQLEnv extends TSQLEnv {
016
017        private Map jsonContent;
018
019        private Boolean init = false;
020
021        public GrabitSQLEnv(String defaultServer, String defaultDatabase, String defaultSchema, EDbVendor dbVendor, Map jsonContent) {
022                this(defaultServer, defaultDatabase, defaultSchema, dbVendor, jsonContent, null);
023        }
024
025        /**
026         * Same input, analyzed under an explicit identifier configuration.
027         *
028         * <p>The metadata this environment registers is indexed with {@code identifierProfile}, so the
029         * analysis that reads it back asks the catalog the same question it was filled with. A profile
030         * belonging to another vendor is not applied ({@link IdentifierProfile#forVendorOr}); null means
031         * the vendor default.
032         */
033        public GrabitSQLEnv(String defaultServer, String defaultDatabase, String defaultSchema, EDbVendor dbVendor, Map jsonContent, IdentifierProfile identifierProfile) {
034                super(dbVendor, IdentifierProfile.forVendorOr(identifierProfile, dbVendor));
035                if(!SQLUtil.isEmpty(defaultServer) && !defaultServer.equals(TSQLEnv.DEFAULT_SERVER_NAME)) {
036                        setDefaultServerName(defaultServer);
037                }
038                if(!SQLUtil.isEmpty(defaultDatabase) && !defaultDatabase.equals(TSQLEnv.DEFAULT_DB_NAME)) {
039                        setDefaultCatalogName(defaultDatabase);
040                }
041                if(!SQLUtil.isEmpty(defaultSchema) && !defaultSchema.equals(TSQLEnv.DEFAULT_SCHEMA_NAME)) {
042                        setDefaultSchemaName(defaultSchema);
043                }
044                this.jsonContent = jsonContent;
045                initSQLEnv();
046        }
047
048        @Override
049        public void initSQLEnv() {
050                synchronized (init) {
051                        if (jsonContent == null || init)
052                                return;
053                        if(jsonContent.containsKey("databaseModel")){
054                                jsonContent = (Map)jsonContent.get("databaseModel");
055                        }
056                        List databases = (List) jsonContent.get("databases");
057                        if (databases != null) {
058                                for (int i = 0; i < databases.size(); i++) {
059                                        Map jsonDatabase = (Map) databases.get(i);
060                                        String databaseName = (String) jsonDatabase.get("name");
061                                        if(databaseName.indexOf(".")!=-1) {
062                                                databaseName = SQLUtil.quoteDottedName(this.getDBVendor(), ESQLDataObjectType.dotCatalog, databaseName);
063                                        }
064                                        List tables = (List) jsonDatabase.get("tables");
065                                        for (int j = 0; j < tables.size(); j++) {
066                                                Map jsonTable = (Map) tables.get(j);
067                                                String schemeName = (String) jsonTable.get("schema");
068                                                if(schemeName.indexOf(".")!=-1) {
069                                                        schemeName = SQLUtil.quoteDottedName(this.getDBVendor(), ESQLDataObjectType.dotSchema, schemeName);
070                                                }
071                                                String tableName = (String) jsonTable.get("name");
072                                                if(tableName.indexOf(".")!=-1) {
073                                                        tableName = SQLUtil.quoteDottedName(this.getDBVendor(), ESQLDataObjectType.dotTable, tableName);
074                                                }
075                                                TSQLSchema sqlSchema = getSQLSchema(databaseName + "." + schemeName, true);
076                                                TSQLTable sqlTable = sqlSchema.createTable(tableName, 3);
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                                jsonContent = null;
089                                init = true;
090                        }
091                }
092        }
093
094}