in src/query-service/src/main/java/org/apache/kylin/rest/service/QueryService.java [549:665]
public SQLResponse doQueryWithCache(SQLRequest sqlRequest) {
checkSqlRequest(sqlRequest);
if (sqlRequest.getBackdoorToggles() != null) {
BackdoorToggles.addToggles(sqlRequest.getBackdoorToggles());
QueryTrace queryTrace = QueryContext.currentTrace();
Optional.ofNullable(BackdoorToggles.getConnectionCreatingTime())
.ifPresent(duration -> queryTrace.appendSpanFromRequest(CONNECTION_CREATING_TIME, duration));
Optional.ofNullable(BackdoorToggles.getStatementToRequestTime())
.ifPresent(duration -> queryTrace.appendSpanFromRequest(STATEMENT_TO_REQUEST_TIME, duration));
}
QueryContext queryContext = QueryContext.current();
QueryMetricsContext.start(queryContext.getQueryId(), getDefaultServer());
final String project = sqlRequest.getProject();
SQLResponse sqlResponse = null;
try {
QueryContext.currentTrace().startSpan(GET_ACL_INFO);
queryContext.setAclInfo(getExecuteAclInfo(project, sqlRequest.getExecuteAs()));
QueryContext.currentTrace().startSpan(QueryTrace.SQL_TRANSFORMATION);
queryContext.getMetrics().setServer(clusterManager.getLocalServer());
queryContext.setProject(project);
KylinConfig kylinConfig = NProjectManager.getProjectConfig(project);
// Parsing user sql by RawSqlParser
RawSql rawSql = new RawSqlParser(sqlRequest.getSql()).parse();
rawSql.autoAppendLimit(kylinConfig, sqlRequest.getLimit(), sqlRequest.getOffset());
WhiteSpaceParser whiteSpaceParser = new WhiteSpaceParser(EscapeDialect.DEFAULT,
rawSql.getStatementString().trim());
sqlRequest.setNormalizedSql(whiteSpaceParser.parse());
// Reset request sql for code compatibility
sqlRequest.setSql(rawSql.getStatementString());
// Set user sql for log & record purpose
queryContext.setUserSQL(rawSql.getFullTextString());
// Set first hint string for later use
queryContext.setFirstHintStr(rawSql.getFirstHintString());
// Apply model priority if provided
applyModelPriority(queryContext, rawSql);
// Apply sql black list check if matching
applyQuerySqlBlacklist(project, rawSql.getStatementString());
// search cache
if (kylinConfig.isQueryCacheEnabled() && !sqlRequest.isForcedToPushDown()
&& !queryContext.getQueryTagInfo().isAsyncQuery()) {
sqlResponse = searchCache(sqlRequest, kylinConfig);
}
// REAL EXECUTION, if required
if (sqlResponse == null) {
try (QueryRequestLimits ignored = new QueryRequestLimits(project)) {
sqlResponse = queryAndUpdateCache(sqlRequest, kylinConfig);
}
}
if (sqlRequest.isIfBigQuery()) {
return sqlResponse;
}
QueryUtils.updateQueryContextSQLMetrics(rawSql.getStatementString());
QueryContext.currentTrace().amendLast(QueryTrace.PREPARE_AND_SUBMIT_JOB, System.currentTimeMillis());
QueryContext.currentTrace().endLastSpan();
QueryContext.current().record("update_metrics_time");
QueryContext.currentMetrics().setQueryEndTime(System.currentTimeMillis());
sqlResponse.setServer(clusterManager.getLocalServer());
sqlResponse.setQueryId(QueryContext.current().getQueryId());
if (sqlResponse.isStorageCacheUsed() || sqlResponse.isHitExceptionCache()) {
sqlResponse.setDuration(0);
} else {
sqlResponse.setDuration(QueryContext.currentMetrics().duration());
sqlResponse.setCpuTime(QueryContext.currentMetrics().getCpuTime());
}
logQuery(sqlRequest, sqlResponse);
addToQueryHistory(sqlRequest, sqlResponse, rawSql.getFullTextString());
if (isCollectQueryScanRowsAndTimeEnabled()) {
BigQueryThresholdUpdater.collectQueryScanRowsAndTime(QueryContext.currentMetrics().duration(),
QueryContext.currentMetrics().getTotalScanRows());
}
val fusionManager = FusionModelManager.getInstance(KylinConfig.getInstanceFromEnv(),
sqlRequest.getProject());
if (CollectionUtils.isNotEmpty(sqlResponse.getNativeRealizations())) {
sqlResponse.getNativeRealizations()
.forEach(realization -> realization.setModelId(fusionManager.getModelId(realization)));
}
//check query result row count
NCircuitBreaker.verifyQueryResultRowCount(sqlResponse.getResultRowCount());
return sqlResponse;
} catch (Exception e) {
QueryContext.current().getMetrics().setException(true);
if (sqlResponse != null) {
sqlResponse.setException(true);
sqlResponse.setExceptionMessage(e.getMessage());
sqlResponse.setResults(null);
return sqlResponse;
} else {
return new SQLResponse(null, null, 0, true, e.getMessage());
}
} catch (TokenMgrError t) {
QueryContext.current().getMetrics().setException(true);
return new SQLResponse(null, null, 0, true, t.getMessage());
} finally {
BackdoorToggles.cleanToggles();
if (QueryMetricsContext.isStarted()) {
QueryMetricsContext.reset();
}
}
}