package jef.database.query;
import java.util.ArrayList;
import java.util.List;
import jef.database.DbUtils;
import jef.database.QueryAlias;
import jef.database.SqlProcessor;
import jef.database.annotation.JoinType;
import jef.database.dialect.DatabaseDialect;
import jef.database.meta.ITableMetadata;
import jef.database.meta.JoinKey;
import jef.database.meta.JoinPath;
import jef.database.meta.MetaHolder;
import jef.tools.StringUtils;
/**
* 一个Join的补充信息,描述这个Join实例与其左侧的各个表之前的关系
* @author Administrator
*
*/
public class JoinCondition {
private Query<?> left;
private JoinPath value;
private JoinType type;
public JoinCondition(Query<?> query,JoinPath joinPaths){
this.left=query;
this.value=joinPaths;
type=joinPaths.getType();
}
public JoinType getType() {
return type;
}
public void setType(JoinType type) {
if(type!=null){
this.type = type;
}
}
public void toOnExpression(StringBuilder sb, SqlContext sqlContext,QueryAlias right,SqlProcessor processor,DatabaseDialect profile,boolean batch) {
ITableMetadata meta=MetaHolder.getMeta(right.getQuery().getInstance());
sqlContext=sqlContext.getContextOf(right.getQuery());
String leftAlias=sqlContext.getAliasOf(left);//判断是左边的那张表和右边连接?//FIXME 如果左边多张表的字段参与Join条件呢
List<String> keys = new ArrayList<String>();
for(JoinKey key: value.getJoinKeys()){
String la=leftAlias;
String ra=sqlContext.getCurrentAlias();
if(key.getLeftLock()!=null){
la=sqlContext.getAliasOf(key.getLeftLock());
}
if(key.getRightLock()!=null){
ra=sqlContext.getAliasOf(key.getRightLock());
}
String left=DbUtils.toColumnName(key.getLeft(),profile, la);
String rightStr=DbUtils.toColumnName(key.getRightAsField(),profile,ra);
keys.add(StringUtils.concat(left,"=",rightStr));
}
for(JoinKey key: value.getJoinExpression()){
if(key.getField()==null){
if(key.getValue() instanceof JpqlExpression){
JpqlExpression jpql=(JpqlExpression) key.getValue();
String code=jpql.toSqlAndBindAttribs(sqlContext,profile);
keys.add(code);
}
}else{
keys.add(key.toSqlClause(meta, sqlContext, processor, left==null?null:left.getInstance(),profile,batch));
}
}
sb.append(StringUtils.join(keys, " and "));
}
}