package io.mycat.parser.druid;
import io.mycat.route.parser.druid.MycatSchemaStatVisitor;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Assert;
import org.junit.Test;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.stat.TableStat.Condition;
/**
* TODO: 增加描述
*
* @author user
* @date 2015-6-2 下午5:50:25
* @version 0.1.0
* @copyright wonhigh.cn
*/
public class MycatSchemaStatVisitorTest {
/**
* 3层嵌套or语句
*/
@Test
public void test1() {
String sql = "select id from travelrecord "
+ " where id = 1 and ( fee=3 or days=5 or (traveldate = '2015-05-04 00:00:07.375' "
+ " and (user_id=2 or fee=days or fee = 0))) and id=2" ;
List<List<Condition>> list = getConditionList(sql);
Assert.assertEquals(list.size(), 5);
Assert.assertEquals(list.get(0).size(), 2);
Assert.assertEquals(list.get(1).size(), 2);
Assert.assertEquals(list.get(2).size(), 3);
Assert.assertEquals(list.get(3).size(), 4);
Assert.assertEquals(list.get(4).size(), 3);
Assert.assertEquals(list.get(0).get(0).toString(), "travelrecord.days = 5");
Assert.assertEquals(list.get(0).get(1).toString(), "travelrecord.id = (1, 2)");
Assert.assertEquals(list.get(1).get(0).toString(), "travelrecord.fee = 3");
Assert.assertEquals(list.get(1).get(1).toString(), "travelrecord.id = (1, 2)");
Assert.assertEquals(list.get(2).get(0).toString(), "travelrecord.fee = 0");
Assert.assertEquals(list.get(2).get(1).toString(), "travelrecord.traveldate = 2015-05-04 00:00:07.375");
Assert.assertEquals(list.get(2).get(2).toString(), "travelrecord.id = (1, 2)");
Assert.assertEquals(list.get(3).get(0).toString(), "travelrecord.fee = null");
Assert.assertEquals(list.get(3).get(1).toString(), "travelrecord.days = null");
Assert.assertEquals(list.get(3).get(2).toString(), "travelrecord.traveldate = 2015-05-04 00:00:07.375");
Assert.assertEquals(list.get(3).get(3).toString(), "travelrecord.id = (1, 2)");
Assert.assertEquals(list.get(4).get(0).toString(), "travelrecord.user_id = 2");
Assert.assertEquals(list.get(4).get(1).toString(), "travelrecord.traveldate = 2015-05-04 00:00:07.375");
Assert.assertEquals(list.get(4).get(2).toString(), "travelrecord.id = (1, 2)");
System.out.println(list.size());
}
/**
* 1层嵌套or语句
*/
@Test
public void test2() {
String sql = "select id from travelrecord "
+ " where id = 1 and ( fee=3 or days=5 or name = 'zhangsan')" ;
List<List<Condition>> list = getConditionList(sql);
Assert.assertEquals(list.size(), 3);
Assert.assertEquals(list.get(0).size(), 2);
Assert.assertEquals(list.get(1).size(), 2);
Assert.assertEquals(list.get(2).size(), 2);
Assert.assertEquals(list.get(0).get(0).toString(), "travelrecord.name = zhangsan");
Assert.assertEquals(list.get(0).get(1).toString(), "travelrecord.id = 1");
Assert.assertEquals(list.get(1).get(0).toString(), "travelrecord.days = 5");
Assert.assertEquals(list.get(1).get(1).toString(), "travelrecord.id = 1");
Assert.assertEquals(list.get(2).get(0).toString(), "travelrecord.fee = 3");
Assert.assertEquals(list.get(2).get(1).toString(), "travelrecord.id = 1");
}
/**
* 1层嵌套or语句
*/
@Test
public void test3() {
String sql = "select id from travelrecord "
+ " where id = 1 and fee=3 or days=5 or name = 'zhangsan'" ;
List<List<Condition>> list = getConditionList(sql);
Assert.assertEquals(list.size(), 3);
Assert.assertEquals(list.get(0).size(), 1);
Assert.assertEquals(list.get(1).size(), 1);
Assert.assertEquals(list.get(2).size(), 2);
Assert.assertEquals(list.get(0).get(0).toString(), "travelrecord.name = zhangsan");
Assert.assertEquals(list.get(1).get(0).toString(), "travelrecord.days = 5");
Assert.assertEquals(list.get(2).get(0).toString(), "travelrecord.id = 1");
Assert.assertEquals(list.get(2).get(1).toString(), "travelrecord.fee = 3");
}
private List<List<Condition>> getConditionList(String sql) {
SQLStatementParser parser =null;
parser = new MySqlStatementParser(sql);
MycatSchemaStatVisitor visitor = null;
SQLStatement statement = null;
//解析出现问题统一抛SQL语法错误
try {
statement = parser.parseStatement();
visitor = new MycatSchemaStatVisitor();
} catch (Exception e) {
e.printStackTrace();
}
statement.accept(visitor);
List<List<Condition>> mergedConditionList = new ArrayList<List<Condition>>();
if(visitor.hasOrCondition()) {//包含or语句
//TODO
//根据or拆分
mergedConditionList = visitor.splitConditions();
} else {//不包含OR语句
mergedConditionList.add(visitor.getConditions());
}
return mergedConditionList;
}
}