001package gudusoft.gsqlparser.dlineage.dataflow.metadata; 002 003import gudusoft.gsqlparser.dlineage.dataflow.metadata.model.MetadataRelation; 004import gudusoft.gsqlparser.dlineage.dataflow.model.RelationshipType; 005import gudusoft.gsqlparser.util.SQLUtil; 006import gudusoft.gsqlparser.util.csv.CsvReader; 007import gudusoft.gsqlparser.util.json.JSON; 008 009import javax.management.relation.RelationType; 010import java.io.ByteArrayInputStream; 011import java.io.IOException; 012import java.util.ArrayList; 013import java.util.Arrays; 014import java.util.List; 015import java.util.Map; 016 017public class MetadataReader { 018 public static List<MetadataRelation> read(String metadata) { 019 List<MetadataRelation> relations = new ArrayList<>(); 020 CsvReader csvReader = CsvReader.parse(metadata); 021 csvReader.setSkipEmptyRecords(true); 022 csvReader.setTrimWhitespace(true); 023 try { 024 if (csvReader.readHeaders()) { 025 String[] headers = csvReader.getHeaders(); 026 boolean fromSqlflow = Arrays.stream(headers).filter(t -> t.toLowerCase().trim().equals("source_table_id")).count() > 0; 027 csvReader.readRecord(); 028 while (csvReader.readRecord()) { 029 if (fromSqlflow) { 030 MetadataRelation relation = new MetadataRelation(); 031 relation.setSourceDb(csvReader.get(0)); 032 relation.setSourceSchema(csvReader.get(1)); 033 relation.setSourceTable(csvReader.get(3)); 034 relation.setSourceColumn(csvReader.get(5)); 035 relation.setTargetDb(csvReader.get(6)); 036 relation.setTargetSchema(csvReader.get(7)); 037 relation.setTargetTable(csvReader.get(9)); 038 relation.setTargetColumn(csvReader.get(11)); 039 relation.setRelationType(RelationshipType.of(csvReader.get(12)).name()); 040 relations.add(relation); 041 } else if (headers.length >= 8) { 042 MetadataRelation relation = new MetadataRelation(); 043 relation.setSourceDb(csvReader.get(0)); 044 relation.setSourceSchema(csvReader.get(1)); 045 relation.setSourceTable(csvReader.get(2)); 046 relation.setSourceColumn(csvReader.get(3)); 047 relation.setTargetDb(csvReader.get(4)); 048 relation.setTargetSchema(csvReader.get(5)); 049 relation.setTargetTable(csvReader.get(6)); 050 relation.setTargetColumn(csvReader.get(7)); 051 if (headers.length >= 9) { 052 relation.setProcedureName(csvReader.get(8)); 053 } 054 if (headers.length >= 10) { 055 relation.setQueryName(csvReader.get(9)); 056 } 057 relations.add(relation); 058 } 059 } 060 } 061 } catch (Exception e) { 062 063 } finally { 064 csvReader.close(); 065 } 066 return relations; 067 } 068 069 public static boolean isMetadata(String metadata) { 070 if (SQLUtil.isEmpty(metadata)) { 071 return false; 072 } 073 CsvReader csvReader = CsvReader.parse(metadata); 074 csvReader.setSkipEmptyRecords(true); 075 csvReader.setTrimWhitespace(true); 076 try { 077 if (csvReader.readHeaders()) { 078 String[] headers = csvReader.getHeaders(); 079 if (headers[0].toLowerCase().trim().startsWith("source_db")) { 080 return true; 081 } 082 } 083 } catch (Exception e) { 084 085 } finally { 086 csvReader.close(); 087 } 088 return false; 089 } 090 091 public static boolean isGrabit(String metadata) { 092 if (SQLUtil.isEmpty(metadata)) { 093 return false; 094 } 095 try { 096 Map json = (Map) JSON.parseObject(metadata.trim()); 097 String createdBy = (String) json.get("createdBy"); 098 if (createdBy != null && createdBy.toLowerCase().indexOf("grabit") != -1) { 099 return true; 100 } 101 } catch (Exception e) { 102 } 103 return false; 104 } 105 106 public static boolean isSqlflow(String metadata) { 107 if (SQLUtil.isEmpty(metadata)) { 108 return false; 109 } 110 try { 111 Map json = (Map) JSON.parseObject(metadata.trim()); 112 String createdBy = (String) json.get("createdBy"); 113 if (createdBy != null && createdBy.toLowerCase().indexOf("sqlflow") != -1) { 114 return true; 115 } 116 } catch (Exception e) { 117 } 118 return false; 119 } 120}