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}