001
002package gudusoft.gsqlparser.dlineage.dataflow.model;
003
004import gudusoft.gsqlparser.EDbVendor;
005import gudusoft.gsqlparser.TCustomSqlStatement;
006import gudusoft.gsqlparser.TSourceToken;
007import gudusoft.gsqlparser.dlineage.util.DlineageUtil;
008import gudusoft.gsqlparser.dlineage.util.Pair3;
009import gudusoft.gsqlparser.nodes.TParseTreeNode;
010import gudusoft.gsqlparser.sqlenv.TSQLEnv;
011import gudusoft.gsqlparser.util.Logger;
012import gudusoft.gsqlparser.util.LoggerFactory;
013import gudusoft.gsqlparser.util.SQLUtil;
014
015import java.io.ByteArrayInputStream;
016import java.io.IOException;
017import java.util.*;
018import java.util.concurrent.atomic.AtomicInteger;
019
020public class ResultSet {
021    private static final Logger logger = LoggerFactory.getLogger(ResultSet.class);
022    private long id;
023    protected String server;
024    protected String schema;
025    protected String database;
026    private Pair3<Long, Long, String> startPosition;
027    private Pair3<Long, Long, String> endPosition;
028    private List<ResultColumn> columns = new ArrayList<ResultColumn>();
029
030    private TParseTreeNode gspObject;
031    private boolean isTarget;
032    private boolean isDetermined;
033
034    private ResultSetRelationRows relationRows = new ResultSetRelationRows(this);
035
036    private Map<String, AtomicInteger> aliasMap = new HashMap<>();
037    
038    public ResultSet(TParseTreeNode gspObject, boolean isTarget) {
039        if (gspObject == null) {
040            throw new IllegalArgumentException("ResultSet arguments can't be null.");
041        }
042
043        id = ++ModelBindingManager.get().TABLE_COLUMN_ID;
044
045        this.gspObject = gspObject;
046        this.isTarget = isTarget;
047
048        TSourceToken startToken = gspObject.getStartToken();
049        TSourceToken endToken = gspObject.getEndToken();
050        if (startToken != null) {
051            this.startPosition = new Pair3<Long, Long, String>(startToken.lineNo,
052                    startToken.columnNo, ModelBindingManager.getGlobalHash());
053        }
054        
055        if (endToken != null) {
056            this.endPosition = new Pair3<Long, Long, String>(endToken.lineNo,
057                    endToken.columnNo + SQLUtil.endTrim(endToken.astext).length(), ModelBindingManager.getGlobalHash());
058        }
059        
060        this.schema = ModelBindingManager.getGlobalSchema();
061        this.database = ModelBindingManager.getGlobalDatabase();
062
063        EDbVendor vendor = ModelBindingManager.getGlobalOption().getVendor();
064        boolean supportCatalog = TSQLEnv.supportCatalog(vendor);
065        boolean supportSchema = TSQLEnv.supportSchema(vendor);
066        
067        fillSchemaInfo();
068        
069        if (!supportCatalog) {
070            this.database = null;
071        } else if (this.database == null && !TSQLEnv.DEFAULT_DB_NAME.equals(getDefaultDatabase())) {
072            this.database = getDefaultDatabase();
073        }
074
075        if (!supportSchema) {
076            this.schema = null;
077        } else if (this.schema == null && !TSQLEnv.DEFAULT_SCHEMA_NAME.equals(getDefaultSchema())) {
078            this.schema = getDefaultSchema();
079        }
080
081        if (this.server == null && !TSQLEnv.DEFAULT_SERVER_NAME.equals(getDefaultServer())) {
082            this.server = getDefaultServer();
083        }
084    }
085
086    private void fillSchemaInfo() {
087                TCustomSqlStatement stmt = DlineageUtil.getTopStmt(ModelBindingManager.getGlobalStmtStack().peek());
088                String sqlComment = null;
089                try {
090                        sqlComment = stmt.getCommentBeforeNode();
091                } catch (Exception e) {
092                }
093                if (!SQLUtil.isEmpty(sqlComment) && (sqlComment.indexOf("db") != -1 || sqlComment.indexOf("schema") != -1)) {
094                        Properties properties = new Properties();
095                        try {
096                                properties.load(
097                                                new ByteArrayInputStream(sqlComment.replace("--", "").trim().replace(",", "\n").getBytes()));
098                                if (SQLUtil.isEmpty(this.server) && properties.containsKey("db-instance")) {
099                                        this.server = properties.getProperty("db-instance");
100                                }
101                                if (SQLUtil.isEmpty(this.database) && properties.containsKey("db")) {
102                                        this.database = properties.getProperty("db");
103                                        if(this.database.indexOf(".")!=-1) {
104                                                String delimitedChar = TSQLEnv.delimitedChar(ModelBindingManager.getGlobalOption().getVendor());
105                                                this.database = delimitedChar + SQLUtil.trimColumnStringQuote(this.database) + delimitedChar;
106                                        }
107                                }
108                                if (SQLUtil.isEmpty(this.schema) && properties.containsKey("schema")) {
109                                        this.schema = properties.getProperty("schema");
110                                        if(this.schema.indexOf(".")!=-1) {
111                                                String delimitedChar = TSQLEnv.delimitedChar(ModelBindingManager.getGlobalOption().getVendor());
112                                                this.schema = delimitedChar + SQLUtil.trimColumnStringQuote(this.schema) + delimitedChar;
113                                        }
114                                }
115                        } catch (IOException e) {
116                logger.error("load sql comment properties failed.", e);
117                        }
118                }
119        }
120    
121    protected String getDefaultServer() {
122        String defaultServer = null;
123        if (ModelBindingManager.getGlobalSQLEnv() != null) {
124            defaultServer = ModelBindingManager.getGlobalSQLEnv().getDefaultServerName();
125        }
126        if (!SQLUtil.isEmpty(defaultServer))
127            return defaultServer;
128        return TSQLEnv.DEFAULT_SERVER_NAME;
129    }
130
131    protected String getDefaultSchema() {
132        String defaultSchema = null;
133        if (ModelBindingManager.getGlobalSQLEnv() != null) {
134            defaultSchema = ModelBindingManager.getGlobalSQLEnv().getDefaultSchemaName();
135        }
136        if (!SQLUtil.isEmpty(defaultSchema))
137            return defaultSchema;
138        return TSQLEnv.DEFAULT_SCHEMA_NAME;
139    }
140
141    protected String getDefaultDatabase() {
142        String defaultDatabase = null;
143        if (ModelBindingManager.getGlobalSQLEnv() != null) {
144            defaultDatabase = ModelBindingManager.getGlobalSQLEnv().getDefaultCatalogName();
145        }
146        if (!SQLUtil.isEmpty(defaultDatabase))
147            return defaultDatabase;
148        return TSQLEnv.DEFAULT_DB_NAME;
149    }
150
151    public Pair3<Long, Long, String> getStartPosition() {
152        return startPosition;
153    }
154
155    public Pair3<Long, Long, String> getEndPosition() {
156        return endPosition;
157    }
158
159    public List<ResultColumn> getColumns() {
160        return columns;
161    }
162
163    public void addColumn(ResultColumn column) {
164        if (column != null && !columns.contains(column)) {
165            this.columns.add(column);
166        }
167    }
168
169    public TParseTreeNode getGspObject() {
170        return gspObject;
171    }
172
173    public long getId() {
174        return id;
175    }
176
177    public boolean isTarget() {
178        return isTarget;
179    }
180
181        public String getSchema() {
182                return schema;
183        }
184
185        public String getDatabase() {
186                return database;
187        }
188        
189        public ResultSetRelationRows getRelationRows(){
190                return relationRows;
191        }
192
193    public String getServer() {
194        return server;
195    }
196
197        public boolean isDetermined() {
198                return isDetermined;
199        }
200
201        public void setDetermined(boolean isDetermined) {
202                this.isDetermined = isDetermined;
203        }
204
205        public void setTarget(boolean isTarget) {
206                this.isTarget = isTarget;
207        }
208
209    Map<String, AtomicInteger> getAliasMap() {
210        return aliasMap;
211    }
212}