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}