// Path: ddal-ddr/src/main/java/org/hellojavaer/ddal/ddr/shard/RangeShardValue.java
// public class RangeShardValue {
// 
//     private Long begin;
//     private Long end;
// 
//     public RangeShardValue() {
//     }
// 
//     public RangeShardValue(Long begin, Long end) {
//         this.begin = begin;
//         this.end = end;
//     }
// 
//     public Long getBegin() {
//         return begin;
//     }
// 
//     public void setBegin(Long begin) {
//         this.begin = begin;
//     }
// 
//     public Long getEnd() {
//         return end;
//     }
// 
//     public void setEnd(Long end) {
//         this.end = end;
//     }
// 
//     @Override
//     public String toString() {
//         return "{" + "begin:" + begin + ",end:" + end + '}';
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(begin, end);
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         RangeShardValue that = (RangeShardValue) o;
// 
//         if (begin != null ? !begin.equals(that.begin) : that.begin != null) return false;
//         return end != null ? end.equals(that.end) : that.end == null;
// 
//     }
// 
// }
// 
// Path: ddal-ddr/src/main/java/org/hellojavaer/ddal/ddr/shard/simple/SimpleShardRouteRuleBinding.java
// public class SimpleShardRouteRuleBinding implements ShardRouteRuleBinding, Serializable {
// 
//     private static final long serialVersionUID = 0L;
// 
//     private String            scName;
//     private String            tbName;
//     private String            sdKey;
//     private ShardRouteRule    rule;
//     private String            sdValues;
// 
//     public SimpleShardRouteRuleBinding() {
//     }
// 
//     public SimpleShardRouteRuleBinding(String scName, String tbName, String sdKey, ShardRouteRule rule) {
//         this(scName, tbName, sdKey, rule, null);
//     }
// 
//     public SimpleShardRouteRuleBinding(String scName, String tbName, String sdKey, ShardRouteRule rule, String sdValues) {
//         this.scName = scName;
//         this.tbName = tbName;
//         this.sdKey = sdKey;
//         this.rule = rule;
//         this.sdValues = sdValues;
//     }
// 
//     @Override
//     public String getScName() {
//         return scName;
//     }
// 
//     public void setScName(String scName) {
//         this.scName = scName;
//     }
// 
//     @Override
//     public String getTbName() {
//         return tbName;
//     }
// 
//     public void setTbName(String tbName) {
//         this.tbName = tbName;
//     }
// 
//     @Override
//     public String getSdKey() {
//         return sdKey;
//     }
// 
//     public void setSdKey(String sdKey) {
//         this.sdKey = sdKey;
//     }
// 
//     @Override
//     public ShardRouteRule getRule() {
//         return rule;
//     }
// 
//     public void setRule(ShardRouteRule rule) {
//         this.rule = rule;
//     }
// 
//     public String getSdValues() {
//         return sdValues;
//     }
// 
//     public void setSdValues(String sdValues) {
//         this.sdValues = sdValues;
//     }
// 
// }


