From 08a2e889e7f951faa6d1b5d30ea88bb9aecd5e06 Mon Sep 17 00:00:00 2001 From: jerryjzhang Date: Wed, 19 Feb 2025 23:25:56 +0800 Subject: [PATCH] [feature][headless]Introduce `TranslatorConfig` to make result limit configurable via system parameter. --- .../core/translator/TranslatorConfig.java | 24 +++++++++++++++++++ .../optimizer/ResultLimitOptimizer.java | 2 +- .../service/impl/S2SemanticLayerService.java | 7 +++++- 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/TranslatorConfig.java diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/TranslatorConfig.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/TranslatorConfig.java new file mode 100644 index 000000000..aa73163c0 --- /dev/null +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/TranslatorConfig.java @@ -0,0 +1,24 @@ +package com.tencent.supersonic.headless.core.translator; + +import com.google.common.collect.Lists; +import com.tencent.supersonic.common.config.ParameterConfig; +import com.tencent.supersonic.common.pojo.Parameter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service("HeadlessTranslatorConfig") +@Slf4j +public class TranslatorConfig extends ParameterConfig { + + public static final Parameter TRANSLATOR_RESULT_LIMIT = + new Parameter("s2.query-optimizer.resultLimit", "1000", "查询最大返回数据行数", + "为了前端展示性能考虑,请不要设置过大", "number", "语义翻译配置"); + + @Override + public List getSysParameters() { + return Lists.newArrayList(TRANSLATOR_RESULT_LIMIT); + } + +} diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/optimizer/ResultLimitOptimizer.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/optimizer/ResultLimitOptimizer.java index ed7d56fea..c2137dfc6 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/optimizer/ResultLimitOptimizer.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/optimizer/ResultLimitOptimizer.java @@ -16,6 +16,6 @@ public class ResultLimitOptimizer implements QueryOptimizer { @Override public void rewrite(QueryStatement queryStatement) { - queryStatement.setSql(queryStatement.getSql() + " limit " + queryStatement.getLimit()); + queryStatement.setSql(queryStatement.getSql() + " LIMIT " + queryStatement.getLimit()); } } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2SemanticLayerService.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2SemanticLayerService.java index d5af251cd..57821e84a 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2SemanticLayerService.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2SemanticLayerService.java @@ -24,6 +24,7 @@ import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.pojo.SqlQuery; import com.tencent.supersonic.headless.core.pojo.StructQuery; import com.tencent.supersonic.headless.core.translator.SemanticTranslator; +import com.tencent.supersonic.headless.core.translator.TranslatorConfig; import com.tencent.supersonic.headless.core.utils.ComponentFactory; import com.tencent.supersonic.headless.server.annotation.S2DataPermission; import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService; @@ -59,6 +60,7 @@ public class S2SemanticLayerService implements SemanticLayerService { private final KnowledgeBaseService knowledgeBaseService; private final MetricService metricService; private final DimensionService dimensionService; + private final TranslatorConfig translatorConfig; private final QueryCache queryCache = ComponentFactory.getQueryCache(); private final List queryExecutors = ComponentFactory.getQueryExecutors(); @@ -67,7 +69,7 @@ public class S2SemanticLayerService implements SemanticLayerService { SchemaService schemaService, SemanticTranslator semanticTranslator, MetricDrillDownChecker metricDrillDownChecker, KnowledgeBaseService knowledgeBaseService, MetricService metricService, - DimensionService dimensionService) { + DimensionService dimensionService, TranslatorConfig translatorConfig) { this.statUtils = statUtils; this.queryUtils = queryUtils; this.semanticSchemaManager = semanticSchemaManager; @@ -78,6 +80,7 @@ public class S2SemanticLayerService implements SemanticLayerService { this.knowledgeBaseService = knowledgeBaseService; this.metricService = metricService; this.dimensionService = dimensionService; + this.translatorConfig = translatorConfig; } public DataSetSchema getDataSetSchema(Long id) { @@ -300,6 +303,8 @@ public class S2SemanticLayerService implements SemanticLayerService { QueryStatement queryStatement = new QueryStatement(); queryStatement.setEnableOptimize(queryUtils.enableOptimize()); + queryStatement.setLimit(Integer.parseInt(translatorConfig.getParameterValue( + TranslatorConfig.TRANSLATOR_RESULT_LIMIT))); queryStatement.setDataSetId(queryReq.getDataSetId()); queryStatement.setDataSetName(queryReq.getDataSetName()); queryStatement.setSemanticSchema(semanticSchemaResp);