001package gudusoft.gsqlparser.dlineage.dataflow.model.xml;
002
003import java.util.LinkedHashSet;
004import java.util.Set;
005
006import javax.xml.bind.annotation.XmlAttribute;
007import javax.xml.bind.annotation.XmlElement;
008import javax.xml.bind.annotation.XmlElementWrapper;
009import javax.xml.bind.annotation.XmlTransient;
010import javax.xml.bind.annotation.XmlType;
011
012import gudusoft.gsqlparser.TSourceToken;
013import gudusoft.gsqlparser.dlineage.dataflow.model.ModelBindingManager;
014import gudusoft.gsqlparser.dlineage.dataflow.model.Transform;
015import gudusoft.gsqlparser.dlineage.util.DlineageUtil;
016import gudusoft.gsqlparser.dlineage.util.Pair3;
017import gudusoft.gsqlparser.util.SQLUtil;
018
019@XmlType(propOrder = { "id", "name", "column", "value", "source_id", "source_name", "column_type", "parent_id", "parent_name", "parent_alias",
020                "coordinate", "clauseType", "source", "type", "transforms", "candidateParents"})
021public class sourceColumn {
022
023        private String id;
024
025        private String name;
026        
027        private String column;
028
029        private String value;
030
031        private String source_id;
032
033        private String source_name;
034
035        private String column_type;
036
037        private String parent_id;
038
039        private String parent_name;
040        
041        private String parent_alias;
042
043        private String coordinate;
044
045        private String clauseType;
046
047        private String source;
048        
049        private String type;
050        
051        private Set<transform> transforms;
052        
053        private Set<candidateTable> candidateParents;
054        
055        @XmlTransient
056        private Boolean struct;
057
058        @XmlElementWrapper(name="candidateTables") 
059        @XmlElement(name="candidateTable", required = false)
060        public Set<candidateTable> getCandidateParents() {
061                if (ModelBindingManager.getGlobalOption()!=null && !ModelBindingManager.getGlobalOption().isShowCandidateTable()) {
062                        return null;
063                }
064                return candidateParents;
065        }
066        
067        public void setCandidateParents(Set<candidateTable> candidateParents) {
068                if (ModelBindingManager.getGlobalOption()!=null && !ModelBindingManager.getGlobalOption().isShowCandidateTable()) {
069                        return;
070                }
071                this.candidateParents = candidateParents;
072        }
073        
074        public void addCandidateParent(candidateTable candidateParent) {
075                if (ModelBindingManager.getGlobalOption()!=null && !ModelBindingManager.getGlobalOption().isShowCandidateTable()) {
076                        return;
077                }
078                if(candidateParent == null)
079                        return;
080                if(candidateParents == null) {
081                        candidateParents = new LinkedHashSet<candidateTable>();
082                }
083                candidateParents.add(candidateParent);
084        }
085        
086        @XmlElementWrapper(name="transforms") 
087        @XmlElement(name="transform", required = false)
088        public Set<transform> getTransforms() {
089                if (ModelBindingManager.getGlobalOption()!=null && !ModelBindingManager.getGlobalOption().isTransform()) {
090                        return null;
091                }
092                return transforms;
093        }
094        
095        public void setTransforms(Set<transform> transforms) {
096                if (ModelBindingManager.getGlobalOption()!=null && !ModelBindingManager.getGlobalOption().isTransform()) {
097                        return;
098                }
099                this.transforms = transforms;
100        }
101        
102        public void addTransform(Transform transform) {
103                if (ModelBindingManager.getGlobalOption()!=null && !ModelBindingManager.getGlobalOption().isTransform()) {
104                        return;
105                }
106                if(transform == null)
107                        return;
108                if(transforms == null) {
109                        transforms = new LinkedHashSet<transform>();
110                }
111                
112                transform t = new transform();
113                if (transform.getCode() != null) {
114                        if (ModelBindingManager.getGlobalOption().isTransformCoordinate()) {
115                                TSourceToken startToken = transform.getCode().getStartToken();
116                                TSourceToken endToken = transform.getCode().getEndToken();
117                                Pair3<Long, Long, String> startPosition = new Pair3<Long, Long, String>(startToken.lineNo,
118                                                startToken.columnNo, ModelBindingManager.getGlobalHash());
119                                Pair3<Long, Long, String> endPosition = new Pair3<Long, Long, String>(endToken.lineNo,
120                                                endToken.columnNo + SQLUtil.endTrim(endToken.astext).length(), ModelBindingManager.getGlobalHash());
121                                t.setCoordinate(convertCoordinate(startPosition) + "," + convertCoordinate(endPosition));
122                        }
123                        t.setCode(transform.getCode().toString());
124                } else if (!SQLUtil.isEmpty(transform.getCodeString())) {
125                        if (ModelBindingManager.getGlobalOption().isTransformCoordinate()) {
126                                TSourceToken startToken = transform.getStartToken();
127                                TSourceToken endToken = transform.getEndToken();
128                                Pair3<Long, Long, String> startPosition = new Pair3<Long, Long, String>(startToken.lineNo,
129                                                startToken.columnNo, ModelBindingManager.getGlobalHash());
130                                Pair3<Long, Long, String> endPosition = new Pair3<Long, Long, String>(endToken.lineNo,
131                                                endToken.columnNo + SQLUtil.endTrim(endToken.astext).length(), ModelBindingManager.getGlobalHash());
132                                t.setCoordinate(convertCoordinate(startPosition) + "," + convertCoordinate(endPosition));
133                        }
134                        t.setCode(transform.getCodeString());
135                }
136                t.setType(transform.getType());
137                transforms.add(t);
138        }
139        
140        public void addTransform(transform transform) {
141                if (ModelBindingManager.getGlobalOption()!=null && !ModelBindingManager.getGlobalOption().isTransform()) {
142                        return;
143                }
144                if(transform == null)
145                        return;
146                if(transforms == null) {
147                        transforms = new LinkedHashSet<transform>();
148                }
149                transforms.add(transform);
150        }
151        
152        private Pair3<Long, Long, Integer> convertCoordinate(Pair3<Long, Long, String> position) {
153                return new Pair3<Long, Long, Integer>(position.first, position.second,
154                                ModelBindingManager.getGlobalSqlInfo().getIndexOf(position.third));
155        }
156        
157        @XmlAttribute(required = false)
158        public String getCoordinate() {
159                if (ModelBindingManager.getGlobalOption()!=null && ModelBindingManager.getGlobalOption().isIgnoreCoordinate()) {
160                        return null;
161                }
162                return coordinate;
163        }
164
165        public void setCoordinate(String coordinate) {
166                if (ModelBindingManager.getGlobalOption()!=null && ModelBindingManager.getGlobalOption().isIgnoreCoordinate()) {
167                        return;
168                }
169                this.coordinate = coordinate;
170        }
171
172        @XmlAttribute(required = false)
173        public String getColumn() {
174                return column;
175        }
176
177        public void setColumn(String column) {
178                this.column = column;
179        }
180
181        @XmlAttribute(required = false)
182        public String getId() {
183                return id;
184        }
185
186        public void setId(String id) {
187                this.id = id;
188        }
189
190        @XmlAttribute(name = "parent_id", required = false)
191        public String getParent_id() {
192                return parent_id;
193        }
194
195        public void setParent_id(String parent_id) {
196                this.parent_id = parent_id;
197        }
198
199        @XmlAttribute(name = "parent_name", required = false)
200        public String getParent_name() {
201                return parent_name;
202        }
203
204        public void setParent_name(String parent_name) {
205                this.parent_name = parent_name;
206        }
207        
208        @XmlAttribute(name = "parent_alias", required = false)
209        public String getParent_alias() {
210                return parent_alias;
211        }
212
213        public void setParent_alias(String parent_alias) {
214                this.parent_alias = parent_alias;
215        }
216
217        @XmlAttribute(required = false)
218        public String getValue() {
219                return value;
220        }
221
222        public void setValue(String value) {
223                this.value = value;
224        }
225
226        @XmlAttribute(name = "source_name", required = false)
227        public String getSource_name() {
228                return source_name;
229        }
230
231        public void setSource_name(String source_name) {
232                this.source_name = source_name;
233        }
234
235        @XmlAttribute(name = "source_id", required = false)
236        public String getSource_id() {
237                return source_id;
238        }
239
240        public void setSource_id(String source_id) {
241                this.source_id = source_id;
242        }
243
244        @XmlAttribute(required = false)
245        public String getClauseType() {
246                return clauseType;
247        }
248
249        public void setClauseType(String clauseType) {
250                this.clauseType = clauseType;
251        }
252
253        @XmlAttribute(name = "column_type", required = false)
254        public String getColumn_type() {
255                return column_type;
256        }
257
258        public void setColumn_type(String column_type) {
259                this.column_type = column_type;
260        }
261
262        @XmlAttribute(required = false)
263        public String getSource() {
264                return source;
265        }
266
267        public void setSource(String source) {
268                this.source = source;
269        }
270        
271        @XmlAttribute(required = false)
272        public String getType() {
273                return type;
274        }
275
276        public void setType(String type) {
277                this.type = type;
278        }
279
280        @Override
281        public int hashCode() {
282                final int prime = 31;
283                int result = 1;
284                String columnName = getColumnName(this);
285                result = prime * result + ((columnName == null) ? 0 : columnName.hashCode());
286                result = prime * result + ((coordinate == null) ? 0 : coordinate.hashCode());
287                result = prime * result + ((parent_id == null) ? 0 : parent_id.hashCode());
288                return result;
289        }
290
291        private String getColumnName(sourceColumn column) {
292                if ("constant".equals(column.getColumn_type())) {
293                        return column.column;
294                }
295                if (ModelBindingManager.getGlobalVendor() != null) {
296                        return DlineageUtil.getIdentifierNormalColumnName(column.column);
297                }
298                return column.column;
299        }
300
301        @Override
302        public boolean equals(Object obj) {
303                if (this == obj)
304                        return true;
305                if (obj == null)
306                        return false;
307                if (getClass() != obj.getClass())
308                        return false;
309                sourceColumn other = (sourceColumn) obj;
310                if (column == null) {
311                        if (other.column != null)
312                                return false;
313                } else if (!getColumnName(this).equals(getColumnName(other)))
314                        return false;
315                if (coordinate == null) {
316                        if (other.coordinate != null)
317                                return false;
318                } else if (coordinate.hashCode() != other.coordinate.hashCode())
319                        return false;
320                if (parent_id == null) {
321                        if (other.parent_id != null)
322                                return false;
323                } else if (!parent_id.equals(other.parent_id))
324                        return false;
325                return true;
326        }
327
328        @XmlAttribute(required = false)
329        public String getName() {
330                return name;
331        }
332
333        public void setName(String name) {
334                this.name = name;
335        }
336
337        @XmlTransient
338        public Boolean isStruct() {
339                return struct;
340        }
341
342        public void setStruct(Boolean struct) {
343                this.struct = struct;
344        }
345}