/* * JEF - Copyright 2009-2010 Jiyi (mr.jiyi@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jef.database.jsqlparser.statement.select; import java.util.List; import jef.database.jsqlparser.expression.Column; import jef.database.jsqlparser.statement.SqlAppendable; import jef.database.jsqlparser.visitor.Expression; import jef.database.jsqlparser.visitor.SelectItem; import jef.database.jsqlparser.visitor.SelectItemVisitor; import jef.tools.StringUtils; /** * An element (column reference) in an "ORDER BY" clause. */ public class OrderByElement implements SqlAppendable{ private Expression expression; private boolean asc = true; public boolean isAsc() { return asc; } public void setAsc(boolean b) { asc = b; } public void accept(SelectItemVisitor orderByVisitor) { orderByVisitor.visit(this); } public Expression getExpression() { return expression; } public void setExpression(Expression expression) { this.expression = expression; } public String toString() { StringBuilder sb=new StringBuilder(); appendTo(sb); return sb.toString(); } public void appendTo(StringBuilder sb) { expression.appendTo(sb); if(!asc){ sb.append(" DESC"); } } public void reverseAppendTo(StringBuilder sb,String tmpTableAlias,List<SelectItem> items) { if(expression instanceof Column){ Column c=(Column)expression; if(items!=null){ fixWithSelects(c,items); } if(c.getTableAlias()!=null){ c.setTableAlias(tmpTableAlias); } } expression.appendTo(sb); if(asc){ sb.append(" DESC"); } } private void fixWithSelects(Column c, List<SelectItem> items) { for(SelectItem item:items){ if(item instanceof AllTableColumns){ if(StringUtils.equalsIgnoreCase(c.getTableAlias(),((AllTableColumns) item).getTable().getAlias())){ break; }else{ continue; } }else if(item instanceof AllColumns){ break; } SelectExpressionItem sex=item.getAsSelectExpression(); Expression ex=sex.getExpression(); if(ex instanceof Column){ Column exc=(Column)ex; if(isMatch(exc,c)){ if(sex.getAlias()!=null){ c.setColumnName(sex.getAlias()); } } } } } private boolean isMatch(Column exc, Column c) { if(StringUtils.equalsIgnoreCase(exc.getColumnName(), c.getColumnName())){ if(c.getTableAlias()==null || exc.getTableAlias()==null){ return true; } return StringUtils.equalsIgnoreCase(c.getTableAlias(), exc.getTableAlias()); } return false; } }