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}