Skip to content

Commit 295a346

Browse files
cnfreecnfree
authored andcommitted
【sqldep_teradata_etl】包含星号的SQL在获取获取TableColumn信息的SQL之前出现,识别不到Column #416
1 parent 52cb480 commit 295a346

File tree

1 file changed

+141
-13
lines changed

1 file changed

+141
-13
lines changed

src/main/java/demos/dlineage/DataFlowAnalyzer.java

Lines changed: 141 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.LinkedList;
1919
import java.util.List;
2020
import java.util.Map;
21+
import java.util.Optional;
2122
import java.util.Random;
2223
import java.util.Set;
2324
import java.util.Stack;
@@ -2067,7 +2068,7 @@ private void analyzeInsertStmt(TInsertSqlStatement stmt) {
20672068
List<TableColumn> tableColumns = tableColumnMap.get(tableModel.getName());
20682069
List<TObjectName> keyMap = insertTableKeyMap.get(tableModel);
20692070
List<TResultColumn> valueMap = insertTableValueMap.get(tableModel);
2070-
boolean initColumn = tableColumns != null;
2071+
boolean initColumn = (tableColumns != null && !containStarColumn(tableColumns));
20712072

20722073
if (stmt.getSubQuery() != null) {
20732074

@@ -2147,7 +2148,9 @@ private void analyzeInsertStmt(TInsertSqlStatement stmt) {
21472148
if (!initColumn) {
21482149
tableColumn = modelFactory.createInsertTableColumn(tableModel,
21492150
(TObjectName) resultColumn.getColumnObject());
2150-
2151+
if(containStarColumn(tableColumns)){
2152+
getStarColumn(tableColumns).getStarLinkColumns().add((TObjectName) resultColumn.getColumnObject());
2153+
}
21512154
} else {
21522155
TObjectName matchedColumnName = (TObjectName) resultColumn.getColumnObject();
21532156
tableColumn = matchColumn(tableColumns, matchedColumnName);
@@ -2187,6 +2190,9 @@ private void analyzeInsertStmt(TInsertSqlStatement stmt) {
21872190
if (!initColumn) {
21882191
tableColumn = modelFactory.createInsertTableColumn(tableModel,
21892192
alias.getAliasName());
2193+
if(containStarColumn(tableColumns)){
2194+
getStarColumn(tableColumns).getStarLinkColumns().add(alias.getAliasName());
2195+
}
21902196
} else {
21912197
TObjectName matchedColumnName = alias.getAliasName();
21922198
tableColumn = matchColumn(tableColumns, matchedColumnName);
@@ -2462,7 +2468,18 @@ private void analyzeInsertStmt(TInsertSqlStatement stmt) {
24622468
}
24632469
}
24642470

2471+
private TableColumn getStarColumn(List<TableColumn> columns) {
2472+
for(TableColumn column: columns){
2473+
if(column.getName().endsWith("*")){
2474+
return column;
2475+
}
2476+
}
2477+
return null;
2478+
}
2479+
24652480
private boolean containStarColumn(List<TableColumn> columns) {
2481+
if(columns == null)
2482+
return false;
24662483
for(TableColumn column: columns){
24672484
if(column.getName().endsWith("*")){
24682485
return true;
@@ -3088,16 +3105,11 @@ private void appendRelation(dataflow dataflow, Relation[] relations, Class<? ext
30883105
Object targetElement = relation.getTarget().getElement();
30893106
if (targetElement instanceof ResultColumn) {
30903107
ResultColumn targetColumn = (ResultColumn) targetElement;
3091-
if (!targetColumn.getStarLinkColumns().isEmpty()) {
3092-
for (int j = 0; j < targetColumn.getStarLinkColumns().size(); j++) {
3093-
appendStarRelation(dataflow, relation, j);
3094-
}
3095-
if (!relation.isShowStarRelation()) {
3096-
continue;
3097-
}
3108+
3109+
if("*".equals(targetColumn.getName()) && targetColumn.getStarLinkColumns().isEmpty()){
3110+
updateResultColumnStarLinks(dataflow, targetColumn, relation.getSources());
30983111
}
3099-
} else if (targetElement instanceof ViewColumn) {
3100-
ViewColumn targetColumn = (ViewColumn) targetElement;
3112+
31013113
if (!targetColumn.getStarLinkColumns().isEmpty()) {
31023114
for (int j = 0; j < targetColumn.getStarLinkColumns().size(); j++) {
31033115
appendStarRelation(dataflow, relation, j);
@@ -3108,6 +3120,11 @@ private void appendRelation(dataflow dataflow, Relation[] relations, Class<? ext
31083120
}
31093121
} else if (targetElement instanceof TableColumn) {
31103122
TableColumn targetColumn = (TableColumn) targetElement;
3123+
3124+
if("*".equals(targetColumn.getName()) && targetColumn.getStarLinkColumns().isEmpty()){
3125+
updateTableColumnStarLinks(dataflow, targetColumn, relation.getSources());
3126+
}
3127+
31113128
if (!targetColumn.getStarLinkColumns().isEmpty()) {
31123129
for (int j = 0; j < targetColumn.getStarLinkColumns().size(); j++) {
31133130
appendStarRelation(dataflow, relation, j);
@@ -3458,6 +3475,117 @@ private void appendRelation(dataflow dataflow, Relation[] relations, Class<? ext
34583475
}
34593476
}
34603477

3478+
3479+
3480+
private void updateResultColumnStarLinks(dataflow dataflow, ResultColumn targetColumn,
3481+
RelationElement<?>[] sourceElements) {
3482+
if (sourceElements == null || sourceElements.length == 0)
3483+
return;
3484+
3485+
for (int j = 0; j < sourceElements.length; j++) {
3486+
Object sourceElement = sourceElements[j].getElement();
3487+
if (sourceElement instanceof ResultColumn) {
3488+
ResultColumn source = (ResultColumn)sourceElement;
3489+
if (source.getStarLinkColumns() != null && !source.getStarLinkColumns().isEmpty()) {
3490+
targetColumn.getStarLinkColumns().addAll(source.getStarLinkColumns());
3491+
}
3492+
else if (!"*".equals(source.getName())) {
3493+
if (source.getColumnObject() instanceof TObjectName) {
3494+
targetColumn.getStarLinkColumns().add((TObjectName) source.getColumnObject());
3495+
} else if (source.getColumnObject() instanceof TResultColumn) {
3496+
TObjectName field = ((TResultColumn) source.getColumnObject()).getFieldAttr();
3497+
if (field != null) {
3498+
targetColumn.getStarLinkColumns().add(field);
3499+
}
3500+
}
3501+
}
3502+
} else if (sourceElement instanceof TableColumn) {
3503+
TableColumn source = (TableColumn)sourceElement;
3504+
if(source.getStarLinkColumns()!=null){
3505+
targetColumn.getStarLinkColumns().addAll(source.getStarLinkColumns());
3506+
}
3507+
else if (!"*".equals(source.getName())) {
3508+
targetColumn.getStarLinkColumns().add(source.getColumnObject());
3509+
}
3510+
}
3511+
}
3512+
3513+
if(!targetColumn.getStarLinkColumns().isEmpty()){
3514+
table resultSetElement = dataflow.getResultsets().stream().filter(t->t.getId().equals(String.valueOf(targetColumn.getResultSet().getId()))).findFirst().get();
3515+
for (int k = 0; k < targetColumn.getStarLinkColumns().size(); k++) {
3516+
column columnElement = new column();
3517+
columnElement.setId( String.valueOf(targetColumn.getId()) + "_" + k);
3518+
TObjectName column = targetColumn.getStarLinkColumns().get(k);
3519+
String columnName = getColumnName(column);
3520+
columnElement.setName(columnName);
3521+
if(targetColumn.isFunction()){
3522+
columnElement.setIsFunction(String.valueOf(targetColumn.isFunction()));
3523+
}
3524+
if (targetColumn.getStartPosition() != null && targetColumn.getEndPosition() != null) {
3525+
columnElement.setCoordinate(
3526+
targetColumn.getStartPosition() + "," + targetColumn.getEndPosition());
3527+
}
3528+
resultSetElement.getColumns().add(columnElement);
3529+
}
3530+
}
3531+
}
3532+
3533+
private void updateTableColumnStarLinks(dataflow dataflow, TableColumn targetColumn, RelationElement<?>[] sourceElements) {
3534+
if (sourceElements == null || sourceElements.length == 0)
3535+
return;
3536+
3537+
for (int j = 0; j < sourceElements.length; j++) {
3538+
Object sourceElement = sourceElements[j].getElement();
3539+
if (sourceElement instanceof ResultColumn) {
3540+
ResultColumn source = (ResultColumn)sourceElement;
3541+
if (source.getStarLinkColumns() != null && !source.getStarLinkColumns().isEmpty()) {
3542+
targetColumn.getStarLinkColumns().addAll(source.getStarLinkColumns());
3543+
}
3544+
else if (!"*".equals(source.getName())) {
3545+
if (source.getColumnObject() instanceof TObjectName) {
3546+
targetColumn.getStarLinkColumns().add((TObjectName) source.getColumnObject());
3547+
} else if (source.getColumnObject() instanceof TResultColumn) {
3548+
TObjectName field = ((TResultColumn) source.getColumnObject()).getFieldAttr();
3549+
if (field != null) {
3550+
targetColumn.getStarLinkColumns().add(field);
3551+
}
3552+
}
3553+
}
3554+
} else if (sourceElement instanceof TableColumn) {
3555+
TableColumn source = (TableColumn)sourceElement;
3556+
if(source.getStarLinkColumns()!=null){
3557+
targetColumn.getStarLinkColumns().addAll(source.getStarLinkColumns());
3558+
}
3559+
else if (!"*".equals(source.getName())) {
3560+
targetColumn.getStarLinkColumns().add(source.getColumnObject());
3561+
}
3562+
}
3563+
}
3564+
3565+
if (!targetColumn.getStarLinkColumns().isEmpty()) {
3566+
Optional<table> tableElement = dataflow.getTables().stream()
3567+
.filter(t -> t.getId().equals(String.valueOf(targetColumn.getTable().getId()))).findFirst();
3568+
if (!tableElement.isPresent()) {
3569+
tableElement = dataflow.getViews().stream()
3570+
.filter(t -> t.getId().equals(String.valueOf(targetColumn.getTable().getId()))).findFirst();
3571+
}
3572+
if (tableElement.isPresent()) {
3573+
for (int k = 0; k < targetColumn.getStarLinkColumns().size(); k++) {
3574+
column columnElement = new column();
3575+
columnElement.setId(String.valueOf(targetColumn.getId()) + "_" + k);
3576+
TObjectName column = targetColumn.getStarLinkColumns().get(k);
3577+
String columnName = getColumnName(column);
3578+
columnElement.setName(columnName);
3579+
if (targetColumn.getStartPosition() != null && targetColumn.getEndPosition() != null) {
3580+
columnElement
3581+
.setCoordinate(targetColumn.getStartPosition() + "," + targetColumn.getEndPosition());
3582+
}
3583+
tableElement.get().getColumns().add(columnElement);
3584+
}
3585+
}
3586+
}
3587+
}
3588+
34613589
private ESqlClause getSqlClause(RelationElement<?> relationElement) {
34623590
if (relationElement instanceof TableColumnRelationElement) {
34633591
return ((TableColumnRelationElement) relationElement).getRelationLocation();
@@ -6708,11 +6836,11 @@ public boolean exprVisit(TParseTreeNode pNode, boolean isLeafNode) {
67086836
}
67096837

67106838
public static String getVersion() {
6711-
return "1.3.6";
6839+
return "1.3.7";
67126840
}
67136841

67146842
public static String getReleaseDate() {
6715-
return "2020-09-03";
6843+
return "2020-09-07";
67166844
}
67176845

67186846
public static void main(String[] args) {

0 commit comments

Comments
 (0)