StatementResource::createQuery()中构建一个Query
public void createQuery(
String statement, //查询SQL
@Context HttpServletRequest servletRequest,
@Context UriInfo uriInfo,
@Suspended AsyncResponse asyncResponse)
构建一个Query
Query构建细节
Query query = Query.create(
sessionContext,
statement, //查询SQL
queryManager,
sessionPropertyManager,
exchangeClient,
responseExecutor,
timeoutExecutor,
blockEncodingSerde);
在Query的构造中利用QueryManager
QueryInfo queryInfo = queryManager.createQuery(sessionContext, query);
QueryManager的实现类SqlQueryManager::createQuery(..)
* 构建queryId
* 机器启动检测
* 构建session, sessionContext中含有catalog等信息
* antlr解析SQL得到statement
* 根据statement的类型获得QueryExecution
* 启动后台查询queueManager.submit(statement, queryExecution, queryExecutor)
SqlQueryManager
@Override
public QueryInfo createQuery(SessionContext sessionContext, String query)
{
//构建queryId
QueryId queryId = queryIdGenerator.createNextQueryId();
try {
//机器启动检测
if (!acceptQueries.get()) {
//...
}
//构建session, sessionContext中含有catalog等信息
session = sessionSupplier.createSession(queryId, sessionContext);
if (query.length() > maxQueryLength) {
//对query的长度有限制
}
//antlr解析SQL
Statement wrappedStatement = sqlParser.createStatement(query, createParsingOptions(session));
statement = unwrapExecuteStatement(wrappedStatement, sqlParser, session);
List<Expression> parameters = wrappedStatement instanceof Execute ? ((Execute) wrappedStatement).getParameters() : emptyList();
validateParameters(statement, parameters);
//根据statement的类型构建queryExecution
QueryExecutionFactory<?> queryExecutionFactory = executionFactories.get(statement.getClass());
queryExecution = queryExecutionFactory.createQueryExecution(queryId, query, session, statement, parameters);
}
catch (ParsingException | PrestoException | SemanticException e) {
//...
}
QueryInfo queryInfo = queryExecution.getQueryInfo();
queryMonitor.queryCreatedEvent(queryInfo);
queryExecution.addFinalQueryInfoListener(finalQueryInfo -> {
// ....
}
});
addStatsListeners(queryExecution);
queries.put(queryId, queryExecution);
// 启动后台查询
queueManager.submit(statement, queryExecution, queryExecutor);
return queryInfo;
}