001package gudusoft.gsqlparser.dlineage.metadata; 002 003import gudusoft.gsqlparser.EDbVendor; 004import gudusoft.gsqlparser.dlineage.dataflow.metadata.MetadataReader; 005import gudusoft.gsqlparser.dlineage.dataflow.metadata.sqlflow.SqlflowMetadataAnalyzer; 006import gudusoft.gsqlparser.dlineage.dataflow.model.SubType; 007import gudusoft.gsqlparser.dlineage.dataflow.model.xml.*; 008import gudusoft.gsqlparser.dlineage.util.DataflowUtility; 009import gudusoft.gsqlparser.sqlenv.TSQLEnv; 010import gudusoft.gsqlparser.sqlenv.constant.SystemConstant; 011import gudusoft.gsqlparser.util.SQLUtil; 012import gudusoft.gsqlparser.util.json.JSON; 013 014import java.io.File; 015import java.util.ArrayList; 016import java.util.List; 017import java.util.Map; 018 019public class MetadataUtil { 020 021 public static Sqlflow convertMetadataJsonToSqlflow(EDbVendor vendor, String json) { 022 if (MetadataReader.isSqlflow(json)) { 023 dataflow temp = new SqlflowMetadataAnalyzer().analyzeMetadata(vendor, json); 024 Sqlflow sqlflow = MetadataUtil.convertDataflowToMetadata(vendor, temp); 025 return sqlflow; 026 } else { 027 throw new IllegalArgumentException("Not a sqlflow json."); 028 } 029 } 030 031 public static Sqlflow convertDataflowToMetadata(EDbVendor vendor, dataflow dataflow) { 032 if (dataflow == null) { 033 return null; 034 } 035 Sqlflow sqlflow = new Sqlflow(); 036 sqlflow.setCreatedBy(SystemConstant.name + " " + SystemConstant.version); 037 appendTables(sqlflow, vendor, dataflow); 038 appendPackages(sqlflow, vendor, dataflow); 039 appendProcedures(sqlflow, vendor, dataflow); 040 appendProcesses(sqlflow, vendor, dataflow); 041 appendErrorMessages(sqlflow, vendor, dataflow); 042 return sqlflow; 043 } 044 045 private static void appendErrorMessages(Sqlflow sqlflow, EDbVendor vendor, dataflow dataflow) { 046 if (dataflow.getErrors() != null && !dataflow.getErrors().isEmpty()) { 047 for (error errorItem : dataflow.getErrors()) { 048 Error error = new Error(); 049 error.setCoordinate(errorItem.getCoordinate()); 050 error.setErrorMessage(errorItem.getErrorMessage()); 051 error.setErrorType(errorItem.getErrorType()); 052 error.setFile(errorItem.getFile()); 053 error.setOriginCoordinate(errorItem.getOriginCoordinate()); 054 sqlflow.appendError(error); 055 } 056 } 057 } 058 059 private static void appendProcedures(Sqlflow sqlflow, EDbVendor vendor, dataflow dataflow) { 060 if (dataflow.getProcedures() == null || dataflow.getProcedures().isEmpty()) { 061 return; 062 } 063 064 for (procedure procedureItem : dataflow.getProcedures()) { 065 Server server = new Server(); 066 server.setDbVendor(vendor.name()); 067 String serverName = procedureItem.getServer(); 068 if (serverName == null && !server.isSupportsCatalogs() && procedureItem.getDatabase() != null) { 069 serverName = procedureItem.getDatabase(); 070 } 071 if (serverName == null) { 072 serverName = TSQLEnv.DEFAULT_SERVER_NAME; 073 } 074 server.setName(serverName); 075 server = sqlflow.appendServer(server); 076 077 Database database = null; 078 079 if (server.isSupportsCatalogs()) { 080 String databaseName = procedureItem.getDatabase(); 081 database = new Database(); 082 database.setName(databaseName == null ? TSQLEnv.DEFAULT_DB_NAME : databaseName); 083 database = server.appendDatabase(database); 084 database.setServer(server); 085 } 086 087 Schema schema = null; 088 if (server.isSupportsSchemas()) { 089 String schemaName = procedureItem.getSchema(); 090 schema = new Schema(); 091 schema.setName(schemaName == null ? TSQLEnv.DEFAULT_SCHEMA_NAME : schemaName); 092 if (database != null) { 093 schema = database.appendSchema(server, schema); 094 schema.setParent(database); 095 schema.setServer(server); 096 } else { 097 schema = server.appendSchema(schema); 098 schema.setServer(server); 099 } 100 } 101 102 Procedure procedure = new Procedure(); 103 procedure.setId(procedureItem.getId()); 104 105 List<String> segments = SQLUtil.parseNames(procedureItem.getName()); 106 procedure.setName(segments.get(segments.size()-1)); 107 procedure.setServer(server); 108 if (server.isSupportsSchemas()) { 109 procedure.setParent(schema); 110 } 111 else if (server.isSupportsCatalogs()) { 112 procedure.setParent(database); 113 } 114 115 procedure.setType(procedureItem.getType()); 116 procedure.setCoordinates(Coordinate.parse(procedureItem.getCoordinate())); 117 if (procedureItem.getArguments() != null) { 118 for (argument argumentItem : procedureItem.getArguments()) { 119 Argument argument = new Argument(); 120 argument.setServer(server); 121 argument.setParent(procedure); 122 argument.setId(argumentItem.getId()); 123 argument.setName(argumentItem.getName()); 124 argument.setDataType(argumentItem.getDatatype()); 125 argument.setInout(argumentItem.getInout()); 126 argument.setCoordinates(Coordinate.parse(argumentItem.getCoordinate())); 127 procedure.appendArgument(argument); 128 } 129 } 130 131 if (server.isSupportsSchemas()) { 132 schema.appendProcedure(procedure); 133 } else if (server.isSupportsCatalogs()) { 134 database.appendProcedure(procedure); 135 } 136 } 137 } 138 139 protected static void appendPackages(Sqlflow sqlflow, EDbVendor vendor, dataflow dataflow) { 140 if (dataflow.getPackages() == null || dataflow.getPackages().isEmpty()) { 141 return; 142 } 143 for (oraclePackage oraclePackageItem : dataflow.getPackages()) { 144 Server server = new Server(); 145 server.setDbVendor(vendor.name()); 146 String serverName = oraclePackageItem.getServer(); 147 if (serverName == null && !server.isSupportsCatalogs() && oraclePackageItem.getDatabase() != null) { 148 serverName = oraclePackageItem.getDatabase(); 149 } 150 if (serverName == null) { 151 serverName = TSQLEnv.DEFAULT_SERVER_NAME; 152 } 153 server.setName(serverName); 154 server = sqlflow.appendServer(server); 155 156 Database database = null; 157 158 if (server.isSupportsCatalogs()) { 159 String databaseName = oraclePackageItem.getDatabase(); 160 database = new Database(); 161 database.setName(databaseName == null ? TSQLEnv.DEFAULT_DB_NAME : databaseName); 162 database = server.appendDatabase(database); 163 database.setServer(server); 164 } 165 166 Schema schema = null; 167 if (server.isSupportsSchemas()) { 168 String schemaName = oraclePackageItem.getSchema(); 169 schema = new Schema(); 170 schema.setName(schemaName == null ? TSQLEnv.DEFAULT_SCHEMA_NAME : schemaName); 171 if (database != null) { 172 schema = database.appendSchema(server, schema); 173 schema.setParent(database); 174 schema.setServer(server); 175 } else { 176 schema = server.appendSchema(schema); 177 schema.setServer(server); 178 } 179 } 180 181 Package oraclePackage = new Package(); 182 oraclePackage.setId(oraclePackageItem.getId()); 183 List<String> segments = SQLUtil.parseNames(oraclePackageItem.getName()); 184 oraclePackage.setName(segments.get(segments.size()-1)); 185 oraclePackage.setServer(server); 186 if (server.isSupportsSchemas()) { 187 oraclePackage.setParent(schema); 188 } 189 else if (server.isSupportsCatalogs()) { 190 oraclePackage.setParent(database); 191 } 192 193 oraclePackage.setCoordinates(Coordinate.parse(oraclePackageItem.getCoordinate())); 194 if (server.isSupportsSchemas()) { 195 schema.appendPackage(oraclePackage); 196 } 197 198 if (oraclePackageItem != null) { 199 for (procedure procedureItem : oraclePackageItem.getProcedures()) { 200 Procedure procedure = new Procedure(); 201 List<String> procedureSegments = SQLUtil.parseNames(procedureItem.getName()); 202 procedure.setName(procedureSegments.get(procedureSegments.size() - 1)); 203 procedure.setServer(server); 204 procedure.setParent(oraclePackage); 205 procedure.setId(procedureItem.getId()); 206 procedure.setType(procedureItem.getType()); 207 procedure.setCoordinates(Coordinate.parse(procedureItem.getCoordinate())); 208 if (procedureItem.getArguments() != null) { 209 for (argument argumentItem : procedureItem.getArguments()) { 210 Argument argument = new Argument(); 211 argument.setServer(server); 212 argument.setParent(procedure); 213 argument.setId(argumentItem.getId()); 214 argument.setName(argumentItem.getName()); 215 argument.setDataType(argumentItem.getDatatype()); 216 argument.setInout(argumentItem.getInout()); 217 argument.setCoordinates(Coordinate.parse(argumentItem.getCoordinate())); 218 procedure.appendArgument(argument); 219 } 220 } 221 oraclePackage.appendProcedure(procedure); 222 } 223 } 224 } 225 } 226 227 protected static void appendTables(Sqlflow sqlflow, EDbVendor vendor, dataflow dataflow) { 228 Map<String, table> tableMap = DataflowUtility.getDataflowDbObjMap(dataflow); 229 for (table tableItem : tableMap.values()) { 230 Server server = new Server(); 231 server.setDbVendor(vendor.name()); 232 String serverName = tableItem.getServer(); 233 if (serverName == null && !server.isSupportsCatalogs() && tableItem.getDatabase() != null) { 234 serverName = tableItem.getDatabase(); 235 } 236 if (serverName == null) { 237 serverName = TSQLEnv.DEFAULT_SERVER_NAME; 238 } 239 server.setName(serverName); 240 server = sqlflow.appendServer(server); 241 242 Database database = null; 243 244 if (server.isSupportsCatalogs()) { 245 String databaseName = tableItem.getDatabase(); 246 database = new Database(); 247 database.setName(databaseName == null ? TSQLEnv.DEFAULT_DB_NAME : databaseName); 248 database = server.appendDatabase(database); 249 database.setServer(server); 250 } 251 252 Schema schema = null; 253 if (server.isSupportsSchemas()) { 254 String schemaName = tableItem.getSchema(); 255 schema = new Schema(); 256 schema.setName(schemaName == null ? TSQLEnv.DEFAULT_SCHEMA_NAME : schemaName); 257 if (database != null) { 258 schema = database.appendSchema(server, schema); 259 schema.setParent(database); 260 schema.setServer(server); 261 } else { 262 schema = server.appendSchema(schema); 263 schema.setParent(schema); 264 schema.setServer(server); 265 } 266 } 267 268 Table table = new Table(); 269 table.setId(tableItem.getId()); 270 table.setType(tableItem.getType()); 271 if (tableItem.getAlias() != null) { 272 table.setAlias(tableItem.getAlias()); 273 } 274 table.setCoordinates(Coordinate.parse(tableItem.getCoordinate())); 275 table.setServer(server); 276 if (server.isSupportsSchemas()) { 277 table.setParent(schema); 278 } 279 else if (server.isSupportsCatalogs()) { 280 table.setParent(database); 281 } 282 table.setSubType(tableItem.getSubType()); 283 table.setFromDDL(tableItem.getFromDDL()); 284 table.setDisplayName(tableItem.getName()); 285 if (SubType.dblink.name().equals(tableItem.getSubType())) { 286 if (SQLUtil.trimColumnStringQuote(tableItem.getName().substring(tableItem.getName().lastIndexOf("@") + 1).trim()) 287 .equals(SQLUtil.trimColumnStringQuote(tableItem.getDatabase()))) { 288 List<String> segments = SQLUtil 289 .parseNames(tableItem.getName().substring(0, tableItem.getName().lastIndexOf("@")).trim()); 290 table.setName(segments.get(segments.size() - 1)); 291 table.setDbLink(tableItem.getDatabase()); 292 } else { 293 List<String> segments = SQLUtil.parseNames(tableItem.getName()); 294 table.setName(segments.get(segments.size() - 1)); 295 } 296 } else { 297 List<String> segments = SQLUtil.parseNames(tableItem.getName()); 298 table.setName(segments.get(segments.size() - 1)); 299 } 300 301 if (tableItem.getColumns() != null) { 302 List<Column> columns = new ArrayList<>(tableItem.getColumns().size()); 303 for (column columnItem : tableItem.getColumns()) { 304 Column column = new Column(); 305 column.setId(columnItem.getId()); 306 column.setName(columnItem.getName()); 307 column.setCoordinates(Coordinate.parse(columnItem.getCoordinate())); 308 column.setSource(columnItem.getSource()); 309 column.setParent(table); 310 column.setServer(server); 311 column.setDataType(columnItem.getDataType()); 312 column.setForeignKey(columnItem.isForeignKey()); 313 column.setPrimaryKey(columnItem.isPrimaryKey()); 314 column.setIndexKey(columnItem.isIndexKey()); 315 column.setUnqiueKey(columnItem.isUnqiueKey()); 316 columns.add(column); 317 } 318 table.setColumns(columns); 319 } 320 321 if (server.isSupportsSchemas()) { 322 schema.appendTable(table); 323 } else if (server.isSupportsCatalogs()) { 324 database.appendTable(table); 325 } 326 } 327 } 328 329 protected static void appendProcesses(Sqlflow sqlflow, EDbVendor vendor, dataflow dataflow) { 330 if (dataflow.getProcesses() == null || dataflow.getProcesses().isEmpty()) { 331 return; 332 } 333 for (process processItem : dataflow.getProcesses()) { 334 Server server = new Server(); 335 server.setDbVendor(vendor.name()); 336 String serverName = processItem.getServer(); 337 if (serverName == null && !server.isSupportsCatalogs() && processItem.getDatabase() != null) { 338 serverName = processItem.getDatabase(); 339 } 340 if (serverName == null) { 341 serverName = TSQLEnv.DEFAULT_SERVER_NAME; 342 } 343 server.setName(serverName); 344 server = sqlflow.appendServer(server); 345 346 Database database = null; 347 348 if (server.isSupportsCatalogs()) { 349 String databaseName = processItem.getDatabase(); 350 database = new Database(); 351 database.setName(databaseName == null ? TSQLEnv.DEFAULT_DB_NAME : databaseName); 352 database = server.appendDatabase(database); 353 database.setServer(server); 354 } 355 356 Schema schema = null; 357 if (server.isSupportsSchemas()) { 358 String schemaName = processItem.getSchema(); 359 schema = new Schema(); 360 schema.setName(schemaName == null ? TSQLEnv.DEFAULT_SCHEMA_NAME : schemaName); 361 if (database != null) { 362 schema = database.appendSchema(server, schema); 363 schema.setParent(database); 364 schema.setServer(server); 365 } else { 366 schema = server.appendSchema(schema); 367 schema.setServer(server); 368 } 369 } 370 371 Process process = new Process(); 372 process.setId(processItem.getId()); 373 process.setName(processItem.getName()); 374 process.setProcedureId(processItem.getProcedureId()); 375 process.setProcedureName(processItem.getProcedureName()); 376 process.setQueryHashId(processItem.getQueryHashId()); 377 process.setCoordinates(Coordinate.parse(processItem.getCoordinate())); 378 process.setServer(server); 379 if (server.isSupportsSchemas()) { 380 process.setParent(schema); 381 } 382 else if (server.isSupportsCatalogs()) { 383 process.setParent(database); 384 } 385 if (processItem.getTransforms() != null && !processItem.getTransforms().isEmpty()) { 386 List<Transform> transforms = new ArrayList<Transform>(processItem.getTransforms().size()); 387 for(transform transformItem:processItem.getTransforms()) { 388 Transform transform = new Transform(); 389 transform.setCode(transformItem.getCode()); 390 transform.setType(transformItem.getType()); 391 transform.setCoordinate(transformItem.getCoordinate()); 392 transforms.add(transform); 393 } 394 process.setTransforms(transforms.toArray(new Transform[0])); 395 } 396 if (server.isSupportsSchemas()) { 397 schema.appendProcess(process); 398 } else if (server.isSupportsCatalogs()) { 399 database.appendProcess(process); 400 } 401 } 402 } 403 404 public static void main(String[] args) { 405// dataflow dataflow = XML2Model.loadXML(dataflow.class, 406// SQLUtil.getFileContent("C:\\Users\\KK\\Desktop\\dataflow.xml")); 407// Sqlflow sqlflow = MetadataUtil.convertDataflowToMetadata(EDbVendor.dbvoracle, dataflow); 408// System.out.println(JSON.toJSONString(sqlflow)); 409 410 String content = SQLUtil.getFileContent(new File("D:\\1.json")); 411 if (MetadataReader.isSqlflow(content)) { 412 dataflow temp = new SqlflowMetadataAnalyzer().analyzeMetadata(EDbVendor.dbvpostgresql, content); 413 Sqlflow sqlflow = MetadataUtil.convertDataflowToMetadata(EDbVendor.dbvpostgresql, temp); 414 System.out.println(JSON.toJSONString(sqlflow)); 415 } 416 } 417}