package jef.database.query;
import java.util.List;
import jef.database.dialect.DatabaseDialect;
import jef.database.meta.IReferenceAllTable;
import jef.database.meta.IReferenceColumn;
import jef.database.meta.Reference;
import jef.http.client.support.CommentEntry;
/**
* 供一个select字句发挥作用、以及描述该部分字段如何装配到对象
* 对应复杂查询中的一个表定义的所有查询字段。
*
* 包含以下信息:
* 1、表定义别名
* 2、选择的列名称与别名
* 3、选择列别名到装配目标
* @Date 2011-6-17
*/
public interface ISelectItemProvider {
/**
* 获得Schema
* @return
*/
String getSchema();
/**
* 获得引用字段列表和目标实体的字段(从拼装目的出发)
* 每个IReferenceField描述一个位于某路径的字段(即拼装路径),
* 以及该数据来自当前查询实例的字段名(是否需要加上schema待定)
*
* 简单来说,就是: 选择列名(即别名(getName)) -> 实体属性的相对路径
* 包含两种模式:
* 单列
* 全部列
* FIXME 应该拆分为两个方法,分别返回两类引用
* @return 从拼装目的来描述的列选择,如果为null,表示装配到基本对象上
*/
IReferenceAllTable getReferenceObj();
List<IReferenceColumn> getReferenceCol();
/**
* 获得要选择的列和别名(拼装目的不考虑)
* 用于生成select字句
*/
CommentEntry[] getSelectColumns(DatabaseDialect profile,boolean groupMode,SqlContext context);
Query<?> getTableDef();
void addField(IReferenceAllTable field);
void addField(IReferenceColumn field);
void setFields(IReferenceAllTable all,IReferenceColumn... ref);
void setFields(IReferenceAllTable all,List<IReferenceColumn> reference);
boolean isAllTableColumns();
ISelectItemProvider copyOf(List<IReferenceColumn> fields,IReferenceAllTable allCols);
public Reference getStaticRef();
}