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