import org.hellojavaer.ddal.core.utils.Assert;
import org.hellojavaer.ddal.ddr.shard.RangeShardValue;
import org.hellojavaer.ddal.ddr.shard.ShardRouteInfo;
import org.hellojavaer.ddal.ddr.shard.simple.SimpleShardRouteRuleBinding;
import org.hellojavaer.ddal.ddr.shard.simple.SimpleShardRouter;
import org.junit.Test;
import java.util.*;
    @Test
    public void test01() {
        SpelShardRouteRule rule = new SpelShardRouteRule("{scName}_{#format('%02d', sdValue % 4)}",
                                                         "{tbName}_{#format('%04d', sdValue % 8)}");
        Assert.equals(rule.parseScName("member", 10101), "member_01");
        Assert.equals(rule.parseTbName("user", 10101), "user_0005");
    }

    @Test
    public void test02() {
        List<String> expectedResult = new ArrayList();
        expectedResult.add("db_00.user_0000");
        expectedResult.add("db_01.user_0001");
        expectedResult.add("db_02.user_0002");
        expectedResult.add("db_03.user_0003");
        expectedResult.add("db_00.user_0004");
        expectedResult.add("db_01.user_0005");
        expectedResult.add("db_02.user_0006");
        expectedResult.add("db_03.user_0007");
        expectedResult.add("db_00.user_0008");
        expectedResult.add("db_01.user_0009");
        expectedResult.add("db_02.user_0010");
        expectedResult.add("db_03.user_0011");
        expectedResult.add("db_00.user_0012");
        expectedResult.add("db_01.user_0013");
        expectedResult.add("db_02.user_0014");
        expectedResult.add("db_03.user_0015");
        List<SimpleShardRouteRuleBinding> bindings = new ArrayList<SimpleShardRouteRuleBinding>();
        SpelShardRouteRule numRule = new SpelShardRouteRule("{scName}_{format('%02d', sdValue % 4)}",
                                                            "{tbName}_{format('%04d', sdValue % 16)}");
// Path: ddal-ddr/src/main/java/org/hellojavaer/ddal/ddr/shard/RangeShardValue.java
// public class RangeShardValue {
// 
//     private Long begin;
//     private Long end;
// 
//     public RangeShardValue() {
//     }
// 
//     public RangeShardValue(Long begin, Long end) {
//         this.begin = begin;
//         this.end = end;
//     }
// 
//     public Long getBegin() {
//         return begin;
//     }
// 
//     public void setBegin(Long begin) {
//         this.begin = begin;
//     }
// 
//     public Long getEnd() {
//         return end;
//     }
// 
//     public void setEnd(Long end) {
//         this.end = end;
//     }
// 
//     @Override
//     public String toString() {
//         return "{" + "begin:" + begin + ",end:" + end + '}';
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(begin, end);
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         RangeShardValue that = (RangeShardValue) o;
// 
//         if (begin != null ? !begin.equals(that.begin) : that.begin != null) return false;
//         return end != null ? end.equals(that.end) : that.end == null;
// 
//     }
// 
// }
// 
// Path: ddal-ddr/src/main/java/org/hellojavaer/ddal/ddr/shard/simple/SimpleShardRouteRuleBinding.java
// public class SimpleShardRouteRuleBinding implements ShardRouteRuleBinding, Serializable {
// 
//     private static final long serialVersionUID = 0L;
// 
//     private String            scName;
//     private String            tbName;
//     private String            sdKey;
//     private ShardRouteRule    rule;
//     private String            sdValues;
// 
//     public SimpleShardRouteRuleBinding() {
//     }
// 
//     public SimpleShardRouteRuleBinding(String scName, String tbName, String sdKey, ShardRouteRule rule) {
//         this(scName, tbName, sdKey, rule, null);
//     }
// 
//     public SimpleShardRouteRuleBinding(String scName, String tbName, String sdKey, ShardRouteRule rule, String sdValues) {
//         this.scName = scName;
//         this.tbName = tbName;
//         this.sdKey = sdKey;
//         this.rule = rule;
//         this.sdValues = sdValues;
//     }
// 
//     @Override
//     public String getScName() {
//         return scName;
//     }
// 
//     public void setScName(String scName) {
//         this.scName = scName;
//     }
// 
//     @Override
//     public String getTbName() {
//         return tbName;
//     }
// 
//     public void setTbName(String tbName) {
//         this.tbName = tbName;
//     }
// 
//     @Override
//     public String getSdKey() {
//         return sdKey;
//     }
// 
//     public void setSdKey(String sdKey) {
//         this.sdKey = sdKey;
//     }
// 
//     @Override
//     public ShardRouteRule getRule() {
//         return rule;
//     }
// 
//     public void setRule(ShardRouteRule rule) {
//         this.rule = rule;
//     }
// 
//     public String getSdValues() {
//         return sdValues;
//     }
// 
//     public void setSdValues(String sdValues) {
//         this.sdValues = sdValues;
//     }
// 
// }


// Path: ddal-ddr/src/test/java/org/hellojavaer/ddal/ddr/shard/rule/SpelShardRouteRuleTest.java
import org.hellojavaer.ddal.core.utils.Assert;
import org.hellojavaer.ddal.ddr.shard.RangeShardValue;
import org.hellojavaer.ddal.ddr.shard.ShardRouteInfo;
import org.hellojavaer.ddal.ddr.shard.simple.SimpleShardRouteRuleBinding;
import org.hellojavaer.ddal.ddr.shard.simple.SimpleShardRouter;
import org.junit.Test;
import java.util.*;

    @Test
    public void test01() {
        SpelShardRouteRule rule = new SpelShardRouteRule("{scName}_{#format('%02d', sdValue % 4)}",
                                                         "{tbName}_{#format('%04d', sdValue % 8)}");
        Assert.equals(rule.parseScName("member", 10101), "member_01");
        Assert.equals(rule.parseTbName("user", 10101), "user_0005");
    }

    @Test
    public void test02() {
        List<String> expectedResult = new ArrayList();
        expectedResult.add("db_00.user_0000");
        expectedResult.add("db_01.user_0001");
        expectedResult.add("db_02.user_0002");
        expectedResult.add("db_03.user_0003");
        expectedResult.add("db_00.user_0004");
        expectedResult.add("db_01.user_0005");
        expectedResult.add("db_02.user_0006");
        expectedResult.add("db_03.user_0007");
        expectedResult.add("db_00.user_0008");
        expectedResult.add("db_01.user_0009");
        expectedResult.add("db_02.user_0010");
        expectedResult.add("db_03.user_0011");
        expectedResult.add("db_00.user_0012");
        expectedResult.add("db_01.user_0013");
        expectedResult.add("db_02.user_0014");
        expectedResult.add("db_03.user_0015");
        List<SimpleShardRouteRuleBinding> bindings = new ArrayList<SimpleShardRouteRuleBinding>();
        SpelShardRouteRule numRule = new SpelShardRouteRule("{scName}_{format('%02d', sdValue % 4)}",
                                                            "{tbName}_{format('%04d', sdValue % 16)}");
        SimpleShardRouteRuleBinding user = new SimpleShardRouteRuleBinding();