package com.taobao.tddl.optimizer.parse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Assert;
import org.junit.Test;
import com.alibaba.fastjson.JSON;
import com.taobao.tddl.optimizer.parse.hint.DirectlyRouteCondition;
import com.taobao.tddl.optimizer.parse.hint.ExtraCmdRouteCondition;
import com.taobao.tddl.optimizer.parse.hint.RouteCondition;
import com.taobao.tddl.optimizer.parse.hint.RuleRouteCondition;
import com.taobao.tddl.optimizer.parse.hint.SimpleHintParser;
public class SimpleHintParserTest {
@Test
public void testParser() {
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("relation", "and");
map1.put("paramtype", "int");
List<String> exprs = new ArrayList<String>();
exprs.add("pk>4");
exprs.add("pk<10");
map1.put("expr", JSON.toJSON(exprs));
List<Object> paramsO = new ArrayList<Object>();
paramsO.add(JSON.toJSON(map1));
Map<String, Object> hintmap = new HashMap<String, Object>();
hintmap.put("params", JSON.toJSON(paramsO));
hintmap.put("type", "condition");
hintmap.put("vtab", "vtabxxx");
String text = JSON.toJSONString(hintmap);
System.out.println(text);
RouteCondition route = SimpleHintParser.convertHint2RouteCondition("/*+TDDL(" + text + ")*/", null);
System.out.println(route);
}
@Test
public void testDirect() {
String sql = "/*+TDDL({\"type\":\"direct\",\"vtab\":\"real_tab\",\"dbid\":\"xxx_group\",\"realtabs\":[\"real_tab_0\",\"real_tab_1\"]})*/select * from real_tab";
DirectlyRouteCondition route = (DirectlyRouteCondition) SimpleHintParser.convertHint2RouteCondition(sql, null);
System.out.println(route);
Assert.assertEquals("xxx_group", route.getDbId());
Assert.assertEquals(2, route.getTables().size());
Assert.assertEquals("real_tab", route.getVirtualTableName());
}
@Test
public void testCondition() {
String sql = "/*+TDDL({\"type\":\"condition\",\"vtab\":\"vtabxxx\",\"params\":[{\"relation\":\"and\",\"expr\":[\"pk>4\",\"pk<10\"],\"paramtype\":\"int\"}],\"skip\":10,\"max\":20,\"orderby\":\"col1\",\"asc\":\"true\"})*/";
RuleRouteCondition route = (RuleRouteCondition) SimpleHintParser.convertHint2RouteCondition(sql, null);
System.out.println(route);
Assert.assertEquals("vtabxxx", route.getVirtualTableName());
Assert.assertEquals("(>4) AND (<10)", route.getParameters().get("PK").toString());
}
@Test
public void testExtraCmd() {
String sql = "/*+TDDL({\"extra\":{\"ChooseIndex\":\"true\",\"ALLOW_TEMPORARY_TABLE\":\"true\"}})*/select * from real_tab";
ExtraCmdRouteCondition route = (ExtraCmdRouteCondition) SimpleHintParser.convertHint2RouteCondition(sql, null);
System.out.println(route);
Assert.assertEquals("{CHOOSEINDEX=true, ALLOW_TEMPORARY_TABLE=true}", route.getExtraCmds().toString());
}
}