public SQLResponse doQueryWithCache()

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();
            }
        }
    }