SqlCondBase.java 5.93 KB
Newer Older
yanzg's avatar
yanzg committed
1 2 3 4 5
package com.yanzuoguang.dao.cond;

import com.yanzuoguang.dao.DaoConst;
import com.yanzuoguang.dao.impl.SqlData;
import com.yanzuoguang.dao.impl.SqlDataField;
yanzg's avatar
yanzg committed
6
import com.yanzuoguang.util.base.ObjectHelper;
yanzg's avatar
yanzg committed
7 8 9 10 11 12 13 14 15 16 17 18
import com.yanzuoguang.util.helper.StringHelper;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 包含的值字段
 *
 * @author 颜佐光
 */
yanzg's avatar
yanzg committed
19
public abstract class SqlCondBase<T extends SqlCondBase> implements SqlCond<T> {
yanzg's avatar
yanzg committed
20 21 22

    protected List<String> fields = new ArrayList<>();

23 24
    protected Runnable debugRunnable = null;

yanzg's avatar
yanzg committed
25 26 27 28 29 30 31 32 33 34 35 36 37
    /**
     * 构造函数
     *
     * @param fields
     */
    public SqlCondBase(List<String> fields) {
        for (String field : fields) {
            if (!StringHelper.isEmpty(field)) {
                this.fields.add(field);
            }
        }
    }

yanzg's avatar
yanzg committed
38 39 40 41 42 43 44 45 46 47
    /**
     * 获取包含的字段
     *
     * @return
     */
    @Override
    public List<String> getFields() {
        return this.fields;
    }

yanzg's avatar
yanzg committed
48
    /**
yanzg's avatar
yanzg committed
49
     * 获取字段值
yanzg's avatar
yanzg committed
50
     *
yanzg's avatar
yanzg committed
51
     * @param model
yanzg's avatar
yanzg committed
52 53
     * @return
     */
yanzg's avatar
yanzg committed
54 55 56 57 58 59 60 61
    @Override
    public List<Object> getValues(Object model) {
        List<Object> rets = new ArrayList<>();
        for (String field : this.fields) {
            rets.add(ObjectHelper.get(model, field));
        }
        return rets;
    }
yanzg's avatar
yanzg committed
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

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

    /**
     * 获取新的SQL语句
     *
     * @param sql
     * @param sqlData
yanzg's avatar
yanzg committed
77
     * @param sqlDataField
yanzg's avatar
yanzg committed
78 79 80 81 82
     * @param model
     * @param codeMap
     * @return
     */
    @Override
yanzg's avatar
yanzg committed
83 84
    public String getSql(String sql, SqlData sqlData, SqlDataField sqlDataField, Object model, Map<String, List<String>> codeMap) {
        if (sqlDataField.getCond() != this) {
yanzg's avatar
yanzg committed
85
            throw new RuntimeException("不能处理非本条件的字段");
yanzg's avatar
yanzg committed
86
        }
87 88 89 90
        if (debugRunnable != null) {
            // 用于断点调试的支持
            debugRunnable.run();
        }
yanzg's avatar
yanzg committed
91
        int condType = getCondType(model, sqlDataField);
yanzg's avatar
yanzg committed
92 93
        switch (condType) {
            case COND_TYPE_CONST_ONLY_PARA: {
yanzg's avatar
yanzg committed
94 95 96 97
                for (String field : this.fields) {
                    // 进行SQL语句参数替换,后面增加一个空格,方便后续用正则表达式进行替换处理
                    sql = sql.replaceFirst("\\?", "@" + field + " ");
                }
yanzg's avatar
yanzg committed
98 99 100
                break;
            }
            case COND_TYPE_CODE_COND: {
yanzg's avatar
yanzg committed
101
                String fieldName = this.fields.isEmpty() ? StringHelper.EMPTY : this.fields.get(0);
yanzg's avatar
yanzg committed
102
                // 判断代码片段是否合法
yanzg's avatar
yanzg committed
103
                if (sqlDataField.getCodes().size() % 2 == 1) {
yanzg's avatar
yanzg committed
104
                    throw new RuntimeException("代码片段" + this.getClass().getSimpleName() + ":" + sqlData.getName() + ":" + fieldName + "为单数");
yanzg's avatar
yanzg committed
105 106
                }
                // 处理代码片段
yanzg's avatar
yanzg committed
107 108 109
                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);
yanzg's avatar
yanzg committed
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
                    codeValue = codeValue.replaceAll("\\?", "@" + fieldName + " ");
                    addCodeMap(codeMap, codeName, codeValue);
                }
                break;
            }
            case COND_TYPE_NONE:
            default:
                break;
        }
        return sql;
    }


    /**
     * 将代码片段添加到SQL语句中
     *
     * @param codeMap 映射关系
     * @param name    执行的代码片段
     * @param code    代码片段
     */
    protected void addCodeMap(Map<String, List<String>> codeMap, String name, String code) {
yanzg's avatar
yanzg committed
131
        name = name.toLowerCase();
yanzg's avatar
yanzg committed
132 133 134 135 136 137
        if (!codeMap.containsKey(name)) {
            codeMap.put(name, new ArrayList<String>());
        }
        List<String> arr = codeMap.get(name);
        arr.add(code);
    }
yanzg's avatar
yanzg committed
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

    /**
     * 判断字段集合是否相等
     *
     * @param fromFields 来源字段
     * @param toFields   目标字段
     * @return
     */
    protected static boolean eqaulsField(List<String> fromFields, List<String> toFields) {
        Map<String, Boolean> mapField = new HashMap<>();
        for (String fromField : fromFields) {
            String from = fromField.toLowerCase().replaceAll("_", "");
            mapField.put(from, true);
        }
        for (String toField : toFields) {
            String to = toField.toLowerCase().replaceAll("_", "");
yanzg's avatar
yanzg committed
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
            if (mapField.containsKey(to)) {
                mapField.remove(to);
            } else {
                return false;
            }
        }
        return mapField.isEmpty();
    }

    /**
     * 判断值是否相等
     *
     * @param fromFields 来源字段
     * @param toFields   目标字段
     * @return
     */
    protected static boolean eqaulsValues(List fromFields, List toFields) {
        Map<Object, Boolean> mapField = new HashMap<>();
        for (Object fromField : fromFields) {
            Object from = fromField != null ? fromField : StringHelper.EMPTY;
            mapField.put(from, true);
        }
        for (Object toField : toFields) {
            Object to = toField != null ? toField : StringHelper.EMPTY;
            if (mapField.containsKey(to)) {
                mapField.remove(to);
            } else {
                return false;
            }
yanzg's avatar
yanzg committed
183 184 185 186 187 188 189
        }
        return mapField.isEmpty();
    }

    @Override
    public boolean equals(Object to) {
        if (to != null && to.getClass() == this.getClass()) {
yanzg's avatar
yanzg committed
190
            return this.equalsExecute((T) to);
yanzg's avatar
yanzg committed
191 192 193 194 195 196 197 198 199 200 201
        }
        return super.equals(to);
    }

    /**
     * 判断条件是否相等
     *
     * @param cond
     * @return
     */
    @Override
yanzg's avatar
yanzg committed
202
    public boolean equalsExecute(SqlCondBase cond) {
yanzg's avatar
yanzg committed
203 204
        return SqlCondBase.eqaulsField(this.fields, cond.fields);
    }
yanzg's avatar
yanzg committed
205
}