package com.taobao.tddl.rule;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.google.common.collect.Lists;
import com.taobao.tddl.common.exception.TddlException;
import com.taobao.tddl.rule.BaseRuleTest.Choicer;
import com.taobao.tddl.rule.exceptions.RouteCompareDiffException;
import com.taobao.tddl.rule.exceptions.TddlRuleException;
import com.taobao.tddl.rule.model.MatcherResult;
import com.taobao.tddl.rule.model.TargetDB;
import com.taobao.tddl.rule.model.sqljep.Comparative;
import com.taobao.tddl.rule.utils.MatchResultCompare;
/**
* 一些常见的本地rule测试
*
* @author jianghang 2013-11-6 下午9:22:54
* @since 5.0.0
*/
public class LocalRuleTest {
static TddlRule rule;
static TddlRule mvrRule;
@BeforeClass
public static void setUp() {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:local/spring-context.xml");
rule = (TddlRule) context.getBean("rule");
mvrRule = (TddlRule) context.getBean("mvrRule");
}
@AfterClass
public static void tearDown() throws TddlException {
rule.destory();
mvrRule.destory();
}
@Test
public void testRule_equals() {
MatcherResult result = rule.route("nserch", "message_id = 1");
List<TargetDB> dbs = result.getCalculationResult();
Assert.assertEquals(1, dbs.size());
Assert.assertEquals("NSEARCH_GROUP_2", dbs.get(0).getDbIndex());
Assert.assertEquals(1, dbs.get(0).getTableNames().size());
Assert.assertEquals("nserch_1", dbs.get(0).getTableNames().iterator().next());
}
@Test
public void testRule_in() {
String conditionStr = "message_id in (996,997,998,999,1000,1001,1002,1003,1004):int";
MatcherResult result = rule.route("nserch", conditionStr);
List<TargetDB> dbs = result.getCalculationResult();
Assert.assertEquals(3, dbs.size());
StringBuilder sb = new StringBuilder("目标库:");
sb.append(dbs.get(0).getDbIndex());
sb.append(" 所要执行的表:");
for (String table : dbs.get(0).getTableNames()) {
sb.append(table);
sb.append(" ");
}
Assert.assertEquals("目标库:NSEARCH_GROUP_1 所要执行的表:nserch_18 nserch_15 nserch_12 ", sb.toString());
}
@Test(expected = TddlRuleException.class)
public void testRoute_noVersion() {
// 不存在该version版本
rule.route("nserch", "message_id = 1", "V1");
}
@Test
public void testRule_Trim() {
String conditionStr = "message_id in (996 ,997 , 998,999,1000 ,1001, 1002,1003,1004):int";
MatcherResult result = rule.route("nserch", conditionStr);
List<TargetDB> dbs = result.getCalculationResult();
Assert.assertEquals(3, dbs.size());
StringBuilder sb = new StringBuilder("目标库:");
sb.append(dbs.get(0).getDbIndex());
sb.append(" 所要执行的表:");
for (String table : dbs.get(0).getTableNames()) {
sb.append(table);
sb.append(" ");
}
Assert.assertEquals("目标库:NSEARCH_GROUP_1 所要执行的表:nserch_18 nserch_15 nserch_12 ", sb.toString());
}
@Test
public void testRule_date() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String conditionStr = "message_id >24:int and message_id<=26:int;gmt_create>=" + sdf.format(new Date())
+ ":date";
MatcherResult result = rule.route("nserch", conditionStr);
Assert.assertEquals(true,
MatchResultCompare.oriDbTabCompareWithMatchResult(result, "NSEARCH_GROUP_2", "nserch_1"));
}
@Test
public void testRule_FullTableScan() {
String conditionStr = "";
MatcherResult result = rule.route("nserch", conditionStr);
List<TargetDB> dbs = result.getCalculationResult();
StringBuilder sb = new StringBuilder("目标库:");
sb.append(dbs.get(0).getDbIndex());
sb.append(" 所要执行的表:");
for (String table : dbs.get(0).getTableNames()) {
sb.append(table);
sb.append(" ");
}
System.out.println(sb.toString());
StringBuilder sb2 = new StringBuilder("目标库:");
sb2.append(dbs.get(1).getDbIndex());
sb2.append(" 所要执行的表:");
for (String table : dbs.get(1).getTableNames()) {
sb2.append(table);
sb2.append(" ");
}
System.out.println(sb2.toString());
StringBuilder sb3 = new StringBuilder("目标库:");
sb3.append(dbs.get(2).getDbIndex());
sb3.append(" 所要执行的表:");
for (String table : dbs.get(2).getTableNames()) {
sb3.append(table);
sb3.append(" ");
}
System.out.println(sb3.toString());
}
@Test
public void testRouteWithSpecifyRuleVersion() {
MatcherResult result = mvrRule.route("nserch", "message_id = 1", "V1");
List<TargetDB> dbs = result.getCalculationResult();
Assert.assertEquals(1, dbs.size());
Assert.assertEquals("NSEARCH_GROUP_2", dbs.get(0).getDbIndex());
Assert.assertEquals(1, dbs.get(0).getTableNames().size());
Assert.assertEquals("nserch_1", dbs.get(0).getTableNames().iterator().next());
}
@Test
public void testRouteMultiVersionAndCompareTSqlTypeStringString() {
Choicer choicer = new Choicer();
choicer.addComparative("MESSAGE_ID", new Comparative(Comparative.Equivalent, 1)); // 一定要大写
MatcherResult result = null;
try {
result = mvrRule.routeMverAndCompare(false, "nserch", choicer, Lists.newArrayList());
} catch (RouteCompareDiffException e) {
Assert.fail(ExceptionUtils.getFullStackTrace(e));
}
List<TargetDB> dbs = result.getCalculationResult();
Assert.assertEquals(1, dbs.size());
Assert.assertEquals("NSEARCH_GROUP_2", dbs.get(0).getDbIndex());
Assert.assertEquals(1, dbs.get(0).getTableNames().size());
Assert.assertEquals("nserch_1", dbs.get(0).getTableNames().iterator().next());
}
}