001package gudusoft.gsqlparser.nodes; 002 003import gudusoft.gsqlparser.*; 004import gudusoft.gsqlparser.nodes.couchbase.TUpdateFor; 005import gudusoft.gsqlparser.nodes.teradata.TDataConversion; 006import gudusoft.gsqlparser.nodes.teradata.TDataConversionItem; 007import gudusoft.gsqlparser.sqlenv.IdentifierService; 008import gudusoft.gsqlparser.sqlenv.TSQLEnv; 009 010import java.util.ArrayList; 011 012import static gudusoft.gsqlparser.sqlenv.ESQLDataObjectType.dotColumn; 013 014/** 015* This class represents select_list item in select statement, lets you specify the columns you want to retrieve from the table. 016 *<p>Syntax: 017 * <blockquote><pre> 018 * query_name|[schema.]{table|view|materialized_view}|expr [ [AS] alias]</pre> 019 * </blockquote> 020 * 021 * 022 *<p>or, set column values in update_set_clause. 023 *<p>Syntax: 024 *<p><blockquote>column = expr|(subquery) </blockquote> 025 * 026 * <p>or, values clause in insert statement was represented by {@link TResultColumnList}. 027 *<p>Syntax: 028 *<p><blockquote><pre>(expr,expr) </pre></blockquote> 029 * 030*/ 031public class TResultColumn extends TNodeWithAliasClause implements Comparable{ 032 033 034 // sparksql: select explode(str_to_map(regexp_replace(regexp_replace(regexp_replace(lower(t.input), '', ''), '',''), '', ''), '', '')) as (`key`, `value`) from B t1 035 // select t.a1, t.a2, stack(2, 'T', t.a1, t.a2, t.a3/t.a4, t.a5/t.a6, 'T+0', t.a7, t.a8, t.a9/t.a10, t.a11/t.a12) as (b1, b2, b3, b4, b5) from db1.table1 t 036 // explode and stack functions are used to convert array or map into rows and create new column names 037 private ArrayList<TObjectName> aliasNameList = null; 038 039 public ArrayList<TObjectName> getAliasNameList() { 040 if (aliasNameList == null) { 041 aliasNameList = new ArrayList<>(); 042 } 043 return aliasNameList; 044 } 045 046 private ArrayList<TObjectName> attributesFromUpLevelReferenceToStarColumn; 047 048 /** 049 * 这个属性只对 star column 有效。用来存放在 up level 中找到的关联到本 star column 的 column, 050 * 主要用来把来自 up level 的这些 column 继续和 本层 from clause 中的 table 关联起来, 051 * 以解决 up level column 来自低层哪个 table 的问题 052 * 053 * 实现代码见:TStarColumnPushDownResolver.preVisit(TSelectSqlStatement stmt), 054 * TAttributeNode.addAttributeRefToThisNode(TObjectName objectName) 055 * 056 * @return 057 */ 058 public ArrayList<TObjectName> getAttributesFromUpLevelReferenceToStarColumn() { 059 if (attributesFromUpLevelReferenceToStarColumn == null){ 060 attributesFromUpLevelReferenceToStarColumn = new ArrayList<>(); 061 } 062 return attributesFromUpLevelReferenceToStarColumn; 063 } 064 065 private String aliasName; 066 067 public void setAliasName(String aliasName) { 068 this.aliasName = aliasName; 069 } 070 071 public String getAliasName() { 072 return aliasName; 073 } 074 075 private ArrayList<TReplaceExprAsIdentifier> exprAsIdentifiers; 076 077 /** 078 * BigQuery replace columns 079 * <br> 080 * SELECT * REPLACE (quantity/2 AS quantity) 081 * 082 * @return replace expr as identifier list 083 */ 084 public ArrayList<TReplaceExprAsIdentifier> getExprAsIdentifiers() { 085 return exprAsIdentifiers; 086 } 087 088 /** 089 * Bigquery except columns 090 * SELECT COMMON.* EXCEPT (column1, column2) FROM dataset1.table1 COMMON; 091 * 092 * @return Bigquery except columns 093 */ 094 public TObjectNameList getExceptColumnList() { 095 return exceptColumnList; 096 } 097 098 private TObjectNameList exceptColumnList; 099 100 /** 101 * BigQuery select * except(expr as identifier) 102 * @return 103 */ 104 public ArrayList<TReplaceExprAsIdentifier> getReplaceExprAsIdentifiers() { 105 return replaceExprAsIdentifiers; 106 } 107 108 private ArrayList<TReplaceExprAsIdentifier> replaceExprAsIdentifiers; 109 110 private TQualifyClause qualifyClause; 111 112 public void setQualifyClause(TQualifyClause qualifyClause) { 113 this.qualifyClause = qualifyClause; 114 } 115 116 public TQualifyClause getQualifyClause() { 117 118 return qualifyClause; 119 } 120 121 public void setDataTypeConversionList(TPTNodeList<TExplicitDataTypeConversion> dataTypeConversionList) { 122 expr.setDataTypeConversionList(dataTypeConversionList); 123 } 124 125 private TPTNodeList <TExplicitDataTypeConversion> dataTypeConversionList = null; // teradata 126 127 private TObjectNameList targetColumns = null; 128 129 public TObjectNameList getTargetColumns() { 130 if (targetColumns == null) targetColumns = new TObjectNameList(); 131 return targetColumns; 132 } 133 134 public boolean isMatchedUsingAlias(TObjectName pColumn){ 135 boolean lcResult = pColumn.getColumnNameOnly().equalsIgnoreCase(getColumnAlias()); 136 return lcResult; 137 } 138 139 public boolean isMatchedWithResultColumn(EDbVendor dbVendor, TObjectName pColumn){ 140 // boolean lcResult = pColumn.getColumnNameOnly().equalsIgnoreCase(getColumnAlias()); 141 //boolean lcResult = TSQLObject.compareTo(dbVendor, ESQLDataObjectType.dotColumn,pColumn.getColumnNameOnly(),getColumnAlias()) == 0; 142 boolean lcResult = TSQLEnv.compareIdentifier(dbVendor, dotColumn,pColumn.getColumnNameOnly(),getColumnAlias()); 143 if ((getColumnAlias().length() > 0) && (!lcResult)){ 144 return lcResult; 145 } 146 if (! lcResult) { 147 //lcResult = pColumn.getColumnNameOnly().equalsIgnoreCase(getColumnNameOnly()); 148 //lcResult = TSQLObject.compareTo(dbVendor, ESQLDataObjectType.dotColumn,pColumn.getColumnNameOnly(),getColumnNameOnly()) == 0; 149 lcResult = TSQLEnv.compareIdentifier(dbVendor, dotColumn,pColumn.getColumnNameOnly(),getColumnNameOnly()); 150 } 151 152 return lcResult; 153 } 154 155 public void TResultColumn(){ 156 157 } 158 159 /** 160 * This is the display name shown in the output of select list 161 * @return display name 162 */ 163 public String getDisplayName(){ 164 if (getAliasClause() != null) return getAliasClause().toString(); 165 String result = ""; 166 switch (expr.getExpressionType()){ 167 case sqlserver_proprietary_column_alias_t: 168 if (expr.getRightOperand().getExpressionType() == EExpressionType.simple_object_name_t){ 169 result = expr.getRightOperand().getObjectOperand().getColumnNameOnly(); 170 } 171 break; 172 case simple_object_name_t: 173 result = expr.getObjectOperand().getColumnNameOnly(); 174 break; 175 default: 176 result = toString(); 177 break; 178 } 179 return result; 180 } 181 182 public String getColumnAlias(){ 183 if (getAliasClause() != null) return getAliasClause().toString(); 184 else return ""; 185 } 186 187 public TObjectName getColumnFullname(){ 188 TObjectName result = null; 189 switch (expr.getExpressionType()){ 190 case sqlserver_proprietary_column_alias_t: 191 if (expr.getRightOperand().getExpressionType() == EExpressionType.simple_object_name_t){ 192 result = expr.getRightOperand().getObjectOperand(); 193 } 194 break; 195 case simple_object_name_t: 196 result = expr.getObjectOperand(); 197 break; 198 default: 199 break; 200 } 201 return result; 202 } 203 204 public String getColumnNameOnly(){ 205 String result = ""; 206 switch (expr.getExpressionType()){ 207 case sqlserver_proprietary_column_alias_t: 208 if (expr.getRightOperand().getExpressionType() == EExpressionType.simple_object_name_t){ 209 result = expr.getRightOperand().getObjectOperand().getColumnNameOnly(); 210 } 211 break; 212 case simple_object_name_t: 213 result = expr.getObjectOperand().getColumnNameOnly(); 214 break; 215 case typecast_t: 216 result = expr.getLeftOperand().toString(); 217 break; 218 default: 219 break; 220 } 221// if (expr.getExpressionType() == EExpressionType.simple_object_name_t) return expr.getObjectOperand().getColumnNameOnly(); 222// else return ""; 223 224 return result; 225 } 226 227 private TExpression expr = null; 228 229 public void setExpr(TExpression expr) { 230 this.expr = expr; 231 } 232 233 private boolean placeHolder = false; 234 235 public void setPlaceHolder(boolean placeHolder) { 236 this.placeHolder = placeHolder; 237 } 238 239 /** 240 * this is true when there is no column names specified for fields in teradata insert statement 241 * <p> 242 * INSERT INTO employee (10005, 'Orebo B',300,,,, 'Nov 17 1957','M',,,18,); 243 * @return 244 */ 245 public boolean isPlaceHolder(){ 246 return this.placeHolder; 247 } 248 /** 249 * column expression. 250 * If there is only column name in a select_list item, then, this expr is type of {@link TExpression#simpleObjectname}, 251 * <p>Otherwise, it maybe a complex expr, you should check {@link TExpression#getExpressionType}. 252 * <p>for column values in update_set_clause, this expr is type of {@link TExpression#ASSIGNMENT} 253 * @return 254 */ 255 public TExpression getExpr() { 256 return expr; 257 } 258 259 260 public void init(Object arg1) 261 { 262 if (arg1 instanceof TExpression){ 263 expr = (TExpression)arg1; 264 } 265 } 266 267 public void init(Object arg1, Object arg2) 268 { 269 init(arg1); 270 if (arg2 instanceof TAliasClause) { 271 this.setAliasClause((TAliasClause) arg2); 272 if (((TAliasClause) arg2).getAliasName() != null) { 273 ((TAliasClause) arg2).getAliasName().setObjectType(TObjectName.ttobjColumnAlias); 274 } 275 } 276 } 277 278 279 public void doParse(TCustomSqlStatement psql, ESqlClause plocation){ 280 if (this.isPlaceHolder()) return ; 281 282 if(psql.dbvendor == EDbVendor.dbvteradata){ 283 boolean foundNamedDataAttribute = false; 284 if (expr.getDataConversions().size() > 0 ){ 285 for(int i=0;i<expr.getDataConversions().size();i++){ 286 TDataConversion dataConversion = expr.getDataConversions().get(i); 287 for(int j=0;j<dataConversion.getDataConversionItems().size();j++){ 288 TDataConversionItem dataConversionItem = dataConversion.getDataConversionItems().get(j); 289 if (dataConversionItem.getDataConversionType() == TDataConversionItem.EDataConversionype.dataAttribute){ 290 TDatatypeAttribute datatypeAttribute = dataConversionItem.getDatatypeAttribute(); 291 if ((this.getAliasClause() == null) && (datatypeAttribute.getAttributeType() == EDataTypeAttribute.named_t)){ 292 TAliasClause aliasClause = new TAliasClause(); 293 294 aliasClause.init(datatypeAttribute.getNamedName()); 295 aliasClause.setStartToken(datatypeAttribute.getNamedName()); 296 aliasClause.setEndToken(datatypeAttribute.getNamedName()); 297 298 aliasClause.setTeradataNamedAlais(true); 299 aliasClause.setAsToken(datatypeAttribute.getStartToken()); 300 this.setAliasClause(aliasClause); 301 302 foundNamedDataAttribute = true; 303 break; 304 } 305 } 306 } 307 if (foundNamedDataAttribute) break; 308 } 309 } 310 311// if (expr.getDataTypeConversionList() != null){ 312// boolean namedAlias = false; 313// TDatatypeAttribute datatypeAttribute = null; 314// for(int i=0;i<expr.getDataTypeConversionList().size();i++){ 315// TExplicitDataTypeConversion e = expr.getDataTypeConversionList().getElement(i); 316// if (e.getDataTypeAttributeList1() == null) continue; 317// for(int j=0;j<e.getDataTypeAttributeList1().size();j++){ 318// datatypeAttribute = e.getDataTypeAttributeList1().getElement(j); 319// if (datatypeAttribute.getAttributeType() == EDataTypeAttribute.named_t){ 320// break; 321// }else { 322// datatypeAttribute = null; 323// } 324// } 325// if (datatypeAttribute != null) break; 326// } 327// 328// if (datatypeAttribute != null){ 329// if (datatypeAttribute.getAttributeType() == EDataTypeAttribute.named_t){ 330// TAliasClause aliasClause = new TAliasClause(); 331// if (datatypeAttribute.getValue_literal() != null){ 332// aliasClause.init(datatypeAttribute.getValue_literal()); 333// aliasClause.setStartToken(datatypeAttribute.getValue_literal().getStartToken()); 334// aliasClause.setEndToken(datatypeAttribute.getValue_literal().getEndToken()); 335// }else if (datatypeAttribute.getValue_identifier() != null){ 336// aliasClause.init(datatypeAttribute.getValue_identifier()); 337// aliasClause.setStartToken(datatypeAttribute.getValue_identifier()); 338// aliasClause.setEndToken(datatypeAttribute.getValue_identifier()); 339// } 340// aliasClause.setTeradataNamedAlais(true); 341// aliasClause.setAsToken(datatypeAttribute.getStartToken()); 342// this.setAliasClause(aliasClause); 343// namedAlias = true; 344// } 345// } 346// 347// if(!namedAlias){ 348// //expr.setEndToken(expr.getDataTypeConversion().getEndToken()); 349// } 350// 351// //this.setEndToken(expr.getEndToken()); 352// } 353 354 // select col1 (DATE) from tab1 355// if (expr.getExpressionType() == EExpressionType.function_t){ 356// TFunctionCall f = expr.getFunctionCall(); 357// if ((f.getArgs() != null)&&(f.getArgs().size() == 1)){ 358// if (f.getArgs().getExpression(0).toString().equalsIgnoreCase("date")){ 359// expr.setExpressionType(EExpressionType.simple_object_name_t); 360// f.getFunctionName().setDbObjectType(EDbObjectType.column); 361// f.getFunctionName().setPartToken(f.getFunctionName().getObjectToken()); 362// f.getFunctionName().setObjectToken(null); 363// expr.setObjectOperand(f.getFunctionName()); 364// expr.setStartToken(f.getFunctionName().getStartToken()); 365// expr.setEndToken(f.getFunctionName().getEndToken()); 366// // 367// TTypeName date1 = new TTypeName(); 368// date1.init(EDataType.date_t.date_t); 369// date1.setStartToken(f.getArgs().getExpression(0).getStartToken()); 370// date1.setEndToken(f.getArgs().getExpression(0).getEndToken()); 371// TExplicitDataTypeConversion dtc = new TExplicitDataTypeConversion(); 372// dtc.init(date1); 373// dtc.setStartToken(date1.getStartToken()); 374// dtc.setEndToken(date1.getEndToken()); 375// 376// TPTNodeList<TExplicitDataTypeConversion> dtcList = new TPTNodeList<TExplicitDataTypeConversion>(); 377// dtcList.addNode(dtc); 378// expr.setDataTypeConversionList(dtcList); 379// } 380// } 381// } 382 383 } 384 // change plocation when resultcolumn is in update or insert 385 if (plocation == ESqlClause.set){ 386 if (expr.getExpressionType() == EExpressionType.function_t){ 387 /* 388 * UPDATE Cities 389 * SET Location.SetXY(23.5, 23.5) 390 */ 391 //expr.getFunctionCall().getFunctionName().parseColumnMethodName(); 392 try{ 393 expr.getFunctionCall().getFunctionName().setObjectType(TObjectName.ttobjColumnMethod); 394 // expr.getFunctionCall().getFunctionName().setDbObjectType(EDbObjectType.method); 395 }catch (Exception e){ 396 TSourceToken st = expr.getStartToken(); 397 psql.parseerrormessagehandle(new TSyntaxError(st.getAstext(), st.lineNo, st.columnNo 398 ,"error function call in set clause", EErrorType.spfatalerror 399 , TBaseType.MSG_ERROR_FUNCTION_IN_SET_CLAUSE 400 ,psql,st.posinlist)); 401 } 402 if( (expr.getFunctionCall().getFunctionName().getPartToken()!=null)&&(psql.getTargetTable()!=null)){ 403 TObjectName columName = TObjectName.createObjectName (psql.dbvendor, EDbObjectType.column,expr.getFunctionCall().getFunctionName().getPartToken()); 404 psql.getTargetTable().getLinkedColumns().addObjectName (columName); 405 columName.setSourceTable(psql.getTargetTable()); 406 columName.setValidate_column_status(TBaseType.COLUMN_LINKED_TO_TABLE_IN_OLD_ALGORITHM); 407 }else{ 408 psql.linkColumnToTable(expr.getFunctionCall().getFunctionName(),plocation); 409 } 410 411 if (expr.getFunctionCall().getArgs() != null){ 412 for(int i=0;i<expr.getFunctionCall().getArgs().size();i++){ 413 expr.getFunctionCall().getArgs().doParse(psql,plocation); 414 } 415 } 416 // psql.linkColumnReferenceToTable( TGSqlParser.parseObjectName(psql.dbvendor, expr.getFunctionCall().getFunctionName().getPartToken().astext) ,plocation); 417 }else { 418 if (expr.getLeftOperand().getExpressionType() == EExpressionType.simple_object_name_t){ 419 expr.getLeftOperand().getObjectOperand().setLocation(plocation); 420 TTable lcTable = psql.tables.getTable(0); 421 if (lcTable.isLinkTable()) lcTable = lcTable.getLinkTable(); 422 lcTable.getLinkedColumns().addObjectName(expr.getLeftOperand().getObjectOperand()); 423 expr.getLeftOperand().getObjectOperand().setSourceTable(lcTable); 424 expr.getLeftOperand().getObjectOperand().setValidate_column_status(TBaseType.COLUMN_LINKED_TO_TABLE_IN_OLD_ALGORITHM); 425 lcTable.getObjectNameReferences().addObjectName(expr.getLeftOperand().getObjectOperand()); 426 expr.getRightOperand().doParse(psql,ESqlClause.setValue); 427 }else { 428 expr.doParse(psql,plocation); 429 } 430 } 431 //psql.linkColumnToTable() 432 }else if ( 433 (expr.getExpressionType() == EExpressionType.simple_comparison_t) 434 &&((psql.dbvendor == EDbVendor.dbvmssql)||(psql.dbvendor == EDbVendor.dbvsybase)) 435 &&( 436 (plocation == ESqlClause.resultColumn) 437 ||(plocation == ESqlClause.insertColumn) 438 ||(plocation == ESqlClause.mergeInsert) 439 ||(plocation == ESqlClause.selectList) 440 ) 441 442 ) 443 { 444 //@x in select @x = id is not a alias 445 if ( 446 (expr.getComparisonOperator().toString().equalsIgnoreCase("=")) 447 &&(!(expr.getLeftOperand().toString().startsWith("@"))) 448 ){ 449 //expr.setExpressionType(TExpression.sqlserver_proprietary_column_alias); 450 expr.setExpressionType(EExpressionType.sqlserver_proprietary_column_alias_t); 451 TAliasClause aliasClause = new TAliasClause(); 452 if (expr.getLeftOperand().getExpressionType() == EExpressionType.simple_object_name_t){ 453 aliasClause.init(expr.getLeftOperand().getObjectOperand()); 454 aliasClause.setStartToken(expr.getLeftOperand().getStartToken()); 455 aliasClause.setEndToken(expr.getLeftOperand().getEndToken()); 456 }else if (expr.getLeftOperand().getExpressionType() == EExpressionType.simple_constant_t){ 457 aliasClause.init(expr.getLeftOperand().getConstantOperand()); 458 aliasClause.setStartToken(expr.getLeftOperand().getStartToken()); 459 aliasClause.setEndToken(expr.getLeftOperand().getEndToken()); 460 } 461 setAliasClause(aliasClause); 462 } 463 expr.doParse(psql,plocation); 464 }else if((psql.dbvendor == EDbVendor.dbvpostgresql) 465 &&(expr.getExpressionType() == EExpressionType.simple_constant_t) 466 &&(plocation == ESqlClause.selectList) 467 &&(expr.getObjectOperand() != null)&&(expr.getExprAlias() != null) 468 ){// func_name Sconst /* generic type 'literal' syntax */ 469 expr.setExpressionType(EExpressionType.simple_object_name_t); 470 setAliasClause(expr.getExprAlias()); 471 getAliasClause().setStartToken(expr.getExprAlias().getStartToken()); 472 getAliasClause().setEndToken(expr.getExprAlias().getEndToken()); 473 expr.doParse(psql,plocation); 474 }else{ 475 expr.doParse(psql,plocation); 476 } 477 478 if (qualifyClause != null){ 479 qualifyClause.doParse(psql,plocation); 480 } 481 482// if ((expr.getFieldList() != null) && (psql.dbvendor == EDbVendor.dbvbigquery)){ 483// // SELECT COMMON.* EXCEPT (column1, column2) FROM dataset1.table1 COMMON; 484// this.exceptColumnList = expr.getFieldList(); 485// TTable table = psql.tables.getTable(0); 486// if (table != null){ 487// for(int i=0;i<this.exceptColumnList.size();i++){ 488// table.getLinkedColumns().addObjectName(this.exceptColumnList.getObjectName(i)); 489// this.exceptColumnList.getObjectName(i).setSourceTable(table); 490// } 491// } 492// } 493 494 if (expr.getExceptReplaceClause() != null){ 495 // SELECT COMMON.* EXCEPT (column1, column2) FROM dataset1.table1 COMMON; 496 this.exceptColumnList = expr.getExceptReplaceClause().getColumnList(); 497 498 // select * replace(expr as identifier) 499 this.replaceExprAsIdentifiers = expr.getExceptReplaceClause().getExprAsIdentifiers(); 500 501 TTable table = psql.tables.getTable(0); 502 if (table != null){ 503 if (this.exceptColumnList != null){ 504 for(int i=0;i<this.exceptColumnList.size();i++){ 505 table.getLinkedColumns().addObjectName(this.exceptColumnList.getObjectName(i)); 506 this.exceptColumnList.getObjectName(i).setSourceTable(table); 507 } 508 } 509 510 if (replaceExprAsIdentifiers != null){ 511 for(int i=0;i<replaceExprAsIdentifiers.size();i++){ 512 TReplaceExprAsIdentifier replaceExprAsIdentifier = replaceExprAsIdentifiers.get(i); 513 table.getLinkedColumns().addObjectName(replaceExprAsIdentifier.getIdentifier()); 514 replaceExprAsIdentifier.getIdentifier().setSourceTable(table); 515 } 516 } 517 } 518 519 } 520 } 521 522 523 /** 524 * 525 * @return this is used to provide back compatibility of .NET version only. 526 */ 527 public TObjectName getFieldAttr() { 528 TObjectName ret = null; 529 if (expr.getExpressionType() == EExpressionType.simple_object_name_t){ 530 ret = expr.getObjectOperand(); 531 } 532 return ret; 533 } 534 535 public String getPrefixTable(){ 536 if (getFieldAttr() == null) return ""; 537 return getFieldAttr().getTableString(); 538 } 539 540 public String getPrefixSchema(){ 541 if (getFieldAttr() == null) return ""; 542 return getFieldAttr().getSchemaString(); 543 } 544 545 public String getPrefixDatabase(){ 546 if (getFieldAttr() == null) return ""; 547 return getFieldAttr().getDatabaseString(); 548 } 549 550 public String getPrefixServer(){ 551 if (getFieldAttr() == null) return ""; 552 return getFieldAttr().getServerString(); 553 } 554 555 public void accept(TParseTreeVisitor v){ 556 v.preVisit(this); 557 v.postVisit(this); 558 } 559 560 public void acceptChildren(TParseTreeVisitor v){ 561 v.preVisit(this); 562 563 if (!placeHolder) getExpr().acceptChildren(v); 564 if (getAliasClause() != null){ 565 getAliasClause().acceptChildren(v); 566 } 567 568 v.postVisit(this); 569 } 570 571 public void setTargetColumns(TObjectNameList targetColumns) { 572 this.targetColumns = targetColumns; 573 } 574 575 private TUpdateFor updateFor; //couchbase 576 577 public void setUpdateFor(TUpdateFor updateFor) { 578 this.updateFor = updateFor; 579 } 580 581 public TUpdateFor getUpdateFor() { 582 583 return updateFor; 584 } 585 586 public int compareTo(Object o){ 587 TResultColumn rc = (TResultColumn)o; 588 return IdentifierService.normalizeStatic(this.dbvendor,dotColumn, this.getDisplayName()).compareTo( 589 IdentifierService.normalizeStatic(this.dbvendor,dotColumn,rc.getDisplayName())) ; 590 591 } 592 593// private int pos = -1; 594// 595// public void setPos(int pos) { 596// this.pos = pos; 597// } 598// 599// public int getPos() { 600// return pos; 601// } 602}