001 002package gudusoft.gsqlparser.dlineage.dataflow.model; 003 004import gudusoft.gsqlparser.EExpressionType; 005import gudusoft.gsqlparser.TCustomSqlStatement; 006import gudusoft.gsqlparser.dlineage.util.DlineageUtil; 007import gudusoft.gsqlparser.nodes.*; 008import gudusoft.gsqlparser.stmt.TCreateViewSqlStatement; 009 010import java.util.Collection; 011import java.util.LinkedHashSet; 012import java.util.List; 013import java.util.Set; 014 015public abstract class AbstractRelationship implements Relationship { 016 017 private long id; 018 019 private String function; 020 021 private EffectType effectType; 022 023 private String partition; 024 025 private boolean showStarRelation; 026 027 protected RelationshipElement<?> target; 028 029 protected Set<RelationshipElement<?>> sources = new LinkedHashSet<RelationshipElement<?>>(); 030 031 private Process process; 032 033 private String sqlHash; 034 035 private Long procedureId; 036 037 private String sqlComment; 038 039 public AbstractRelationship() { 040 id = ++ModelBindingManager.get().RELATION_ID; 041 } 042 043 public long getId() { 044 return id; 045 } 046 047 public RelationshipElement<?> getTarget() { 048 return target; 049 } 050 051 public void setTarget(RelationshipElement<?> target) { 052 this.target = target; 053 if(target.getElement() instanceof RelationRows<?>){ 054 ((RelationRows<?>)target.getElement()).holdRelation(this); 055 ((RelationRows<?>)target.getElement()).setHasRelation(true); 056 } 057 058 TCustomSqlStatement stmt = DlineageUtil.getTopStmt(ModelBindingManager.getGlobalStmtStack().peek()); 059 060 if(ModelBindingManager.getGlobalOption().isTraceSQL()) { 061 this.sqlHash = ModelBindingManager.get().getSqlHash(stmt); 062 try { 063 this.sqlComment = stmt.getCommentBeforeNode(); 064 } catch (Exception e) { 065 } 066 } 067 068 if(ModelBindingManager.getGlobalOption().isTraceProcedure()) { 069 Object model = ModelBindingManager.get().getModel(stmt); 070 if(model instanceof Procedure) { 071 this.procedureId = ((Procedure)model).getId(); 072 } 073 } 074 } 075 076 public Collection<RelationshipElement<?>> getSources() { 077 return sources; 078 } 079 080 public void addSource(RelationshipElement<?> source) { 081 addSource(source, true); 082 } 083 084 private void addTransformsInReverse(RelationshipElement<?> source, List<Transform> transforms) { 085 if (transforms == null) return; 086 for (int i = transforms.size() - 1; i >= 0; i--) { 087 Transform transform = transforms.get(i); 088 source.addTransform(transform.getType(), transform.getCode()); 089 } 090 } 091 092 public void addSource(RelationshipElement<?> source, boolean inferStar) { 093 if (source != null && !sources.contains(source)) { 094 sources.add(source); 095 096 Object obj = source.getElement(); 097 if (obj instanceof ResultColumn) { 098 ResultSet resultSet = ((ResultColumn) obj).getResultSet(); 099 if (resultSet.isTarget() && !(resultSet instanceof Function)) { 100 resultSet.setTarget(false); 101 } 102 } 103 104 if (getTarget() instanceof ResultColumnRelationshipElement) { 105 ResultColumn column = ((ResultColumnRelationshipElement) getTarget()).getElement(); 106 if (column.getTransforms() != null) { 107 addTransformsInReverse(source, column.getTransforms()); 108 } else if (column.getColumnObject() instanceof TResultColumn) { 109 TResultColumn columnObject = (TResultColumn) column.getColumnObject(); 110 TExpression expression = columnObject.getExpr(); 111 addExpressionTransform(source, expression); 112 } else if (column instanceof FunctionResultColumn) { 113 FunctionResultColumn functionColumn = (FunctionResultColumn) column; 114 if (functionColumn.getFunction() instanceof TFunctionCall) { 115 source.addTransform(Transform.FUNCTION, functionColumn.getFunction()); 116 } 117 if (functionColumn.getFunction() instanceof TCaseExpression) { 118 source.addTransform(Transform.CASE, functionColumn.getFunction()); 119 } 120 } else if (column.getColumnObject() instanceof TObjectName) { 121 source.addTransform(Transform.SIMPLE, (TObjectName) column.getColumnObject()); 122 } 123 124 if (source.getElement() instanceof ResultColumn) { 125 ResultColumn sourceColumn = (ResultColumn) source.getElement(); 126 if (sourceColumn.getName().equals("*") && column.getName().equals("*") && inferStar) { 127 column.appendStarSourceColumn(sourceColumn); 128 } 129 addTransformsInReverse(source, sourceColumn.getTransforms()); 130 } else if (source.getElement() instanceof TableColumn) { 131 TableColumn sourceColumn = (TableColumn) source.getElement(); 132 if (sourceColumn.getName().equals("*") && column.getName().equals("*") && inferStar) { 133 column.appendStarSourceColumn(sourceColumn); 134 } 135 addTransformsInReverse(source, sourceColumn.getTransforms()); 136 } 137 } else if (getTarget() instanceof ViewColumnRelationshipElement) { 138 TableColumn column = ((ViewColumnRelationshipElement) getTarget()).getElement(); 139 if (column.getTable() != null && column.getTable().getSqlStatement() instanceof TCreateViewSqlStatement) { 140 TCreateViewSqlStatement view = (TCreateViewSqlStatement) column.getTable().getSqlStatement(); 141 if (view.getSubquery() != null && column.getColumnObject() != null) { 142 source.addTransform(Transform.SIMPLE, column.getColumnObject()); 143 } 144 } 145 146 if (source.getElement() instanceof ResultColumn) { 147 ResultColumn sourceColumn = (ResultColumn) source.getElement(); 148 if (sourceColumn.getName().equals("*") && column.getName().equals("*") && inferStar) { 149 column.appendStarSourceColumn(sourceColumn); 150 } 151 addTransformsInReverse(source, sourceColumn.getTransforms()); 152 } else if (source.getElement() instanceof TableColumn) { 153 TableColumn sourceColumn = (TableColumn) source.getElement(); 154 if (sourceColumn.getName().equals("*") && column.getName().equals("*") && inferStar) { 155 column.appendStarSourceColumn(sourceColumn); 156 } 157 addTransformsInReverse(source, sourceColumn.getTransforms()); 158 } 159 } else if (getTarget() instanceof TableColumnRelationshipElement) { 160 if (source.getElement() instanceof ResultColumn) { 161 ResultColumn column = (ResultColumn) source.getElement(); 162 addTransformsInReverse(source, column.getTransforms()); 163 } 164 } else if (getTarget() == null && source.getElement() instanceof TableColumn) { 165 TableColumn column = (TableColumn) source.getElement(); 166 addTransformsInReverse(source, column.getTransforms()); 167 } 168 169 if (source.getElement() instanceof RelationRows<?>) { 170 ((RelationRows<?>) source.getElement()).setHasRelation(true); 171 } 172 } 173 } 174 175 protected void addExpressionTransform(RelationshipElement<?> source, TExpression expression) { 176 if (expression.getExpressionType() == EExpressionType.simple_object_name_t) { 177 source.addTransform(Transform.SIMPLE, expression); 178 } 179 else if (expression.getExpressionType() == EExpressionType.function_t) { 180 source.addTransform(Transform.FUNCTION, expression); 181 } 182 else if (expression.getExpressionType() == EExpressionType.simple_constant_t) { 183 source.addTransform(Transform.FUNCTION, expression); 184 } 185 else if (expression.getExpressionType() == EExpressionType.case_t) { 186 source.addTransform(Transform.CASE, expression); 187 } 188 else if (expression.getExpressionType() == EExpressionType.subquery_t) { 189 source.addTransform(Transform.SUBQUERY, expression); 190 } 191 else if (expression.getExpressionType() == EExpressionType.parenthesis_t) { 192 addExpressionTransform(source, expression.getLeftOperand()); 193 } 194 else if (expression.getOperatorToken() != null) { 195 source.addTransform(Transform.EXPRESSION, expression); 196 } 197 } 198 199 public EffectType getEffectType() { 200 return effectType; 201 } 202 203 public void setEffectType(EffectType effectType) { 204 this.effectType = effectType; 205 } 206 207 public String getFunction() { 208 return function; 209 } 210 211 public void setFunction(String function) { 212 this.function = function; 213 } 214 215 public boolean isShowStarRelation() { 216 return showStarRelation; 217 } 218 219 public void setShowStarRelation(boolean showStarRelation) { 220 this.showStarRelation = showStarRelation; 221 } 222 223 public Process getProcess() { 224 return process; 225 } 226 227 public void setProcess(Process process) { 228 this.process = process; 229 } 230 231 232 public String getSqlHash() { 233 return sqlHash; 234 } 235 236 public String getSqlComment() { 237 return sqlComment; 238 } 239 240 public String getPartition() { 241 return partition; 242 } 243 244 public void setPartition(String partition) { 245 this.partition = partition; 246 } 247 248 public Long getProcedureId() { 249 return procedureId; 250 } 251 252 public void setProcedureId(Long procedureId) { 253 this.procedureId = procedureId; 254 } 255 256}