package jef.database.query;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import jef.database.dialect.DatabaseDialect;
import jef.database.dialect.type.ColumnMapping;
import jef.database.meta.AliasProvider;
import jef.database.meta.IReferenceAllTable;
import jef.database.meta.IReferenceColumn;
import jef.database.meta.ISelectProvider;
import jef.database.meta.ITableMetadata;
import jef.http.client.support.CommentEntry;
import jef.tools.ArrayUtils;
import org.springframework.util.Assert;
public abstract class SelectItemProvider implements ISelectItemProvider {
//单表请求
protected Query<?> table;
//该请求对应的表别名
protected String schema;
//选择列的内容和装配目的(单个装配)
protected IReferenceAllTable referenceObj;//可以为null,表示拼装到基本对象上
protected List<IReferenceColumn> referenceCol;//可以为null,表示拼装到基本对象上
protected SelectItemProvider(String schema,Query<?> table){
this.schema=schema;
this.table=table;
}
public IReferenceAllTable getReferenceObj() {
return referenceObj;
}
@SuppressWarnings("unchecked")
public List<IReferenceColumn> getReferenceCol() {
return referenceCol==null?Collections.EMPTY_LIST:referenceCol;
}
public String getSchema() {
return schema;
}
public void addField(IReferenceAllTable field){
if(field==null)return;
this.referenceObj=field;
}
public void addField(IReferenceColumn field){
if(referenceCol==null)referenceCol=new ArrayList<IReferenceColumn>();
this.referenceCol.add(field);
}
public void setFields(IReferenceAllTable all,List<IReferenceColumn> field){
this.referenceObj=all;
this.referenceCol=field;
}
public void setFields(IReferenceAllTable all,IReferenceColumn... field){
this.referenceObj=all;
if(field.length==0){
referenceCol=null;
}else{
referenceCol=ArrayUtils.asList(field);
}
}
public boolean isAllTableColumns(){
if(referenceCol!=null && referenceCol.size()>1)return false;
if(referenceObj==null){
return false;
}
return referenceObj.getProjection()==ISelectProvider.PROJECTION_NORMAL;
}
private static final AliasProvider EMPTY=new AliasProvider(){
public String getSelectedAliasOf(ColumnMapping f, DatabaseDialect profile, String schema) {
return null;
}
@Override
public String getResultAliasOf(ColumnMapping f,String schema) {
return null;
}
};
/**
*生成查询语句时使用
*/
public CommentEntry[] getSelectColumns(DatabaseDialect profile,boolean groupMode,SqlContext context) {
List<CommentEntry> result=new ArrayList<CommentEntry>();
List<IReferenceColumn> assignedFields=this.getReferenceCol();
AliasProvider aliasProvider=context.isMultiTable()? AliasProvider.DEFAULT: EMPTY;
//所有配置为空,采取默认值
if(assignedFields.isEmpty() && referenceObj==null){
if(!groupMode){//group模式下全部无效
ITableMetadata meta=table.getMeta();
for (ColumnMapping f : meta.getColumns()) {
CommentEntry entry=new CommentEntry();
entry.setKey(concatSchema(f.getColumnName(profile, true)));
entry.setValue(aliasProvider.getSelectedAliasOf(f, profile, schema));
result.add(entry);
}
}
return result.toArray(new CommentEntry[result.size()]);
}
//全表列
if(referenceObj!=null && referenceObj.getProjection()!=ISelectProvider.PROJECTION_NOT_SELECT){
String sql=referenceObj.simpleModeSql(schema);
if(sql!=null){
String countAlias=((AllTableColumns)referenceObj).getCountAlias();
result.add(new CommentEntry(sql,countAlias));
}else{
if(!groupMode){
ITableMetadata meta=table.getMeta();
for (ColumnMapping f : meta.getColumns()) {
if(referenceObj.isLazyLob()){
if(ArrayUtils.fastContains(meta.getLobFieldNames(), f.field())){
continue;
}
}
CommentEntry entry=new CommentEntry();
String name=f.getColumnName(profile,true);
Assert.notNull(name);
entry.setKey(concatSchema(name));
if(referenceObj==null){
entry.setValue(AliasProvider.DEFAULT.getSelectedAliasOf(f, profile, schema));
}else{
entry.setValue(referenceObj.getSelectedAliasOf(f,profile,schema));
}
result.add(entry);
}
return result.toArray(new CommentEntry[result.size()]);
}
}
}
//其他列
for(IReferenceColumn f: assignedFields){
if(groupMode && f.getProjection()==ISelectProvider.PROJECTION_NORMAL)continue;//group模式下,普通字段无效
CommentEntry entry=new CommentEntry();
String column=f.getSelectItem(profile, schema,context);
if(column==null)continue;
entry.setKey(column);
entry.setValue(f.getSelectedAlias(schema,profile));
result.add(entry);
}
return result.toArray(new CommentEntry[result.size()]);
}
private String concatSchema(String name) {
Assert.notNull(name);
if(schema==null)return name;
return new StringBuilder(schema.length()+1+name.length()).append(schema).append('.').append(name).toString();
}
public Query<?> getTableDef() {
return table;
}
}