package org.opencloudb.parser.druid;
import java.sql.SQLNonTransientException;
import org.opencloudb.config.model.SchemaConfig;
import org.opencloudb.route.RouteResultset;
import com.alibaba.druid.sql.ast.SQLStatement;
/**
* 对SQLStatement解析
* 主要通过visitor解析和statement解析:有些类型的SQLStatement通过visitor解析足够了,
* 有些只能通过statement解析才能得到所有信息
* 有些需要通过两种方式解析才能得到完整信息
* @author wang.dw
*
*/
public interface DruidParser {
/**
* 使用MycatSchemaStatVisitor解析,得到tables、tableAliasMap、conditions等
* @param schema
* @param stmt
*/
public void parser(SchemaConfig schema, RouteResultset rrs, SQLStatement stmt) throws SQLNonTransientException;
/**
* statement方式解析
* 子类可覆盖(如果visitorParse解析得不到表名、字段等信息的,就通过覆盖该方法来解析)
* 子类覆盖该方法一般是将SQLStatement转型后再解析(如转型为MySqlInsertStatement)
*/
public void statementParse(SchemaConfig schema, RouteResultset rrs, SQLStatement stmt) throws SQLNonTransientException;
/**
* 子类可覆盖(如果该方法解析得不到表名、字段等信息的,就覆盖该方法,覆盖成空方法,然后通过statementPparse去解析)
* 通过visitor解析:有些类型的Statement通过visitor解析得不到表名、
* @param stmt
*/
public void visitorParse(RouteResultset rrs, SQLStatement stmt) throws SQLNonTransientException;
/**
* 改写sql:加limit,加group by、加order by如有些没有加limit的可以通过该方法增加
* @param schema
* @param rrs
* @param stmt
* @throws SQLNonTransientException
*/
public void changeSql(SchemaConfig schema, RouteResultset rrs, SQLStatement stmt) throws SQLNonTransientException;
/**
* 获取解析到的信息
* @return
*/
public DruidShardingParseInfo getCtx();
}