use of com.nhn.dbtool.query.parser.sqlmap.model.SqlMapCondition in project cubrid-manager by CUBRID.
the class SqlMapQueryParser method extractMyBatisTestConditions.
/**
* MyBatis test 속성 내의 조건식을 쿼리 조합시 사용하도록 parameter list에 입력
*
* @param query
* @param conditionList
*/
private void extractMyBatisTestConditions(SqlMapQuery query, List<SqlMapCondition> conditionList) {
if (conditionList == null) {
return;
}
for (SqlMapCondition condition : conditionList) {
if (condition == null || condition.getMyBatisTestConditions() == null) {
continue;
}
for (MyBatisTestCondition mCondition : condition.getMyBatisTestConditions()) {
String property = mCondition.getProperty();
SqlMapParameter sqlmapParameter = new SqlMapParameter();
sqlmapParameter.setName(property);
sqlmapParameter.setDynamic(true);
query.addParameter(sqlmapParameter);
}
if ("foreach".equals(condition.getType())) {
SqlMapParameter sqlmapParameter = new SqlMapParameter();
sqlmapParameter.setName(condition.getCollection());
sqlmapParameter.setDynamic(true);
query.addParameter(sqlmapParameter);
}
if (condition.getChildConditionList() != null) {
extractMyBatisTestConditions(query, condition.getChildConditionList());
}
}
}
use of com.nhn.dbtool.query.parser.sqlmap.model.SqlMapCondition in project cubrid-manager by CUBRID.
the class Parser method mergeInclude.
/**
* 하위의 모든 SqlMapCondition 를 대상으로 Include Id에 해당 하는 Query의 파싱된 정보를 원본 Query 및 Condition 에 추가한다.
*
* @param sqlMapFile SqlMapFile
* @param query SqlMapQuery
* @param condition SqlMapCondition 리스트
*/
private void mergeInclude(SqlMapFile sqlMapFile, SqlMapQuery query, SqlMapCondition condition) {
// child condition 을 우선 처리
for (SqlMapCondition childCondition : condition.getChildConditionList()) {
// 재귀 호출
this.mergeInclude(sqlMapFile, query, childCondition);
}
// include 타입인 경우만 처리
if ("include".equals(condition.getType())) {
// refId attribute에서 namespace 부분 제거
String referenceId = condition.getRefid();
referenceId = referenceId.replace(sqlMapFile.getNamespace() + ".", "");
logger.debug("include id:" + referenceId);
// Include Id에 해당 하는 Query 가져오기
SqlMapQuery includeQuery = sqlMapFile.getQuery(referenceId);
if (includeQuery != null) {
// Include Id에 해당 하는 Query의 파싱된 정보를 원본 Query 및 Condition 에 추가
this.mergeInclude(query, condition, includeQuery);
} else if (refSqlHashMap != null) {
// Include Id 에 해당하는 Query 가 없는 경우 SqlMapQuery 해쉬맵에서 찾음
if (referenceId.contains(".")) {
includeQuery = refSqlHashMap.get(referenceId);
} else {
includeQuery = refSqlHashMap.get(sqlMapFile.getNamespace() + "." + referenceId);
}
if (includeQuery != null) {
mergeInclude(query, condition, includeQuery);
}
}
}
}
use of com.nhn.dbtool.query.parser.sqlmap.model.SqlMapCondition in project cubrid-manager by CUBRID.
the class Parser method mergeInclude.
/**
* Include Id에 해당 하는 Query의 파싱된 정보를 원본 Query 및 Condition 에 추가
*
* @param query 원본 쿼리
* @param condition 원본 Include Condition
* @param includeQuery Include condition에 해당하는 Query
*/
private void mergeInclude(SqlMapQuery query, SqlMapCondition condition, SqlMapQuery includeQuery) {
// Query 정보 추가
condition.setStatement(includeQuery.getQuery());
condition.setModifiedStatement(includeQuery.getModifiedQuery());
// includeQuery의 condition 목록을 원본 Condition의 childCondition으로 추가
// condition를 그대로 추가하지 않고 Object의 hascode를 포함한 key값을 다시 생성하여야 한다.
List<SqlMapCondition> includeConditionList = new ArrayList<SqlMapCondition>();
for (SqlMapCondition includeCondition : includeQuery.getConditionList()) {
SqlMapCondition copiedCondition = includeCondition;
copiedCondition.setKey(null);
// 기존 쿼리에서 key값을 통한 해당 condition의 statement가 위치 자리의 key값을 새롭게 생성된 key값으로 변경한다.
condition.setModifiedStatement(condition.getModifiedStatement().replaceAll(includeCondition.getKey(), copiedCondition.getKey()));
includeConditionList.add(copiedCondition);
}
condition.setChildConditionList(includeQuery.getConditionList());
// Parameter 추가
for (SqlMapParameter includeParameter : includeQuery.getParameterList()) {
query.addParameter(includeParameter);
}
}
use of com.nhn.dbtool.query.parser.sqlmap.model.SqlMapCondition in project cubrid-manager by CUBRID.
the class Parser method parse.
public void parse(SqlMapFile sqlMapFile) throws Exception {
Document document;
if (StringUtils.isEmpty(sqlMapFile.getFileContent())) {
sqlMapFile.setErrorMessage(Messages.sqlmapEmptyContent);
throw new Exception(Messages.sqlmapEmptyContent);
}
// create a XML document with SQLMap document.
try {
document = createDocument(sqlMapFile.getFileContent());
} catch (Exception e) {
sqlMapFile.setErrorMessage(Messages.sqlmapInvalidFormat);
throw new Exception(Messages.sqlmapInvalidFormat, e);
}
// determine whether iBatis(sqlMap) or MyBatis(mapper) from the document header.
if (!isMapperXML(document)) {
sqlMapFile.setErrorMessage(Messages.sqlmapNoMybatisFormat);
throw new Exception(Messages.sqlmapNoMybatisFormat);
}
// generate a namespace
String namespace = SqlMapParserUtil.getAttribute(document.getRootElement(), "namespace");
sqlMapFile.setNamespace(namespace);
logger.debug("namespace:" + namespace);
// parse sqlmap document
try {
loopNode(document, sqlMapFile);
} catch (Exception e) {
sqlMapFile.setErrorMessage(Messages.sqlmapNoMybatisFormat);
throw new Exception(Messages.sqlmapNoMybatisFormat, e);
}
// replace <include refid=""></include> by referred sql through the refid
for (SqlMapQuery query : sqlMapFile.getSqlMapQueryList()) {
// find Include condition in queries
for (SqlMapCondition condition : query.getConditionList()) {
mergeInclude(sqlMapFile, query, condition);
}
}
}
use of com.nhn.dbtool.query.parser.sqlmap.model.SqlMapCondition in project cubrid-manager by CUBRID.
the class SqlMapConditionParser method createSqlMapCondition.
/**
* Element 타입의 node에서 condition tag 정보를 읽어 SqlMapCondition를 생성한다.
*
* @param node Element 타입의 node
* @return condition tag 정보가 포함된 SqlMapCondition
* @throws Exception
*/
private SqlMapCondition createSqlMapCondition(Node node) throws Exception {
// 현재의 element name에 해당하는 Class를 동적으로 생성
SqlMapCondition condition = SqlMapConditionLoader.getSqlMapConditionTag(node.getName());
if (condition != null) {
condition.setProperty(SqlMapParserUtil.getAttribute(node, "property"));
condition.setPrepend(SqlMapParserUtil.getAttribute(node, "prepend"));
condition.setOpen(SqlMapParserUtil.getAttribute(node, "open"));
condition.setClose(SqlMapParserUtil.getAttribute(node, "close"));
//condition.setRemoveFirstPrepend(SqlMapParserUtil.getAttribute(node, "removeFirstPrepend"));
condition.setCompareProperty(SqlMapParserUtil.getAttribute(node, "compareProperty"));
condition.setCompareValue(SqlMapParserUtil.getAttribute(node, "compareValue"));
condition.setRefid(SqlMapParserUtil.getAttribute(node, "refid"));
condition.setConjunction(SqlMapParserUtil.getAttribute(node, "conjunction"));
condition.setKeyProperty(SqlMapParserUtil.getAttribute(node, "keyProperty"));
condition.setResultClass(SqlMapParserUtil.getAttribute(node, "resultClass"));
condition.setStatement(node.asXML());
// MyBatis 전용 속성 할당
initSqlMapCondition(node, condition);
}
return condition;
}
Aggregations