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}