package com.taobao.tddl.optimizer; import org.junit.AfterClass; import org.junit.BeforeClass; import com.taobao.tddl.common.exception.TddlException; import com.taobao.tddl.common.model.Matrix; import com.taobao.tddl.optimizer.config.table.RepoSchemaManager; import com.taobao.tddl.optimizer.config.table.StaticSchemaManager; import com.taobao.tddl.optimizer.config.table.parse.MatrixParser; import com.taobao.tddl.optimizer.costbased.CostBasedOptimizer; import com.taobao.tddl.optimizer.costbased.esitimater.stat.LocalStatManager; import com.taobao.tddl.optimizer.costbased.esitimater.stat.StatManager; import com.taobao.tddl.optimizer.parse.SqlParseManager; import com.taobao.tddl.optimizer.parse.cobar.CobarSqlParseManager; import com.taobao.tddl.optimizer.rule.OptimizerRule; import com.taobao.tddl.optimizer.rule.RuleIndexManager; import com.taobao.tddl.repo.mysql.sqlconvertor.SqlConvertor; import com.taobao.tddl.repo.mysql.sqlconvertor.SqlMergeNode; import com.taobao.tddl.rule.TddlRule; public class BaseSqlOptimizerTest { protected static final String APPNAME = "tddl"; protected static final String table_file = "matrix/mysql_schema.xml"; protected static final String matrix_file = "matrix/server_topology.xml"; protected static final String rule_file = "matrix/mysql_rule.xml"; protected static SqlParseManager parser = new CobarSqlParseManager(); protected static OptimizerRule rule; protected static RepoSchemaManager schemaManager; protected static CostBasedOptimizer optimizer; protected static StatManager statManager; protected static SqlConvertor sqlConvert = new SqlConvertor(); @BeforeClass public static void initial() throws TddlException { parser.init(); OptimizerContext context = new OptimizerContext(); TddlRule tddlRule = new TddlRule(); tddlRule.setAppRuleFile("classpath:" + rule_file); tddlRule.setAppName(APPNAME); tddlRule.init(); rule = new OptimizerRule(tddlRule); StaticSchemaManager localSchemaManager = StaticSchemaManager.parseSchema(Thread.currentThread() .getContextClassLoader() .getResourceAsStream(table_file)); Matrix matrix = MatrixParser.parse(Thread.currentThread() .getContextClassLoader() .getResourceAsStream(matrix_file)); schemaManager = new RepoSchemaManager(); schemaManager.setLocal(localSchemaManager); schemaManager.setGroup(matrix.getGroup("andor_mysql_group_0")); schemaManager.init(); statManager = new LocalStatManager(); statManager.init(); context.setMatrix(matrix); context.setRule(rule); context.setSchemaManager(schemaManager); context.setStatManager(statManager); context.setIndexManager(new RuleIndexManager(schemaManager)); OptimizerContext.setContext(context); optimizer = new CostBasedOptimizer(); optimizer.setSqlParseManager(parser); optimizer.init(); } @AfterClass public static void tearDown() throws TddlException { schemaManager.destory(); statManager.destory(); parser.destory(); optimizer.destory(); } public SqlMergeNode getMergeNode(String sql) throws Exception { return sqlConvert.convert(null, optimizer.optimizeAndAssignment(sql, null, null, true), false); } public String getSql0(SqlMergeNode node) { return node.getSubQuerys().get("group0").get(0).getSql(); } public String getSql1(SqlMergeNode node) { return node.getSubQuerys().get("group1").get(0).getSql(); } }