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}