001package gudusoft.gsqlparser.nodes; 002 003import gudusoft.gsqlparser.*; 004import gudusoft.gsqlparser.stmt.TSelectSqlStatement; 005 006/** 007 * Item in order by clause. 008 * <p> Syntax: 009 * <blockquote><pre> 010 * ORDER BY {sort-key [ASC|DESC}[,..n] 011 * sort-key: 012 * simple-column-name 013 * simple-integer 014 * sort-key-expression</pre> 015 * </blockquote> 016 * 017*/ 018public class TOrderByItem extends TParseTreeNode { 019 020 private ENullOrder nullOrder = ENullOrder.notSet; 021 022 public ENullOrder getNullOrder() { 023 return nullOrder; 024 } 025 026 public void setNullOrder(ENullOrder nullOrder) { 027 this.nullOrder = nullOrder; 028 } 029 030 public void setNullOrder(TSourceToken nullOrder) { 031 if (nullOrder == null) return; 032 if (nullOrder.toString().equalsIgnoreCase("first")){ 033 this.nullOrder = ENullOrder.nullsFirst; 034 }else if (nullOrder.toString().equalsIgnoreCase("last")){ 035 this.nullOrder = ENullOrder.nullsLast; 036 } 037 } 038 039 public ESortType getSortOrder() { 040 return sortOrder; 041 } 042 043 private ESortType sortOrder = ESortType.none; 044 045 public void setSortOrder(ESortType sortOrder) { 046 this.sortOrder = sortOrder; 047 } 048 049 public void setSortKey(TExpression sortKey) { 050 this.sortKey = sortKey; 051 } 052 053 public void TOrderByItem(){ 054 055 } 056 057 private TExpression sortKey; 058 059 /** 060 * @deprecated As of v1.6.4.9, use {@link #getSortOrder} instead 061 * @return sort order 062 */ 063 public int getSortType() { 064 return sortType; 065 } 066 067 public void setSortTypeByToken(TSourceToken st){ 068 if (st == null) return ; 069 if (st.getAstext().equalsIgnoreCase("asc")){ 070 this.sortType = TBaseType.srtAsc; 071 sortOrder = ESortType.asc; 072 }else if (st.getAstext().equalsIgnoreCase("desc")){ 073 this.sortType = TBaseType.srtDesc; 074 sortOrder = ESortType.desc; 075 } 076 } 077 private int sortType = TBaseType.srtNone; 078 079 public TExpression getSortKey() { 080 return sortKey; 081 } 082 083 public void init(Object arg1) 084 { 085 sortKey = (TExpression)arg1; 086 } 087 088 public void doParse(TCustomSqlStatement psql, ESqlClause plocation){ 089 if (sortKey != null){ 090 if ((psql != null)&&(psql instanceof TSelectSqlStatement)&&(sortKey.getExpressionType() == EExpressionType.simple_object_name_t)){ 091 if ((sortKey.getObjectOperand().getPartToken() != null) 092 &&(sortKey.getObjectOperand().getObjectToken() == null)){ 093 // this column not qualified by a table name/alias 094 if (psql.getResultColumnList() != null){ 095 for(int i=0;i<psql.getResultColumnList().size();i++){ 096 TResultColumn column = psql.getResultColumnList().getResultColumn(i); 097 if (column.getAliasClause() != null){ 098 if (column.getAliasClause().getAliasName().toString().equalsIgnoreCase(sortKey.toString())){ 099 //sortKey.getObjectOperand().getPartToken().setDbObjType(TObjectName.ttobjColumnAlias); 100 sortKey.getObjectOperand().setObjectType(TObjectName.ttobjColumnAlias); 101 break; 102 } 103 } 104 } 105 } 106 } 107 } 108 sortKey.doParse(psql, ESqlClause.orderby); 109 } 110 } 111 112 public void accept(TParseTreeVisitor v){ 113 v.preVisit(this); 114 v.postVisit(this); 115 } 116 117 public void acceptChildren(TParseTreeVisitor v){ 118 v.preVisit(this); 119 if (sortKey != null){ 120 sortKey.acceptChildren(v); 121 } 122 v.postVisit(this); 123 } 124 125 public void setSortType(int sortType) { 126 this.sortType = sortType; 127 } 128}