// Path: src/main/java/pers/zr/opensource/magic/dao/constants/ConditionType.java
// public enum  ConditionType {
// 
//     AND, OR
// 
// }
// 
// Path: src/main/java/pers/zr/opensource/magic/dao/constants/MatchType.java
// public enum MatchType {
// 
//     EQUALS("="),
// 
//     GREATER(">"),
// 
//     LESS("<"),
// 
//     NOT_EQUALS("!="),
// 
//     GREATER_OR_EQUALS(">="),
// 
//     LESS_OR_EQUALS("<="),
// 
//     IN("IN"),
// 
//     LIKE("LIKE"),
// 
//     BETWEEN_AND("BETWEEN ? AND");
// 
// 
//     public String value;
// 
//     MatchType(String value) {
//         this.value = value;
//     }
// 
// }
// 
// Path: src/main/java/pers/zr/opensource/magic/dao/matcher/Matcher.java
// public abstract class Matcher {
// 
//     protected String column;
// 
//     public abstract MatchType getMatchType();
// 
//     public abstract Object[] getValues();
// 
//     public String getColumn() {
//         return column;
//     }
// 
//     protected String convertSpecialChar(String value, MatchType matchType) {
//         String newValue = value;
// 
//         if(MatchType.LIKE == matchType) {
//             newValue = newValue.replace("\\", "\\\\");
//             newValue = newValue.replace("%", "\\%");
//             newValue = newValue.replace("_", "\\_");
//         }
//         return newValue;
//     }
// 
// }
// 
// Path: src/main/java/pers/zr/opensource/magic/dao/shard/TableShardHandler.java
// public interface TableShardHandler {
// 
//     public String getRealTableName(TableShardStrategy shardStrategy, Object... columnValues);
// 
// 
// }
// 
// Path: src/main/java/pers/zr/opensource/magic/dao/shard/TableShardStrategy.java
// public class TableShardStrategy {
// 
//     private String shardTable;
// 
//     private int shardCount;
// 
//     private String[] shardColumns;
// 
//     private String separator;
// 
//     public TableShardStrategy(String shardTable, int shardCount, String[] shardColumns, String separator) {
//         this.shardTable = shardTable;
//         this.shardCount = shardCount;
//         this.shardColumns = shardColumns;
//         this.separator = separator;
//     }
// 
//     public String getShardTable() {
//         return shardTable;
//     }
// 
//     public int getShardCount() {
//         return shardCount;
//     }
// 
//     public String[] getShardColumns() {
//         return shardColumns;
//     }
// 
//     public String getSeparator() {
//         return separator;
//     }
// }


import org.springframework.util.CollectionUtils;
import pers.zr.opensource.magic.dao.constants.ConditionType;
import pers.zr.opensource.magic.dao.constants.MatchType;
import pers.zr.opensource.magic.dao.matcher.Matcher;
import pers.zr.opensource.magic.dao.shard.TableShardHandler;
import pers.zr.opensource.magic.dao.shard.TableShardStrategy;
import java.util.*;
package pers.zr.opensource.magic.dao.action;



/**
 * Created by zhurong on 2016/4/30.
 */
public abstract class ConditionalAction extends Action {

    private Collection<Matcher> conditions = new ArrayList<Matcher>();

    private String conSql = null;
    private List<Object> conParams = null;
    private String realTableName = null;

    public <T extends ConditionalAction>T addConditions(Collection<Matcher> matcheres) {
        conditions.addAll(matcheres);
        return (T) this;
    }

    public <T extends ConditionalAction>T addCondition(Matcher matcher) {
        conditions.add(matcher);
        return (T) this;
    }

    protected List<Object> getConParams() {
// Path: src/main/java/pers/zr/opensource/magic/dao/constants/ConditionType.java
// public enum  ConditionType {
// 
//     AND, OR
// 
// }
// 
// Path: src/main/java/pers/zr/opensource/magic/dao/constants/MatchType.java
// public enum MatchType {
// 
//     EQUALS("="),
// 
//     GREATER(">"),
// 
//     LESS("<"),
// 
//     NOT_EQUALS("!="),
// 
//     GREATER_OR_EQUALS(">="),
// 
//     LESS_OR_EQUALS("<="),
// 
//     IN("IN"),
// 
//     LIKE("LIKE"),
// 
//     BETWEEN_AND("BETWEEN ? AND");
// 
// 
//     public String value;
// 
//     MatchType(String value) {
//         this.value = value;
//     }
// 
// }
// 
// Path: src/main/java/pers/zr/opensource/magic/dao/matcher/Matcher.java
// public abstract class Matcher {
// 
//     protected String column;
// 
//     public abstract MatchType getMatchType();
// 
//     public abstract Object[] getValues();
// 
//     public String getColumn() {
//         return column;
//     }
// 
//     protected String convertSpecialChar(String value, MatchType matchType) {
//         String newValue = value;
// 
//         if(MatchType.LIKE == matchType) {
//             newValue = newValue.replace("\\", "\\\\");
//             newValue = newValue.replace("%", "\\%");
//             newValue = newValue.replace("_", "\\_");
//         }
//         return newValue;
//     }
// 
// }
// 
// Path: src/main/java/pers/zr/opensource/magic/dao/shard/TableShardHandler.java
// public interface TableShardHandler {
// 
//     public String getRealTableName(TableShardStrategy shardStrategy, Object... columnValues);
// 
// 
// }
// 
// Path: src/main/java/pers/zr/opensource/magic/dao/shard/TableShardStrategy.java
// public class TableShardStrategy {
// 
//     private String shardTable;
// 
//     private int shardCount;
// 
//     private String[] shardColumns;
// 
//     private String separator;
// 
//     public TableShardStrategy(String shardTable, int shardCount, String[] shardColumns, String separator) {
//         this.shardTable = shardTable;
//         this.shardCount = shardCount;
//         this.shardColumns = shardColumns;
//         this.separator = separator;
//     }
// 
//     public String getShardTable() {
//         return shardTable;
//     }
// 
//     public int getShardCount() {
//         return shardCount;
//     }
// 
//     public String[] getShardColumns() {
//         return shardColumns;
//     }
// 
//     public String getSeparator() {
//         return separator;
//     }
// }


// Path: src/main/java/pers/zr/opensource/magic/dao/action/ConditionalAction.java
import org.springframework.util.CollectionUtils;
import pers.zr.opensource.magic.dao.constants.ConditionType;
import pers.zr.opensource.magic.dao.constants.MatchType;
import pers.zr.opensource.magic.dao.matcher.Matcher;
import pers.zr.opensource.magic.dao.shard.TableShardHandler;
import pers.zr.opensource.magic.dao.shard.TableShardStrategy;
import java.util.*;

package pers.zr.opensource.magic.dao.action;



/**
 * Created by zhurong on 2016/4/30.
 */
public abstract class ConditionalAction extends Action {

    private Collection<Matcher> conditions = new ArrayList<Matcher>();

    private String conSql = null;
    private List<Object> conParams = null;
    private String realTableName = null;

    public <T extends ConditionalAction>T addConditions(Collection<Matcher> matcheres) {
        conditions.addAll(matcheres);
        return (T) this;
    }

    public <T extends ConditionalAction>T addCondition(Matcher matcher) {
        conditions.add(matcher);
        return (T) this;
    }

    protected List<Object> getConParams() {
        if(null == this.conParams) {