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 != null) { 107 if (column.getTransforms() != null) { 108 addTransformsInReverse(source, column.getTransforms()); 109 } else if (column.getColumnObject() instanceof TResultColumn) { 110 TResultColumn columnObject = (TResultColumn) column.getColumnObject(); 111 TExpression expression = columnObject.getExpr(); 112 addExpressionTransform(source, expression); 113 } else if (column instanceof FunctionResultColumn) { 114 FunctionResultColumn functionColumn = (FunctionResultColumn) column; 115 if (functionColumn.getFunction() instanceof TFunctionCall) { 116 source.addTransform(Transform.FUNCTION, functionColumn.getFunction()); 117 } 118 if (functionColumn.getFunction() instanceof TCaseExpression) { 119 source.addTransform(Transform.CASE, functionColumn.getFunction()); 120 } 121 } else if (column.getColumnObject() instanceof TObjectName) { 122 source.addTransform(Transform.SIMPLE, (TObjectName) column.getColumnObject()); 123 } 124 } 125 126 if (source.getElement() instanceof ResultColumn) { 127 ResultColumn sourceColumn = (ResultColumn) source.getElement(); 128 if (column != null && sourceColumn.getName().equals("*") && column.getName().equals("*") && inferStar) { 129 column.appendStarSourceColumn(sourceColumn); 130 } 131 addTransformsInReverse(source, sourceColumn.getTransforms()); 132 } else if (source.getElement() instanceof TableColumn) { 133 TableColumn sourceColumn = (TableColumn) source.getElement(); 134 if (column != null && sourceColumn.getName().equals("*") && column.getName().equals("*") && inferStar) { 135 column.appendStarSourceColumn(sourceColumn); 136 } 137 addTransformsInReverse(source, sourceColumn.getTransforms()); 138 } 139 } else if (getTarget() instanceof ViewColumnRelationshipElement) { 140 TableColumn column = ((ViewColumnRelationshipElement) getTarget()).getElement(); 141 if (column.getTable() != null && column.getTable().getSqlStatement() instanceof TCreateViewSqlStatement) { 142 TCreateViewSqlStatement view = (TCreateViewSqlStatement) column.getTable().getSqlStatement(); 143 if (view.getSubquery() != null && column.getColumnObject() != null) { 144 source.addTransform(Transform.SIMPLE, column.getColumnObject()); 145 } 146 } 147 148 if (source.getElement() instanceof ResultColumn) { 149 ResultColumn sourceColumn = (ResultColumn) source.getElement(); 150 if (sourceColumn.getName().equals("*") && column.getName().equals("*") && inferStar) { 151 column.appendStarSourceColumn(sourceColumn); 152 } 153 addTransformsInReverse(source, sourceColumn.getTransforms()); 154 } else if (source.getElement() instanceof TableColumn) { 155 TableColumn sourceColumn = (TableColumn) source.getElement(); 156 if (sourceColumn.getName().equals("*") && column.getName().equals("*") && inferStar) { 157 column.appendStarSourceColumn(sourceColumn); 158 } 159 addTransformsInReverse(source, sourceColumn.getTransforms()); 160 } 161 } else if (getTarget() instanceof TableColumnRelationshipElement) { 162 if (source.getElement() instanceof ResultColumn) { 163 ResultColumn column = (ResultColumn) source.getElement(); 164 addTransformsInReverse(source, column.getTransforms()); 165 } 166 } else if (getTarget() == null && source.getElement() instanceof TableColumn) { 167 TableColumn column = (TableColumn) source.getElement(); 168 addTransformsInReverse(source, column.getTransforms()); 169 } 170 171 if (source.getElement() instanceof RelationRows<?>) { 172 ((RelationRows<?>) source.getElement()).setHasRelation(true); 173 } 174 } 175 } 176 177 protected void addExpressionTransform(RelationshipElement<?> source, TExpression expression) { 178 if (expression.getExpressionType() == EExpressionType.simple_object_name_t) { 179 source.addTransform(Transform.SIMPLE, expression); 180 } 181 else if (expression.getExpressionType() == EExpressionType.function_t) { 182 source.addTransform(Transform.FUNCTION, expression); 183 } 184 else if (expression.getExpressionType() == EExpressionType.simple_constant_t) { 185 source.addTransform(Transform.FUNCTION, expression); 186 } 187 else if (expression.getExpressionType() == EExpressionType.case_t) { 188 source.addTransform(Transform.CASE, expression); 189 } 190 else if (expression.getExpressionType() == EExpressionType.subquery_t) { 191 source.addTransform(Transform.SUBQUERY, expression); 192 } 193 else if (expression.getExpressionType() == EExpressionType.parenthesis_t) { 194 TExpression inner = expression.getLeftOperand(); 195 while (inner != null && inner.getExpressionType() == EExpressionType.parenthesis_t) { 196 inner = inner.getLeftOperand(); 197 } 198 if (inner != null) { 199 addExpressionTransform(source, inner); 200 } 201 } 202 else if (expression.getOperatorToken() != null) { 203 source.addTransform(Transform.EXPRESSION, expression); 204 } 205 } 206 207 public EffectType getEffectType() { 208 return effectType; 209 } 210 211 public void setEffectType(EffectType effectType) { 212 this.effectType = effectType; 213 } 214 215 public String getFunction() { 216 return function; 217 } 218 219 public void setFunction(String function) { 220 this.function = function; 221 } 222 223 public boolean isShowStarRelation() { 224 return showStarRelation; 225 } 226 227 public void setShowStarRelation(boolean showStarRelation) { 228 this.showStarRelation = showStarRelation; 229 } 230 231 public Process getProcess() { 232 return process; 233 } 234 235 public void setProcess(Process process) { 236 this.process = process; 237 } 238 239 240 public String getSqlHash() { 241 return sqlHash; 242 } 243 244 public String getSqlComment() { 245 return sqlComment; 246 } 247 248 public String getPartition() { 249 return partition; 250 } 251 252 public void setPartition(String partition) { 253 this.partition = partition; 254 } 255 256 public Long getProcedureId() { 257 return procedureId; 258 } 259 260 public void setProcedureId(Long procedureId) { 261 this.procedureId = procedureId; 262 } 263 264}