Search in sources :

Example 1 with SqlMapCondition

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());
        }
    }
}
Also used : SqlMapParameter(com.nhn.dbtool.query.parser.sqlmap.model.SqlMapParameter) MyBatisTestCondition(com.nhn.dbtool.query.parser.sqlmap.model.MyBatisTestCondition) SqlMapCondition(com.nhn.dbtool.query.parser.sqlmap.model.SqlMapCondition)

Example 2 with SqlMapCondition

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);
            }
        }
    }
}
Also used : SqlMapQuery(com.nhn.dbtool.query.parser.sqlmap.model.SqlMapQuery) SqlMapCondition(com.nhn.dbtool.query.parser.sqlmap.model.SqlMapCondition)

Example 3 with SqlMapCondition

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);
    }
}
Also used : SqlMapParameter(com.nhn.dbtool.query.parser.sqlmap.model.SqlMapParameter) ArrayList(java.util.ArrayList) SqlMapCondition(com.nhn.dbtool.query.parser.sqlmap.model.SqlMapCondition)

Example 4 with SqlMapCondition

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);
        }
    }
}
Also used : SqlMapQuery(com.nhn.dbtool.query.parser.sqlmap.model.SqlMapQuery) Document(org.dom4j.Document) DocumentException(org.dom4j.DocumentException) SqlMapCondition(com.nhn.dbtool.query.parser.sqlmap.model.SqlMapCondition)

Example 5 with SqlMapCondition

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;
}
Also used : SqlMapCondition(com.nhn.dbtool.query.parser.sqlmap.model.SqlMapCondition)

Aggregations

SqlMapCondition (com.nhn.dbtool.query.parser.sqlmap.model.SqlMapCondition)9 SqlMapQuery (com.nhn.dbtool.query.parser.sqlmap.model.SqlMapQuery)3 MyBatisTestCondition (com.nhn.dbtool.query.parser.sqlmap.model.MyBatisTestCondition)2 SqlMapParameter (com.nhn.dbtool.query.parser.sqlmap.model.SqlMapParameter)2 Node (org.dom4j.Node)2 QueryCondition (com.navercorp.dbtools.sqlmap.parser.QueryCondition)1 DynamicTag (com.nhn.dbtool.query.parser.sqlmap.model.DynamicTag)1 IsEmptyTag (com.nhn.dbtool.query.parser.sqlmap.model.IsEmptyTag)1 IsNotEmptyTag (com.nhn.dbtool.query.parser.sqlmap.model.IsNotEmptyTag)1 IterateTag (com.nhn.dbtool.query.parser.sqlmap.model.IterateTag)1 SelectKeyTag (com.nhn.dbtool.query.parser.sqlmap.model.SelectKeyTag)1 ArrayList (java.util.ArrayList)1 Document (org.dom4j.Document)1 DocumentException (org.dom4j.DocumentException)1 Element (org.dom4j.Element)1