001package gudusoft.gsqlparser.dlineage.util;
002
003import java.io.File;
004import java.util.ArrayList;
005import java.util.Arrays;
006import java.util.LinkedHashSet;
007import java.util.List;
008import java.util.Map;
009
010import gudusoft.gsqlparser.EDbVendor;
011import gudusoft.gsqlparser.EParameterMode;
012import gudusoft.gsqlparser.TCustomSqlStatement;
013import gudusoft.gsqlparser.dlineage.dataflow.model.AnalyzeMode;
014import gudusoft.gsqlparser.dlineage.dataflow.model.ModelBindingManager;
015import gudusoft.gsqlparser.dlineage.dataflow.model.SqlInfo;
016import gudusoft.gsqlparser.dlineage.dataflow.model.SubType;
017import gudusoft.gsqlparser.dlineage.dataflow.model.Table;
018import gudusoft.gsqlparser.dlineage.dataflow.model.xml.*;
019import gudusoft.gsqlparser.nodes.TFunctionCall;
020import gudusoft.gsqlparser.nodes.TObjectName;
021import gudusoft.gsqlparser.nodes.TParameterDeclaration;
022import gudusoft.gsqlparser.nodes.TParameterDeclarationList;
023import gudusoft.gsqlparser.sqlenv.ESQLDataObjectType;
024import gudusoft.gsqlparser.sqlenv.TSQLEnv;
025import gudusoft.gsqlparser.stmt.TCommonBlock;
026import gudusoft.gsqlparser.stmt.TSelectSqlStatement;
027import gudusoft.gsqlparser.stmt.TStoredProcedureSqlStatement;
028import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreatePackage;
029import gudusoft.gsqlparser.stmt.teradata.TTeradataCreateProcedure;
030import gudusoft.gsqlparser.util.SQLUtil;
031import gudusoft.gsqlparser.util.functionChecker;
032import gudusoft.gsqlparser.util.keywordChecker;
033import gudusoft.gsqlparser.util.json.JSON;
034
035public class DlineageUtil {
036
037    public static boolean compareIdentifier(String source, String target, ESQLDataObjectType sqlDataObjectType) {
038        return SQLUtil.compareIdentifier(ModelBindingManager.getGlobalVendor(), sqlDataObjectType, source, target);
039    }
040
041    public static boolean compareColumnIdentifier(String source, String target) {
042        return SQLUtil.compareIdentifier(ModelBindingManager.getGlobalVendor(), ESQLDataObjectType.dotColumn, source,
043                target);
044    }
045
046    public static boolean compareTableIdentifier(String source, String target) {
047        return SQLUtil.compareIdentifier(ModelBindingManager.getGlobalVendor(), ESQLDataObjectType.dotTable, source,
048                target);
049    }
050
051        public static String getIdentifierNormalColumnName(String name) {
052                EDbVendor dbVendor = ModelBindingManager.getGlobalVendor();
053                return SQLUtil.getIdentifierNormalName(dbVendor, name, ESQLDataObjectType.dotColumn);
054        }
055
056        public static String getIdentifierNormalColumnName(String name, EDbVendor dbVendor) {
057                return SQLUtil.getIdentifierNormalName(dbVendor, name, ESQLDataObjectType.dotColumn);
058        }
059
060    public static String normalizeColumnName(String name) {
061        return SQLUtil.normalizeIdentifier(ModelBindingManager.getGlobalVendor(),  ESQLDataObjectType.dotColumn, name);
062    }
063    
064    public static String normalizeColumnName(String name, EDbVendor dbVendor) {
065        return SQLUtil.normalizeIdentifier(dbVendor,  ESQLDataObjectType.dotColumn, name);
066    }
067
068    
069    public static String getIdentifierNormalTableName(String name) {
070                if (ModelBindingManager.get() != null && ModelBindingManager.get().isDblinkTable(name)) {
071                        int index = name.lastIndexOf("@");
072                        if (index > 0) {
073                                return SQLUtil.getIdentifierNormalName(ModelBindingManager.getGlobalVendor(), name.substring(0, index),
074                                                ESQLDataObjectType.dotTable) + name.substring(index);
075                        } else {
076                                return name;
077                        }
078                }
079                if (name.endsWith(")") && name.indexOf("(") != -1) {
080                        return SQLUtil.getIdentifierNormalName(ModelBindingManager.getGlobalVendor(),
081                                        name.substring(0, name.lastIndexOf("(")), ESQLDataObjectType.dotTable)
082                                        + name.substring(name.lastIndexOf("("));
083                }
084        return SQLUtil.getIdentifierNormalName(ModelBindingManager.getGlobalVendor(), name,
085                ESQLDataObjectType.dotTable);
086    }
087
088    public static String getIdentifierNormalFunctionName(String name) {
089        return SQLUtil.getIdentifierNormalName(ModelBindingManager.getGlobalVendor(), name,
090                ESQLDataObjectType.dotFunction);
091    }
092
093    public static String getIdentifierNormalName(String name, ESQLDataObjectType sqlDataObjectType) {
094        return SQLUtil.getIdentifierNormalName(ModelBindingManager.getGlobalVendor(), name, sqlDataObjectType);
095    }
096
097    public static String getColumnName(TObjectName column) {
098        if (column == null || column.toString() == null) {
099            return null;
100        }
101        String name = column.getColumnNameOnly();
102        if (name == null || "".equals(name.trim())) {
103            return getIdentifierNormalColumnName(column.toString().trim());
104        } else
105            return getIdentifierNormalColumnName(name.trim());
106    }
107    
108    public static String getColumnName(String column) {
109                if (column == null) {
110                        return null;
111                }
112                String name = column.substring(column.lastIndexOf(".") + 1);
113                if (name == null || "".equals(name.trim())) {
114                        return DlineageUtil.getIdentifierNormalColumnName(column.toString().trim());
115                } else
116                        return DlineageUtil.getIdentifierNormalColumnName(name.trim());
117        }
118
119    public static boolean isTempTable(Table tableModel, EDbVendor vendor) {
120                if (SubType.temp_table == tableModel.getSubType()) {
121                        return true;
122                }
123        switch (vendor) {
124            case dbvmssql:
125            case dbvazuresql:
126                return tableModel.getName().startsWith("#") && !tableModel.getName().startsWith("##");
127            default:
128                return false;
129        }
130    }
131
132    public static String getTableFullName(String tableName) {
133                if (ModelBindingManager.get() != null && ModelBindingManager.get().isDblinkTable(tableName)) {
134                        return tableName;
135                }
136
137        if(tableName == null){
138            return null;
139        }
140
141        if (tableName.startsWith("`") && tableName.endsWith("`") && tableName.indexOf(".") != -1
142                                && ModelBindingManager.getGlobalOption().getVendor() == EDbVendor.dbvbigquery) {
143                        tableName = SQLUtil.trimColumnStringQuote(tableName);
144                }
145        List<String> segments = SQLUtil.parseNames(tableName);
146        if (segments.size() == 1) {
147            StringBuffer buffer = new StringBuffer();
148            if (ModelBindingManager.getGlobalDatabase() != null) {
149                buffer.append(ModelBindingManager.getGlobalDatabase()).append(".");
150            }
151            if (ModelBindingManager.getGlobalSchema() != null) {
152                buffer.append(ModelBindingManager.getGlobalSchema()).append(".");
153            }
154            buffer.append(tableName);
155            return getIdentifierNormalTableName(buffer.toString());
156        } else if (segments.size() == 2) {
157            if (ModelBindingManager.getGlobalDatabase() != null) {
158                return getIdentifierNormalTableName(ModelBindingManager.getGlobalDatabase() + "." + tableName);
159            } else {
160                return getIdentifierNormalTableName(tableName);
161            }
162        } else {
163            if ((ModelBindingManager.getGlobalVendor() == EDbVendor.dbvmssql
164                    || ModelBindingManager.getGlobalVendor() == EDbVendor.dbvazuresql) && tableName.indexOf("..") != -1) {
165                if (ModelBindingManager.getGlobalSchema() != null) {
166                    return getIdentifierNormalTableName(
167                            tableName.replace("..", "." + ModelBindingManager.getGlobalSchema() + "."));
168                } else if (ModelBindingManager.getGlobalVendor() == EDbVendor.dbvmssql
169                        || ModelBindingManager.getGlobalVendor() == EDbVendor.dbvazuresql) {
170                    return getIdentifierNormalTableName(tableName.replace("..", ".dbo."));
171                } else {
172                    return getIdentifierNormalTableName(tableName);
173                }
174            } else {
175                return getIdentifierNormalTableName(tableName);
176            }
177        }
178    }
179
180
181    
182    public static String getSimpleTableName(String tableName) {
183        if (tableName.startsWith("`") && tableName.endsWith("`") && tableName.indexOf(".") != -1
184                                && ModelBindingManager.getGlobalOption().getVendor() == EDbVendor.dbvbigquery) {
185                        tableName = SQLUtil.trimColumnStringQuote(tableName);
186                }
187        List<String> segments = SQLUtil.parseNames(tableName);
188        return segments.get(segments.size()-1);
189    }
190    
191    public static String getColumnNameOnly(String columnName) {
192        if (columnName.startsWith("`") && columnName.endsWith("`") && columnName.indexOf(".") != -1
193                                && ModelBindingManager.getGlobalOption().getVendor() == EDbVendor.dbvbigquery) {
194                columnName = SQLUtil.trimColumnStringQuote(columnName);
195                }
196        List<String> segments = SQLUtil.parseNames(columnName);
197        return segments.get(segments.size()-1);
198    }
199
200    public static String getTableSchema(String tableName) {
201        EDbVendor vendor = ModelBindingManager.getGlobalOption().getVendor();
202        boolean supportSchema = TSQLEnv.supportSchema(vendor);
203
204        if (tableName.startsWith("`") && tableName.endsWith("`") && tableName.indexOf(".") != -1
205                && ModelBindingManager.getGlobalOption().getVendor() == EDbVendor.dbvbigquery) {
206            tableName = SQLUtil.trimColumnStringQuote(tableName);
207        }
208        List<String> segments = SQLUtil.parseNames(tableName);
209        if (segments.size() == 1) {
210            if (supportSchema && ModelBindingManager.getGlobalSchema() != null) {
211                return ModelBindingManager.getGlobalSchema();
212            }
213        } else if (segments.size() == 2) {
214            if(supportSchema) {
215                return segments.get(0);
216            }
217        } else {
218            if (ModelBindingManager.getGlobalVendor() == EDbVendor.dbvmssql && tableName.indexOf("..") != -1) {
219                if (ModelBindingManager.getGlobalSchema() != null) {
220                    return ModelBindingManager.getGlobalSchema();
221                } else if (ModelBindingManager.getGlobalVendor() == EDbVendor.dbvmssql) {
222                    return "dbo";
223                }
224            } else {
225                if(supportSchema) {
226                    return segments.get(segments.size() - 2);
227                }
228            }
229        }
230        return null;
231    }
232
233    public static String getTableServer(String tableName) {
234        EDbVendor vendor = ModelBindingManager.getGlobalOption().getVendor();
235        boolean supportCatalog = TSQLEnv.supportCatalog(vendor);
236        boolean supportSchema = TSQLEnv.supportSchema(vendor);
237
238        if (tableName.startsWith("`") && tableName.endsWith("`") && tableName.indexOf(".") != -1
239                && ModelBindingManager.getGlobalOption().getVendor() == EDbVendor.dbvbigquery) {
240            tableName = SQLUtil.trimColumnStringQuote(tableName);
241        }
242        List<String> segments = SQLUtil.parseNames(tableName);
243        if (segments.size() <= 2) {
244            return ModelBindingManager.getGlobalServer();
245        } else if (segments.size() == 3) {
246            if(supportCatalog && supportSchema) {
247                return ModelBindingManager.getGlobalServer();
248            } else {
249                return segments.get(0);
250            }
251        } else {
252            if(supportCatalog && supportSchema) {
253                    return segments.get(segments.size() - 4);
254            } else {
255                return segments.get(segments.size() - 3);
256            }
257        }
258    }
259
260    public static String getTableDatabase(String tableName) {
261        EDbVendor vendor = ModelBindingManager.getGlobalOption().getVendor();
262        boolean supportCatalog = TSQLEnv.supportCatalog(vendor);
263        boolean supportSchema = TSQLEnv.supportSchema(vendor);
264
265        if (tableName.startsWith("`") && tableName.endsWith("`") && tableName.indexOf(".") != -1
266                                && ModelBindingManager.getGlobalOption().getVendor() == EDbVendor.dbvbigquery) {
267                        tableName = SQLUtil.trimColumnStringQuote(tableName);
268                }
269        List<String> segments = SQLUtil.parseNames(tableName);
270        if (segments.size() == 1) {
271            if (supportCatalog && ModelBindingManager.getGlobalDatabase() != null) {
272                return ModelBindingManager.getGlobalDatabase();
273            }
274        } else if (segments.size() == 2) {
275            if(supportCatalog && supportSchema) {
276                if (ModelBindingManager.getGlobalDatabase() != null) {
277                    return ModelBindingManager.getGlobalDatabase();
278                }
279            } else {
280                if (supportCatalog) {
281                    return segments.get(0);
282                }
283            }
284        } else {
285            if (ModelBindingManager.getGlobalVendor() == EDbVendor.dbvmssql && tableName.indexOf("..") != -1) {
286                String fullName = tableName;
287                if (ModelBindingManager.getGlobalSchema() != null) {
288                    fullName = getIdentifierNormalTableName(
289                            tableName.replace("..", "." + ModelBindingManager.getGlobalSchema() + "."));
290                } else if (ModelBindingManager.getGlobalVendor() == EDbVendor.dbvmssql) {
291                    fullName = getIdentifierNormalTableName(tableName.replace("..", ".dbo."));
292                } else {
293                    fullName = getIdentifierNormalTableName(tableName);
294                }
295                return getTableDatabase(fullName);
296            } else {
297                if(supportCatalog && supportSchema) {
298                    return segments.get(segments.size() - 3);
299                }
300                else if(supportCatalog){
301                    return segments.get(segments.size() - 2);
302                }
303            }
304        }
305        return null;
306    }
307
308    public static String getTableFullNameWithDefaultSchema(String tableName) {
309        EDbVendor vendor = ModelBindingManager.getGlobalOption().getVendor();
310        boolean supportCatalog = TSQLEnv.supportCatalog(vendor);
311        boolean supportSchema = TSQLEnv.supportSchema(vendor);
312
313        if (tableName.startsWith("`") && tableName.endsWith("`") && tableName.indexOf(".") != -1
314                                && ModelBindingManager.getGlobalOption().getVendor() == EDbVendor.dbvbigquery) {
315                        tableName = SQLUtil.trimColumnStringQuote(tableName);
316                }
317        List<String> segments = SQLUtil.parseNames(tableName);
318        if (segments.size() == 1) {
319            StringBuffer buffer = new StringBuffer();
320            if (supportCatalog && ModelBindingManager.getGlobalDatabase() != null) {
321                buffer.append(ModelBindingManager.getGlobalDatabase()).append(".");
322            }
323            if (supportSchema && ModelBindingManager.getGlobalSchema() != null) {
324                buffer.append(ModelBindingManager.getGlobalSchema()).append(".");
325            } else if (ModelBindingManager.getGlobalVendor() == EDbVendor.dbvmssql) {
326                buffer.append("dbo").append(".");
327            }
328            buffer.append(tableName);
329            return getIdentifierNormalTableName(buffer.toString());
330        } else if (segments.size() == 2) {
331            if (supportCatalog && supportSchema && ModelBindingManager.getGlobalDatabase() != null) {
332                return getIdentifierNormalTableName(ModelBindingManager.getGlobalDatabase() + "." + tableName);
333            } else {
334                return getIdentifierNormalTableName(tableName);
335            }
336        } else {
337            if (ModelBindingManager.getGlobalVendor() == EDbVendor.dbvmssql && tableName.indexOf("..") != -1) {
338                if (ModelBindingManager.getGlobalSchema() != null) {
339                    return getIdentifierNormalTableName(
340                            tableName.replace("..", "." + ModelBindingManager.getGlobalSchema() + "."));
341                } else if (ModelBindingManager.getGlobalVendor() == EDbVendor.dbvmssql) {
342                    return getIdentifierNormalTableName(tableName.replace("..", ".dbo."));
343                } else {
344                    return getIdentifierNormalTableName(tableName);
345                }
346            } else {
347                return getIdentifierNormalTableName(tableName);
348            }
349        }
350    }
351
352    @SuppressWarnings("rawtypes")
353    public static SqlInfo[] convertSQL(File file, String json) {
354        List<SqlInfo> sqlInfos = new ArrayList<SqlInfo>();
355        try {
356            List sqlContents = (List) JSON.parseObject(json);
357            for (int j = 0; j < sqlContents.size(); j++) {
358                Map sqlContent = (Map) sqlContents.get(j);
359                String sql = (String) sqlContent.get("sql");
360                String fileName = (String) sqlContent.get("fileName");
361                String filePath = (String) sqlContent.get("filePath");
362                if (sql != null && sql.trim().startsWith("{")) {
363                    Map queryObject = (Map) JSON.parseObject(sql);
364                    List querys = (List) queryObject.get("queries");
365                    if (querys != null) {
366                        for (int i = 0; i < querys.size(); i++) {
367                            Map object = (Map) querys.get(i);
368                            SqlInfo info = new SqlInfo();
369                            info.setSql(JSON.toJSONString(object));
370                            info.setFileName(fileName);
371                            info.setFilePath(filePath);
372                            info.setOriginIndex(i);
373                            sqlInfos.add(info);
374                        }
375                    } else {
376                        SqlInfo info = new SqlInfo();
377                        info.setSql(JSON.toJSONString(queryObject));
378                        info.setFileName(fileName);
379                        info.setFilePath(filePath);
380                        info.setOriginIndex(0);
381                        sqlInfos.add(info);
382                    }
383                } else if (sql != null) {
384                    SqlInfo info = new SqlInfo();
385                    info.setSql(sql);
386                    info.setFileName(fileName);
387                    info.setFilePath(filePath);
388                    info.setOriginIndex(0);
389                    sqlInfos.add(info);
390                }
391            }
392        } catch (Exception e) {
393            try {
394                Map queryObject = (Map) JSON.parseObject(json);
395                List querys = (List) queryObject.get("queries");
396                if (querys != null) {
397                    for (int i = 0; i < querys.size(); i++) {
398                        Map object = (Map) querys.get(i);
399                        SqlInfo info = new SqlInfo();
400                        info.setSql(JSON.toJSONString(object));
401                        if (file != null) {
402                            info.setFileName(file.getName());
403                            info.setFilePath(file.getAbsolutePath());
404                        }
405                        info.setOriginIndex(i);
406                        sqlInfos.add(info);
407                    }
408                } else {
409                    SqlInfo info = new SqlInfo();
410                    info.setSql(JSON.toJSONString(queryObject));
411                    if (file != null) {
412                        info.setFileName(file.getName());
413                        info.setFilePath(file.getAbsolutePath());
414                    }
415                    info.setOriginIndex(0);
416                    sqlInfos.add(info);
417                }
418            } catch (Exception e1) {
419                SqlInfo info = new SqlInfo();
420                info.setSql(json);
421                if (file != null) {
422                    info.setFileName(file.getName());
423                    info.setFilePath(file.getAbsolutePath());
424                }
425                info.setOriginIndex(0);
426                sqlInfos.add(info);
427            }
428        }
429        return sqlInfos.toArray(new SqlInfo[0]);
430    }
431
432    
433        public static String getQualifiedTableName(table table) {
434                boolean supportCatalog = TSQLEnv.supportCatalog(ModelBindingManager.getGlobalVendor());
435                boolean supportSchema = TSQLEnv.supportSchema(ModelBindingManager.getGlobalVendor());
436                StringBuilder buffer = new StringBuilder();
437                if (supportCatalog && supportSchema) {
438                        if (!SQLUtil.isEmpty(table.getDatabase())) {
439                                if (ModelBindingManager.getGlobalVendor() == EDbVendor.dbvoracle
440                                                && SubType.dblink.name().equals(table.getSubType())) {
441                                        //dblink doesn't set database
442                                } else {
443                                        buffer.append(table.getDatabase());
444                                }
445                        }
446                        if (!SQLUtil.isEmpty(table.getSchema())) {
447                                if (buffer.length() > 0) {
448                                        buffer.append(".");
449                                }
450                                buffer.append(table.getSchema());
451                        } else {
452                                if (buffer.length() > 0) {
453                                        buffer.append(".");
454                                        if (ModelBindingManager.getGlobalVendor() == EDbVendor.dbvmssql) {
455                                                buffer.append("dbo");
456                                        } else {
457                                                buffer.append(TSQLEnv.DEFAULT_SCHEMA_NAME);
458                                        }
459                                }
460                        }
461                        if (buffer.length() > 0) {
462                                buffer.append(".");
463                        }
464                        buffer.append(table.getTableNameOnly());
465                }
466                else if(supportCatalog) {
467                        if (!SQLUtil.isEmpty(table.getDatabase())) {
468                                buffer.append(table.getDatabase());
469                        }
470                        if (buffer.length() > 0) {
471                                buffer.append(".");
472                        }
473                        buffer.append(table.getTableNameOnly());
474                }
475                else if(supportSchema) {
476                        if (!SQLUtil.isEmpty(table.getSchema())) {
477                                buffer.append(table.getSchema());
478                        }
479                        if (buffer.length() > 0) {
480                                buffer.append(".");
481                        }
482                        buffer.append(table.getTableNameOnly());
483                }
484                if (SubType.dblink.name().equals(table.getSubType())) {
485                        buffer.append("@").append(table.getDatabase());
486                }
487                return buffer.toString();
488        }
489
490    public static TCustomSqlStatement getTopStmt(TCustomSqlStatement stmt) {
491        if (ModelBindingManager.getGlobalOption() != null && ModelBindingManager.getGlobalOption().getAnalyzeMode() == AnalyzeMode.crud) {
492            TCustomSqlStatement parent = stmt.getParentStmt();
493            if (parent == null || parent instanceof TPlsqlCreatePackage
494                    || parent instanceof TStoredProcedureSqlStatement || parent instanceof TCommonBlock)
495                return stmt;
496            return getTopStmt(parent);
497        } else {
498            TCustomSqlStatement parent = stmt.getParentStmt();
499            if (parent == null || parent instanceof TPlsqlCreatePackage)
500                return stmt;
501            return getTopStmt(parent);
502        }
503    }
504
505    public static boolean isQuote(String column) {
506        return (column.startsWith("\"") && column.endsWith("\"")) || (column.startsWith("'") && column.endsWith("'"))
507                || (column.startsWith("[") && column.endsWith("]")) || (column.startsWith("`") && column.endsWith("`"));
508    }
509
510    public static String getProcedureNameWithArgs(TStoredProcedureSqlStatement stmt) {
511                StringBuilder buffer = new StringBuilder();
512                buffer.append(stmt.getStoredProcedureName().toString());
513                if (stmt.getParameterDeclarations() != null && DlineageUtil.supportFunctionOverride(ModelBindingManager.getGlobalVendor())) {
514                        buffer.append("(");
515                        TParameterDeclarationList parameters = stmt.getParameterDeclarations();
516                        for (int i = 0; i < parameters.size(); ++i) {
517                                TParameterDeclaration parameter = parameters.getParameterDeclarationItem(i);
518                                if(parameter.getDataType()!=null) {
519                                        buffer.append(parameter.getDataType().getDataTypeName());
520                                }
521                                if(i<parameters.size()-1) {
522                                        buffer.append(",");
523                                }
524                        }
525                        buffer.append(")");
526                }
527                return buffer.toString();
528        }
529
530    public static String getIdentifierProcedureNameWithArgNum(procedure procedure) {
531        StringBuilder buffer = new StringBuilder();
532        buffer.append(SQLUtil.trimColumnStringQuote(procedure.getName()));
533        if (procedure.getArguments() != null && procedure.getArguments().size() > 0 && DlineageUtil.supportFunctionOverride(ModelBindingManager.getGlobalVendor())) {
534            buffer.append("(");
535            buffer.append(procedure.getArguments().size());
536            buffer.append(")");
537        }
538        return buffer.toString().toUpperCase();
539    }
540
541    public static String getIdentifierOraclePackageNameWithArgNum(oraclePackage pkg) {
542        StringBuilder buffer = new StringBuilder();
543        buffer.append(SQLUtil.trimColumnStringQuote(pkg.getName()));
544        if (pkg.getArguments() != null && pkg.getArguments().size() > 0 && DlineageUtil.supportFunctionOverride(ModelBindingManager.getGlobalVendor())) {
545            buffer.append("(");
546            buffer.append(pkg.getArguments().size());
547            buffer.append(")");
548        }
549        return buffer.toString().toUpperCase();
550    }
551
552    public static String getIdentifierFunctionName(table function) {
553        StringBuilder buffer = new StringBuilder();
554        buffer.append(SQLUtil.trimColumnStringQuote(function.getName()));
555        return buffer.toString().toUpperCase();
556    }
557
558    public static String getProcedureNameWithArgNum(TStoredProcedureSqlStatement stmt) {
559                StringBuilder buffer = new StringBuilder();
560                buffer.append(stmt.getStoredProcedureName().toString());
561                if (stmt.getParameterDeclarations() != null && DlineageUtil.supportFunctionOverride(ModelBindingManager.getGlobalVendor())) {
562                        buffer.append("(");
563                        buffer.append(stmt.getParameterDeclarations().size());
564                        buffer.append(")");
565                }
566                return buffer.toString();
567        }
568    
569        public static String getProcedureNameWithInputArgNum(TStoredProcedureSqlStatement stmt) {
570                StringBuilder buffer = new StringBuilder();
571                buffer.append(stmt.getStoredProcedureName().toString());
572                if (stmt.getParameterDeclarations() != null && DlineageUtil.supportFunctionOverride(ModelBindingManager.getGlobalVendor())) {
573                        buffer.append("(");
574                        int count = 0;
575                        for (int i = 0; i < stmt.getParameterDeclarations().size(); i++) {
576                                if (stmt.getParameterDeclarations().getParameterDeclarationItem(i)
577                                                .getParameterMode() == EParameterMode.in) {
578                                        count++;
579                                }
580                        }
581                        if (count == 0) {
582                                count = stmt.getParameterDeclarations().size();
583                        }
584                        buffer.append(count);
585                        buffer.append(")");
586                }
587                return buffer.toString();
588        }
589
590        public static String getFunctionNameWithArgNum(TFunctionCall function) {
591                StringBuilder buffer = new StringBuilder();
592                buffer.append(function.getFunctionName().toString());
593                if (function.getArgs() != null && DlineageUtil.supportFunctionOverride(ModelBindingManager.getGlobalVendor())) {
594                        buffer.append("(");
595                        buffer.append(function.getArgs().size());
596                        buffer.append(")");
597                }
598                return buffer.toString();
599        }
600
601        public static String getTableSchema(Table tableModel) {
602                StringBuilder buffer = new StringBuilder();
603                if(tableModel.getDatabase()!=null) {
604                        buffer.append(tableModel.getDatabase());
605                }
606                else {
607                        buffer.append(TSQLEnv.DEFAULT_DB_NAME);
608                }
609                buffer.append(".");
610                if(tableModel.getSchema()!=null) {
611                        buffer.append(tableModel.getSchema());
612                }
613                else {
614                        buffer.append(TSQLEnv.DEFAULT_SCHEMA_NAME);
615                }
616                return buffer.toString();
617        }
618        
619        public static String getTableSQLEnvKey(Table tableModel) {
620                StringBuilder buffer = new StringBuilder();
621                if(tableModel.getDatabase()!=null) {
622                        buffer.append(tableModel.getDatabase());
623                }
624                else {
625                        buffer.append(TSQLEnv.DEFAULT_DB_NAME);
626                }
627                buffer.append(".");
628                if(tableModel.getSchema()!=null) {
629                        buffer.append(tableModel.getSchema());
630                }
631                else {
632                        buffer.append(TSQLEnv.DEFAULT_SCHEMA_NAME);
633                }
634                buffer.append(".");
635                buffer.append(DlineageUtil.getSimpleTableName(tableModel.getName()));
636                return buffer.toString();
637        }
638        
639        public static String getProcedureParentName(TCustomSqlStatement stmt) {
640                if (stmt instanceof TStoredProcedureSqlStatement) {
641                        if (((TStoredProcedureSqlStatement) stmt).getStoredProcedureName() != null) {
642                                return getOraclePackageName() + ((TStoredProcedureSqlStatement) stmt).getStoredProcedureName().toString();
643                        }
644                }
645                stmt = stmt.getParentStmt();
646                if (stmt == null)
647                        return null;
648
649        if (stmt instanceof TCommonBlock) {
650                        if(((TCommonBlock) stmt).getBlockBody().getParentObjectName() instanceof TStoredProcedureSqlStatement) {
651                                stmt = (TStoredProcedureSqlStatement)((TCommonBlock) stmt).getBlockBody().getParentObjectName();
652                        }
653                }
654        
655                if (stmt instanceof TStoredProcedureSqlStatement) {
656                        if (((TStoredProcedureSqlStatement) stmt).getStoredProcedureName() != null) {
657                                String procedureName = getOraclePackageName() + ((TStoredProcedureSqlStatement) stmt).getStoredProcedureName().toString();
658                return getTableFullName(procedureName);
659                        }
660                }
661                if (stmt instanceof TTeradataCreateProcedure) {
662                        if (((TTeradataCreateProcedure) stmt).getProcedureName() != null) {
663                                String procedureName =  ((TTeradataCreateProcedure) stmt).getProcedureName().toString();
664                return getTableFullName(procedureName);
665                        }
666                }
667
668                return getProcedureParentName(stmt);
669        }
670
671        private static String getOraclePackageName() {
672                if (ModelBindingManager.getGlobalOraclePackage() != null) {
673                        return ModelBindingManager.getGlobalOraclePackage().getName() + ".";
674                }
675                return "";
676        }
677
678        public static sourceColumn copySourceColumn(sourceColumn oldSourceName) {
679                sourceColumn newSourceColumn = new sourceColumn();
680                newSourceColumn.setClauseType(oldSourceName.getClauseType());
681                newSourceColumn.setColumn(oldSourceName.getColumn());
682                newSourceColumn.setColumn_type(oldSourceName.getColumn_type());
683                newSourceColumn.setCoordinate(oldSourceName.getCoordinate());
684                newSourceColumn.setId(oldSourceName.getId());
685                newSourceColumn.setName(oldSourceName.getName());
686                newSourceColumn.setParent_alias(oldSourceName.getParent_alias());
687                newSourceColumn.setParent_id(oldSourceName.getParent_id());
688                newSourceColumn.setParent_name(oldSourceName.getParent_name());
689                newSourceColumn.setSource(oldSourceName.getSource());
690                newSourceColumn.setSource_id(oldSourceName.getSource_id());
691                newSourceColumn.setSource_name(oldSourceName.getSource_name());
692                newSourceColumn.setStruct(oldSourceName.isStruct());
693                newSourceColumn.setType(oldSourceName.getType());
694                newSourceColumn.setValue(oldSourceName.getValue());
695                if(oldSourceName.getTransforms()!=null) {
696                        newSourceColumn.setTransforms(new LinkedHashSet<transform>());
697                        for(transform transform: oldSourceName.getTransforms()) {
698                                newSourceColumn.getTransforms().add(transform);
699                        }
700                }
701                if(oldSourceName.getCandidateParents()!=null) {
702                        newSourceColumn.setCandidateParents(new LinkedHashSet<candidateTable>());
703                        for(candidateTable candidateTable: oldSourceName.getCandidateParents()) {
704                                newSourceColumn.getCandidateParents().add(candidateTable);
705                        }
706                }
707                return newSourceColumn;
708        }
709
710        public static boolean supportFunctionOverride(EDbVendor vendor) {
711                switch (vendor) {
712                case dbvpostgresql:
713                case dbvoracle:
714                case dbvdb2:
715                case dbvmysql:
716                case dbvsnowflake:
717                case dbvhana:
718                case dbvgreenplum:
719                case dbvgaussdb:
720                        return true;
721                default:
722                        return false;
723                }
724        }
725        
726        private static final List<String> TERADATA_BUILTIN_FUNCTIONS = Arrays
727                        .asList(new String[] { "ACCOUNT", "CURRENT_DATE", "CURRENT_ROLE", "CURRENT_TIME", "CURRENT_TIMESTAMP",
728                                        "CURRENT_USER", "DATABASE", "DATE", "PROFILE", "ROLE", "SESSION", "TIME", "USER", "SYSDATE", });
729        
730        public static boolean isBuiltInFunctionName(String functionName) {
731                if (functionName == null)
732                        return false;
733                try {
734                        EDbVendor vendor = ModelBindingManager.getGlobalOption().getVendor();
735                        if (vendor == EDbVendor.dbvteradata) {
736                                boolean result = TERADATA_BUILTIN_FUNCTIONS.contains(functionName.toUpperCase());
737                                if (result) {
738                                        return true;
739                                }
740                        }
741
742                        List<String> versions = functionChecker.getAvailableDbVersions(vendor);
743                        if (versions != null && versions.size() > 0) {
744                                for (int i = 0; i < versions.size(); i++) {
745                                        boolean result = functionChecker.isBuiltInFunction(functionName.toUpperCase(),
746                                                        vendor, versions.get(i));
747                                        if (result) {
748                                                return result;
749                                        }
750                                }
751
752                                // boolean result =
753                                // TERADATA_BUILTIN_FUNCTIONS.contains(object.toString());
754                                // if (result) {
755                                // return true;
756                                // }
757                        }
758                } catch (Exception e) {
759                }
760
761                return false;
762        }
763        
764        public static boolean isKeyword(String objectName) {
765                if (objectName == null)
766                        return false;
767                try {
768                        EDbVendor vendor = ModelBindingManager.getGlobalOption().getVendor();
769
770                        List<String> versions = keywordChecker.getAvailableDbVersions(vendor);
771                        if (versions != null && versions.size() > 0) {
772                                for (int i = 0; i < versions.size(); i++) {
773                                        List<String> segments = SQLUtil.parseNames(objectName);
774                                        boolean result = keywordChecker.isKeyword(segments.get(segments.size() - 1),
775                                                        vendor, versions.get(i), false);
776                                        if (result) {
777                                                return result;
778                                        }
779                                }
780                        }
781                } catch (Exception e) {
782                }
783
784                return false;
785        }
786
787        public static TSelectSqlStatement getLeftStmt(TSelectSqlStatement stmt) {
788                if (stmt.getLeftStmt() != null && stmt.getLeftStmt().getLeftStmt() != null) {
789                        return getLeftStmt(stmt.getLeftStmt());
790                }
791                return stmt.getLeftStmt();
792        }
793}