package cn.org.rapid_framework.generator.provider.db.sql.model;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import cn.org.rapid_framework.generator.util.StringHelper;
import cn.org.rapid_framework.generator.util.sqlparse.NamedParameterUtils;
import cn.org.rapid_framework.generator.util.sqlparse.ParsedSql;
/**
* SQL片段, 代表一句SQL include 其它的sql片段. 如ibatis中的 <include refid='User.Where'/>
*
* @see Sql
**/
public class SqlSegment {
/** sql segment ID */
public String id;
/** 原始的 被 include的一段 SQL */
public String rawIncludeSql;
/** 已经经过处理解析的一段SQL */
public String parsedIncludeSql;
/** 这段include sql包含的参数列表 */
public Set<SqlParameter> params;
public SqlSegment(){}
public SqlSegment(String id, String rawIncludeSql, String parsedIncludeSql) {
super();
setId(id);
this.rawIncludeSql = rawIncludeSql;
this.parsedIncludeSql = parsedIncludeSql;
}
//TODO 增加如果参数数是1,则不生成 SqlSegemnt,此处也要修改对1的特殊控制
public Set<SqlParameter> getParams(Sql sql) {
Set<SqlParameter> result = new LinkedHashSet();
for(String paramName : getParamNames()) {
SqlParameter p = sql.getParam(paramName);
if(p == null) throw new IllegalArgumentException("not found param on sql:"+parsedIncludeSql+" with name:"+paramName+" for sqlSegment:"+id); //是否不该扔异常
result.add(p);
}
return result;
}
public List<String> getParamNames() {
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(parsedIncludeSql); // FIXME 没有执行替换?为 :name的动作
return parsedSql.getParameterNames();
}
public String getClassName() {
return StringHelper.toJavaClassName(id.replace(".", "_").replace("-", "_"));
}
public String getId() {
return id;
}
public void setId(String id) {
if(StringHelper.isBlank(id)) throw new IllegalArgumentException("id must be not blank");
this.id = id;
}
public String getRawIncludeSql() {
return rawIncludeSql;
}
public void setRawIncludeSql(String rawIncludeSql) {
this.rawIncludeSql = rawIncludeSql;
}
public String getParsedIncludeSql() {
return parsedIncludeSql;
}
public void setParsedIncludeSql(String parsedIncludeSql) {
this.parsedIncludeSql = parsedIncludeSql;
}
public Set<SqlParameter> getParams() {
return params;
}
public void setParams(Set<SqlParameter> params) {
this.params = params;
}
@Override
public int hashCode() {
return id.hashCode();
}
public boolean isGenerateParameterObject() {
if(getParamNames().size() > 1) {
return true;
}
return false;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
SqlSegment other = (SqlSegment) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}