package com.taobao.tddl.qatest.matrix.hint; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.springframework.jdbc.core.JdbcTemplate; import com.taobao.tddl.qatest.BaseMatrixTestCase; import com.taobao.tddl.qatest.BaseTestCase; public class ConditionHintTest extends BaseMatrixTestCase { private JdbcTemplate jdbcTemplate; private Date time = new Date(); public ConditionHintTest(){ BaseTestCase.normaltblTableName = "mysql_normaltbl_oneGroup_oneAtom"; jdbcTemplate = new JdbcTemplate(us); } @Before public void initData() throws Exception { andorUpdateData("delete from mysql_normaltbl_oneGroup_oneAtom", null); andorUpdateData("delete from mysql_normaltbl_onegroup_mutilatom", null); } @Test public void test_简单等值条件() throws Exception { String sql = "/*+TDDL({\"type\":\"condition\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"params\":[{\"expr\":[\"pk=1:int\"]}]})*/"; sql += "insert into mysql_normaltbl_onegroup_mutilatom values(?,?,?,?,?,?,?)"; List<Object> param = new ArrayList<Object>(); param.add(RANDOM_ID); param.add(RANDOM_INT); param.add(time); param.add(time); param.add(time); param.add(name); param.add(fl); andorUpdateData(sql, param); // 用直连库进行查询 sql = "/*+TDDL({\"type\":\"direct\",\"dbid\":\"andor_mysql_group_2\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"realtabs\":[\"mysql_normaltbl_onegroup_mutilatom_01\"]})*/"; sql += "select gmt_timestamp from mysql_normaltbl_onegroup_mutilatom where pk=" + RANDOM_ID; Map re = jdbcTemplate.queryForMap(sql); Assert.assertEquals(time.getTime() / 1000, ((Date) re.get("GMT_TIMESTAMP")).getTime() / 1000); // 继续用规则hint查询 sql = "/*+TDDL({\"type\":\"condition\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"params\":[{\"expr\":[\"pk=1:int\"]}]})*/"; sql += "select gmt_timestamp from mysql_normaltbl_onegroup_mutilatom where pk=" + RANDOM_ID; re = jdbcTemplate.queryForMap(sql); Assert.assertEquals(time.getTime() / 1000, ((Date) re.get("GMT_TIMESTAMP")).getTime() / 1000); // 执行删除 sql = "/*+TDDL({\"type\":\"condition\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"params\":[{\"expr\":[\"pk=1:int\"]}]})*/"; sql += "delete from mysql_normaltbl_onegroup_mutilatom where pk = " + RANDOM_ID; andorUpdateData(sql, null); // 删除完之后,应该查不到 sql = "/*+TDDL({\"type\":\"direct\",\"dbid\":\"andor_mysql_group_2\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"realtabs\":[\"mysql_normaltbl_onegroup_mutilatom_01\"]})*/"; sql += "select gmt_timestamp from mysql_normaltbl_onegroup_mutilatom where pk=" + RANDOM_ID; List list = jdbcTemplate.queryForList(sql); Assert.assertEquals(0, list.size()); } @Test public void test_简单等值条件_指定groupIndex() throws Exception { String sql = "/*+TDDL({\"type\":\"condition\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"params\":[{\"expr\":[\"pk=1:int\"]}]})*/"; sql += "/*+TDDL_GROUP({groupIndex:0})*/"; sql += "insert into mysql_normaltbl_onegroup_mutilatom values(?,?,?,?,?,?,?)"; List<Object> param = new ArrayList<Object>(); param.add(RANDOM_ID); param.add(RANDOM_INT); param.add(time); param.add(time); param.add(time); param.add(name); param.add(fl); andorUpdateData(sql, param); // 用直连库进行查询 sql = "/*+TDDL({\"type\":\"direct\",\"dbid\":\"andor_mysql_group_2\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"realtabs\":[\"mysql_normaltbl_onegroup_mutilatom_01\"]})*/"; sql += "/*+TDDL_GROUP({groupIndex:0})*/"; sql += "select gmt_timestamp from mysql_normaltbl_onegroup_mutilatom where pk=" + RANDOM_ID; Map re = jdbcTemplate.queryForMap(sql); Assert.assertEquals(time.getTime() / 1000, ((Date) re.get("GMT_TIMESTAMP")).getTime() / 1000); // 继续用规则hint查询 sql = "/*+TDDL({\"type\":\"condition\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"params\":[{\"expr\":[\"pk=1:int\"]}]})*/"; sql += "/*+TDDL_GROUP({groupIndex:0})*/"; sql += "select gmt_timestamp from mysql_normaltbl_onegroup_mutilatom where pk=" + RANDOM_ID; re = jdbcTemplate.queryForMap(sql); Assert.assertEquals(time.getTime() / 1000, ((Date) re.get("GMT_TIMESTAMP")).getTime() / 1000); // 执行删除 sql = "/*+TDDL({\"type\":\"condition\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"params\":[{\"expr\":[\"pk=1:int\"]}]})*/"; sql += "/*+TDDL_GROUP({groupIndex:0})*/"; sql += "delete from mysql_normaltbl_onegroup_mutilatom where pk = " + RANDOM_ID; andorUpdateData(sql, null); // 删除完之后,应该查不到 sql = "/*+TDDL({\"type\":\"direct\",\"dbid\":\"andor_mysql_group_2\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"realtabs\":[\"mysql_normaltbl_onegroup_mutilatom_01\"]})*/"; sql += "/*+TDDL_GROUP({groupIndex:0})*/"; sql += "select gmt_timestamp from mysql_normaltbl_onegroup_mutilatom where pk=" + RANDOM_ID; List list = jdbcTemplate.queryForList(sql); Assert.assertEquals(0, list.size()); } @Test public void test_OR条件验证() throws Exception { // 使用or条件,会更新两个表 String sql = "/*+TDDL({\"type\":\"condition\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"params\":[{\"relation\":\"or\",\"expr\":[\"pk=0:int\",\"pk=1:int\"]}]})*/"; sql += "insert into mysql_normaltbl_onegroup_mutilatom values(?,?,?,?,?,?,?)"; List<Object> param = new ArrayList<Object>(); param.add(RANDOM_ID); param.add(RANDOM_INT); param.add(time); param.add(time); param.add(time); param.add(name); param.add(fl); andorUpdateData(sql, param); // 用直连库进行查询,查询两个表 sql = "/*+TDDL({\"type\":\"direct\",\"dbid\":\"andor_mysql_group_2\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"realtabs\":[\"mysql_normaltbl_onegroup_mutilatom_00\"]})*/"; sql += "select gmt_timestamp from mysql_normaltbl_onegroup_mutilatom where pk=" + RANDOM_ID; Map re = jdbcTemplate.queryForMap(sql); Assert.assertEquals(time.getTime() / 1000, ((Date) re.get("GMT_TIMESTAMP")).getTime() / 1000); sql = "/*+TDDL({\"type\":\"direct\",\"dbid\":\"andor_mysql_group_2\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"realtabs\":[\"mysql_normaltbl_onegroup_mutilatom_01\"]})*/"; sql += "select gmt_timestamp from mysql_normaltbl_onegroup_mutilatom where pk=" + RANDOM_ID; re = jdbcTemplate.queryForMap(sql); Assert.assertEquals(time.getTime() / 1000, ((Date) re.get("GMT_TIMESTAMP")).getTime() / 1000); // 继续用规则hint查询 sql = "/*+TDDL({\"type\":\"condition\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"params\":[{\"relation\":\"or\",\"expr\":[\"pk=0:int\",\"pk=1:int\"]}]})*/"; sql += "select gmt_timestamp from mysql_normaltbl_onegroup_mutilatom where pk=" + RANDOM_ID; List list = jdbcTemplate.queryForList(sql); Assert.assertEquals(2, list.size()); // 执行删除 sql = "/*+TDDL({\"type\":\"condition\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"params\":[{\"relation\":\"or\",\"expr\":[\"pk=0:int\",\"pk=1:int\"]}]})*/"; sql += "delete from mysql_normaltbl_onegroup_mutilatom where pk = " + RANDOM_ID; andorUpdateData(sql, null); // 删除完之后,应该查不到 sql = "/*+TDDL({\"type\":\"direct\",\"dbid\":\"andor_mysql_group_2\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"realtabs\":[\"mysql_normaltbl_onegroup_mutilatom_00\"]})*/"; sql += "select gmt_timestamp from mysql_normaltbl_onegroup_mutilatom where pk=" + RANDOM_ID; list = jdbcTemplate.queryForList(sql); Assert.assertEquals(0, list.size()); sql = "/*+TDDL({\"type\":\"direct\",\"dbid\":\"andor_mysql_group_2\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"realtabs\":[\"mysql_normaltbl_onegroup_mutilatom_01\"]})*/"; sql += "select gmt_timestamp from mysql_normaltbl_onegroup_mutilatom where pk=" + RANDOM_ID; list = jdbcTemplate.queryForList(sql); Assert.assertEquals(0, list.size()); } @Test public void test_and条件验证() throws Exception { // 使用or条件,会更新两个表 String sql = "/*+TDDL({\"type\":\"condition\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"params\":[{\"relation\":\"and\",\"expr\":[\"pk>=0:int\",\"pk<2:int\"]}]})*/"; sql += "insert into mysql_normaltbl_onegroup_mutilatom values(?,?,?,?,?,?,?)"; List<Object> param = new ArrayList<Object>(); param.add(RANDOM_ID); param.add(RANDOM_INT); param.add(time); param.add(time); param.add(time); param.add(name); param.add(fl); andorUpdateData(sql, param); // 用直连库进行查询,查询两个表 sql = "/*+TDDL({\"type\":\"direct\",\"dbid\":\"andor_mysql_group_2\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"realtabs\":[\"mysql_normaltbl_onegroup_mutilatom_00\"]})*/"; sql += "select gmt_timestamp from mysql_normaltbl_onegroup_mutilatom where pk=" + RANDOM_ID; Map re = jdbcTemplate.queryForMap(sql); Assert.assertEquals(time.getTime() / 1000, ((Date) re.get("GMT_TIMESTAMP")).getTime() / 1000); sql = "/*+TDDL({\"type\":\"direct\",\"dbid\":\"andor_mysql_group_2\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"realtabs\":[\"mysql_normaltbl_onegroup_mutilatom_01\"]})*/"; sql += "select gmt_timestamp from mysql_normaltbl_onegroup_mutilatom where pk=" + RANDOM_ID; re = jdbcTemplate.queryForMap(sql); Assert.assertEquals(time.getTime() / 1000, ((Date) re.get("GMT_TIMESTAMP")).getTime() / 1000); // 继续用规则hint查询 sql = "/*+TDDL({\"type\":\"condition\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"params\":[{\"relation\":\"and\",\"expr\":[\"pk>=0:int\",\"pk<2:int\"]}]})*/"; sql += "select gmt_timestamp from mysql_normaltbl_onegroup_mutilatom where pk=" + RANDOM_ID; List list = jdbcTemplate.queryForList(sql); Assert.assertEquals(2, list.size()); // 执行删除 sql = "/*+TDDL({\"type\":\"condition\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"params\":[{\"relation\":\"and\",\"expr\":[\"pk>=0:int\",\"pk<2:int\"]}]})*/"; sql += "delete from mysql_normaltbl_onegroup_mutilatom where pk = " + RANDOM_ID; andorUpdateData(sql, null); // 删除完之后,应该查不到 sql = "/*+TDDL({\"type\":\"direct\",\"dbid\":\"andor_mysql_group_2\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"realtabs\":[\"mysql_normaltbl_onegroup_mutilatom_00\"]})*/"; sql += "select gmt_timestamp from mysql_normaltbl_onegroup_mutilatom where pk=" + RANDOM_ID; list = jdbcTemplate.queryForList(sql); Assert.assertEquals(0, list.size()); sql = "/*+TDDL({\"type\":\"direct\",\"dbid\":\"andor_mysql_group_2\",\"vtab\":\"mysql_normaltbl_onegroup_mutilatom\",\"realtabs\":[\"mysql_normaltbl_onegroup_mutilatom_01\"]})*/"; sql += "select gmt_timestamp from mysql_normaltbl_onegroup_mutilatom where pk=" + RANDOM_ID; list = jdbcTemplate.queryForList(sql); Assert.assertEquals(0, list.size()); } }