package jef.database.query;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import jef.common.Entry;
import jef.common.log.LogUtil;
import jef.database.QueryAlias;
import jef.database.meta.IReferenceAllTable;
import jef.database.meta.IReferenceColumn;
import jef.database.meta.ISelectProvider;
import jef.database.meta.ITableMetadata;
import jef.database.meta.Reference;
public abstract class AbstractEntityMappingProvider{
protected List<QueryAlias> queries;// 对于连接的Query.从驱动表向后依次递增
protected boolean distinct = false;
public List<ISelectItemProvider> getReference() {
List<ISelectItemProvider> result = new ArrayList<ISelectItemProvider>();
result.addAll(queries);
return result;
}
protected QueryAlias findQuery(ITableMetadata clz,Reference ref) {
QueryAlias found=null;
for(ISelectItemProvider q: this.queries){
if(q.getTableDef().getMeta()==clz){
QueryAlias al=(QueryAlias)q;
if(ref==null || ref.equals(al.getStaticRef())){
if(found!=null){
LogUtil.warn("there's more than one table "+ clz +" in the join query.");
}
found=al;
}
}
}
return found;
}
protected QueryAlias findQuery(Query<?> t2) {
for (ISelectItemProvider q : this.queries) {
if (q.getTableDef() == t2) {
return (QueryAlias) q;
}
}
return null;
}
public Entry<String[], ISelectItemProvider[]> getPopulationDesc() {
List<String> directSchema = new ArrayList<String>(5);
List<ISelectItemProvider> ref = new ArrayList<ISelectItemProvider>(5);//直接装配到基本对象上
for (ISelectItemProvider select : queries) {
if (select.getReferenceObj()==null && select.getReferenceCol().isEmpty()) {
directSchema.add(select.getSchema());
continue;
}
IReferenceAllTable all=select.getReferenceObj();
if(all!=null && all.getProjection()==ISelectProvider.PROJECTION_NOT_SELECT){
all=null;
}
List<IReferenceColumn> reference = select.getReferenceCol();
int fieldCount=0;
for (IReferenceColumn field : reference) {
int projection=field.getProjection();
//JIYI 2013, if a select desc, is for no select, then this can be skip on result population
if(projection==ISelectProvider.PROJECTION_HAVING_NOT_SELECT){
continue;
}
if (field.getName() == null && !directSchema.contains(select.getSchema())) {
ref.add(select.copyOf(Arrays.asList(field),null)); //单独处理一下 why
}else{
fieldCount++;
}
}
if(fieldCount>0 || all!=null){
ref.add(select);
}
}
Entry<String[], ISelectItemProvider[]> entry = new Entry<String[], ISelectItemProvider[]>();
entry.setKey(directSchema.toArray(new String[directSchema.size()]));
entry.setValue(ref.toArray(new ISelectItemProvider[ref.size()]));
return entry;
}
public void setDistinct(boolean distinct) {
this.distinct = distinct;
}
public boolean isDistinct() {
return distinct;
}
public boolean isMultiTable(){
return getReference().size()>1;
}
}