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}