/*
* 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.query;
import java.io.Serializable;
import jef.database.DbUtils;
import jef.database.Field;
import jef.database.dialect.DatabaseDialect;
import jef.database.meta.FBIField;
import jef.database.meta.ITableMetadata;
import jef.database.meta.TupleField;
import jef.tools.Assert;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
/**
* 描述一个排序字段
*
* @author Administrator
*
*/
public final class OrderField implements Serializable {
private static final long serialVersionUID = -5112285033060486050L;
private Field field;
private boolean asc;
/**
* 是否正序
*
* @return
*/
public boolean isAsc() {
return asc;
}
/**
* 排序字段
*
* @return
*/
public Field getField() {
return field;
}
/**
* 是否和查询绑定
*
* @return
*/
public boolean isBind() {
if (!(field instanceof RefField))
return false;
RefField ref = (RefField) field;
return ref.isBind();
}
/**
* 构造
*
* @param field
* 字段
* @param asc
* 正序
*/
public OrderField(Field field, boolean asc) {
this.field = field;
this.asc = asc;
}
public int hashCode() {
return new HashCodeBuilder().append(field.name()).append(asc).toHashCode();
}
public boolean equals(Object obj) {
if (obj == null)
return false;
if (obj == this)
return true;
if (!(obj instanceof OrderField)) {
return false;
}
OrderField rhs = (OrderField) obj;
return new EqualsBuilder().append(this.asc, rhs.asc).append(this.field.name(), rhs.field.name()).isEquals();
}
// 返回两个String,第一个是在OrderBy中的现实
public String toString(DatabaseDialect profile, SqlContext context) {
if (field instanceof RefField) {
Assert.notNull(context);
RefField ref = (RefField) field;
String alias = context.getAliasOf(ref.getInstanceQuery(context));
return DbUtils.toColumnName(ref.getField(), profile, alias);// 无法支持分库排序
} else if (field instanceof Enum || field instanceof TupleField) {
String alias = context == null ? null : context.getCurrentAliasAndCheck(field);
return DbUtils.toColumnName(field, profile, alias);//
} else if (field instanceof FBIField) {
FBIField fbi = (FBIField) field;
return fbi.toSqlAndBindAttribs(context, profile);
} else if (field instanceof SqlExpression) {
return field.name();
} else {
throw new IllegalArgumentException("The field type " + field.getClass().getName() + " is invalid!");
}
}
/**
* 原先绑定在所属的Query上(可能是以ref的形式暂存在其中,但作为join的一部分,现在要准备离开这个存储的位置了)
*
* @param query
* 所属的query
* @param context
*/
void prepareFlow(Query<?> query) {
// if(isBind()){
// return;
// }
if (field instanceof RefField) {
return;
}
ITableMetadata type = DbUtils.getTableMeta(field);
if (type != query.getMeta()) {
field = new RefField(field);
} else {
field = new RefField(query, field);
}
}
}