public abstract class AbstractInsertParser implements SQLParser {
@Getter(AccessLevel.PROTECTED)
private final ShardingRule shardingRule;
@Getter(AccessLevel.PROTECTED)
private final LexerEngine lexerEngine;
private final AbstractInsertClauseParserFacade insertClauseParserFacade;
public AbstractInsertParser(final ShardingRule shardingRule, final LexerEngine lexerEngine, final AbstractInsertClauseParserFacade insertClauseParserFacade) {
this.shardingRule = shardingRule;
this.lexerEngine = lexerEngine;
this.insertClauseParserFacade = insertClauseParserFacade;
}
@Override
public final DMLStatement parse() {
//读取下一个标记,比如INSERT INTO t_order (user_id, status) VALUES (10, 'INIT')
//就读取到INTO
lexerEngine.nextToken();
//创建InsertStatement
InsertStatement result = new InsertStatement();
//读取INTO后面的表名
insertClauseParserFacade.getInsertIntoClauseParser().parse(result);
//读取插入的列
insertClauseParserFacade.getInsertColumnsClauseParser().parse(result);
//不支持INSERT SELECT
if (lexerEngine.equalAny(DefaultKeyword.SELECT, Symbol.LEFT_PAREN)) {
throw new UnsupportedOperationException("Cannot INSERT SELECT");
}
//读取VALUES 后面
insertClauseParserFacade.getInsertValuesClauseParser().parse(result);
//读取SET 后面
insertClauseParserFacade.getInsertSetClauseParser().parse(result);
//处理自增键
appendGenerateKey(result);
return result;
}
private void appendGenerateKey(final InsertStatement insertStatement) {
String tableName = insertStatement.getTables().getSingleTableName();
Optional<String> generateKeyColumn = shardingRule.getGenerateKeyColumn(tableName);
if (!generateKeyColumn.isPresent() || null != insertStatement.getGeneratedKey()) {
return;
}
ItemsToken columnsToken = new ItemsToken(insertStatement.getColumnsListLastPosition());
columnsToken.getItems().add(generateKeyColumn.get());
insertStatement.getSqlTokens().add(columnsToken);
insertStatement.getSqlTokens().add(new GeneratedKeyToken(insertStatement.getValuesListLastPosition()));
}
}
AbstractInsertClauseParserFacade
门面模式
@RequiredArgsConstructor
@Getter
public abstract class AbstractInsertClauseParserFacade {
private final InsertIntoClauseParser insertIntoClauseParser;
private final InsertColumnsClauseParser insertColumnsClauseParser;
private final InsertValuesClauseParser insertValuesClauseParser;
private final InsertSetClauseParser insertSetClauseParser;
}
SQLParsingEngine
sql分析引擎
会先使用词法分析引擎进行词法分析
SQLParserFactory
sql解析器工厂,负责根据sql第一个标记类型创建出相应的解析器
解析器工厂(负责根据数据库类型选择具体解析器)分类:
SELECT<--->SelectParserFactory、INSERT<--->InsertParserFactory、UPDATE<--->UpdateParserFactory、DELETE<--->DeleteParserFactory、CREATE<--->CreateParserFactory、ALTER<--->AlterParserFactory、DROP<--->DropParserFactory、TRUNCATE<--->TruncateParserFactory
解析器分类:
SELECT<--->AbstractSelectParser、INSERT<--->AbstractInsertParser、UPDATE<--->AbstractUpdateParser、DELETE<--->AbstractDeleteParser、CREATE<--->AbstractCreateParser、ALTER<--->AbstractAlterParser、DROP<--->AbstractDropParser、TRUNCATE<--->AbstractTruncateParser
SQLParser
解析器
以插入为例
插入语句解析器
AbstractInsertClauseParserFacade
门面模式
InsertIntoClauseParser
INTO 部分解析
TableReferencesClauseParser
AliasClauseParser
InsertColumnsClauseParser
列 部分解析
InsertValuesClauseParser