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}