SqlCondItem.java 3.53 KB
package com.yanzuoguang.dao.cond;

import com.yanzuoguang.dao.DaoConst;
import com.yanzuoguang.dao.impl.SqlData;
import com.yanzuoguang.dao.impl.SqlDataField;
import com.yanzuoguang.util.YzgError;
import com.yanzuoguang.util.base.ObjectHelper;
import com.yanzuoguang.util.helper.ArrayHelper;
import com.yanzuoguang.util.helper.StringHelper;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * 分别处理每一项,用于替换
 *
 * @author 颜佐光
 */
public class SqlCondItem extends SqlCondBase<SqlCondItem> {

    public SqlCondItem(String... field) {
        this(Arrays.asList(field));
    }

    public SqlCondItem(List<String> fields) {
        this(null, fields);
    }

    public SqlCondItem(Runnable debugRunnable, String... field) {
        this(debugRunnable, Arrays.asList(field));
    }

    public SqlCondItem(Runnable debugRunnable, List<String> fields) {
        super(fields);
        super.debugRunnable = debugRunnable;
    }

    /**
     * 当前条件是否相等
     *
     * @param model    请求参数实体
     * @param sqlField 请求字段
     * @return
     */
    @Override
    protected int getCondType(Object model, SqlDataField sqlField) {
        return SqlCondDefault.getCondType(this.fields, model, sqlField);
    }

    /**
     * 获取新的SQL语句
     *
     * @param sql
     * @param sqlData
     * @param sqlDataField
     * @param model
     * @param codeMap
     * @return
     */
    @Override
    public String getSql(String sql, SqlData sqlData, SqlDataField sqlDataField, Object model, Map<String, List<String>> codeMap) {
        if (sqlDataField.getCond() != this) {
            throw YzgError.getRuntimeException("025");
        }
        if (debugRunnable != null) {
            // 用于断点调试的支持
            debugRunnable.run();
        }
        int condType = getCondType(model, sqlDataField);
        switch (condType) {
            case COND_TYPE_CONST_ONLY_PARA: {
                throw YzgError.getRuntimeException("027");
            }
            case COND_TYPE_CODE_COND: {
                String fieldName = this.fields.isEmpty() ? StringHelper.EMPTY : this.fields.get(0);
                // 判断代码片段是否合法
                if (sqlDataField.getCodes().size() % 2 == 1) {
                    throw YzgError.getRuntimeException("026", this.getClass().getSimpleName(), sqlData.getName(), fieldName);
                }
                Object value = ObjectHelper.get(model, fieldName);
                List list = ArrayHelper.getList(value);

                for (Object item : list) {
                    // 处理代码片段
                    for (int i = 0; i < sqlDataField.getCodes().size(); i = i + DaoConst.CODE_UNIT) {
                        String codeName = sqlDataField.getCodes().get(i);
                        String codeValue = sqlDataField.getCodes().get(i + 1);
                        codeValue = codeValue.replaceAll("\\?", item.toString()).replaceAll("\\{0\\}", item.toString());
                        codeValue = StringHelper.getCodeString(codeValue, item);
                        addCodeMap(codeMap, codeName, codeValue);
                    }

                }
                break;
            }
            case COND_TYPE_NONE:
            default:
                break;
        }
        return sql;
    }

    /**
     * 将当前条件复制为新的对象
     *
     * @return
     */
    @Override
    public SqlCondItem copy() {
        SqlCondItem cond = new SqlCondItem(this.debugRunnable, this.fields);
        return cond;
    }
}