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