This is an automated email from the ASF dual-hosted git repository. liyang pushed a commit to branch kylin5 in repository https://gitbox.apache.org/repos/asf/kylin.git
commit 71a7a52d669f3c33b6efd7f9bbc80a5b1dfd894a Author: lixiang <447399...@qq.com> AuthorDate: Wed Jul 5 19:47:38 2023 +0800 KYLIN-5763 Fix query history model filter --- .../metadata/query/JdbcQueryHistoryStore.java | 13 +----- .../kylin/metadata/query/QueryHistoryDAO.java | 2 +- .../kylin/metadata/query/RDBMSQueryHistoryDAO.java | 4 +- .../metadata/query/RDBMSQueryHistoryDaoTest.java | 5 +-- .../kylin/rest/controller/NQueryController.java | 37 +++++++-------- .../rest/controller/NQueryControllerTest.java | 20 ++++++--- .../rest/response/QueryHistoryFiltersResponse.java | 49 ++++++++++++++++++++ .../kylin/rest/service/QueryHistoryService.java | 52 +++++++++++----------- .../rest/service/QueryHistoryServiceTest.java | 26 +++++++---- 9 files changed, 131 insertions(+), 77 deletions(-) diff --git a/src/core-metadata/src/main/java/org/apache/kylin/metadata/query/JdbcQueryHistoryStore.java b/src/core-metadata/src/main/java/org/apache/kylin/metadata/query/JdbcQueryHistoryStore.java index da5b152073..6ffbd9eac0 100644 --- a/src/core-metadata/src/main/java/org/apache/kylin/metadata/query/JdbcQueryHistoryStore.java +++ b/src/core-metadata/src/main/java/org/apache/kylin/metadata/query/JdbcQueryHistoryStore.java @@ -214,7 +214,7 @@ public class JdbcQueryHistoryStore { } } - public List<QueryStatistics> queryQueryHistoriesModelIds(QueryHistoryRequest request, int size) { + public List<QueryStatistics> queryQueryHistoriesModelIds(QueryHistoryRequest request) { try (SqlSession session = sqlSessionFactory.openSession()) { QueryStatisticsMapper mapper = session.getMapper(QueryStatisticsMapper.class); SelectStatementProvider statementProvider1 = selectDistinct(queryHistoryTable.engineType) @@ -222,16 +222,7 @@ public class JdbcQueryHistoryStore { .where(queryHistoryTable.engineType, isNotEqualTo("NATIVE")) // .and(queryHistoryTable.projectName, isEqualTo(request.getProject())) // .build().render(RenderingStrategies.MYBATIS3); - List<QueryStatistics> engineTypes = mapper.selectMany(statementProvider1); - - SelectStatementProvider statementProvider2 = selectDistinct(queryHistoryRealizationTable.model) - .from(queryHistoryRealizationTable) // - .where(queryHistoryRealizationTable.projectName, isEqualTo(request.getProject())) // - .limit(size) // - .build().render(RenderingStrategies.MYBATIS3); - List<QueryStatistics> modelIds = mapper.selectMany(statementProvider2); - engineTypes.addAll(modelIds); - return engineTypes; + return mapper.selectMany(statementProvider1); } } diff --git a/src/core-metadata/src/main/java/org/apache/kylin/metadata/query/QueryHistoryDAO.java b/src/core-metadata/src/main/java/org/apache/kylin/metadata/query/QueryHistoryDAO.java index 882dc78477..66f1d4aa22 100644 --- a/src/core-metadata/src/main/java/org/apache/kylin/metadata/query/QueryHistoryDAO.java +++ b/src/core-metadata/src/main/java/org/apache/kylin/metadata/query/QueryHistoryDAO.java @@ -63,7 +63,7 @@ public interface QueryHistoryDAO { List<QueryHistory> getQueryHistoriesSubmitters(QueryHistoryRequest request, int size); - List<QueryStatistics> getQueryHistoriesModelIds(QueryHistoryRequest request, int size); + List<QueryStatistics> getQueryHistoriesModelIds(QueryHistoryRequest request); String getRealizationMetricMeasurement(); diff --git a/src/core-metadata/src/main/java/org/apache/kylin/metadata/query/RDBMSQueryHistoryDAO.java b/src/core-metadata/src/main/java/org/apache/kylin/metadata/query/RDBMSQueryHistoryDAO.java index 64d874d1e6..3592dbec22 100644 --- a/src/core-metadata/src/main/java/org/apache/kylin/metadata/query/RDBMSQueryHistoryDAO.java +++ b/src/core-metadata/src/main/java/org/apache/kylin/metadata/query/RDBMSQueryHistoryDAO.java @@ -184,8 +184,8 @@ public class RDBMSQueryHistoryDAO implements QueryHistoryDAO { return jdbcQueryHisStore.queryQueryHistoriesSubmitters(request, size); } - public List<QueryStatistics> getQueryHistoriesModelIds(QueryHistoryRequest request, int size) { - return jdbcQueryHisStore.queryQueryHistoriesModelIds(request, size); + public List<QueryStatistics> getQueryHistoriesModelIds(QueryHistoryRequest request) { + return jdbcQueryHisStore.queryQueryHistoriesModelIds(request); } public QueryStatistics getQueryCountAndAvgDuration(long startTime, long endTime, String project) { diff --git a/src/core-metadata/src/test/java/org/apache/kylin/metadata/query/RDBMSQueryHistoryDaoTest.java b/src/core-metadata/src/test/java/org/apache/kylin/metadata/query/RDBMSQueryHistoryDaoTest.java index 2651f64b81..30cd2d37d0 100644 --- a/src/core-metadata/src/test/java/org/apache/kylin/metadata/query/RDBMSQueryHistoryDaoTest.java +++ b/src/core-metadata/src/test/java/org/apache/kylin/metadata/query/RDBMSQueryHistoryDaoTest.java @@ -722,11 +722,10 @@ public class RDBMSQueryHistoryDaoTest extends NLocalFileMetadataTestCase { queryHistoryRequest.setAdmin(true); queryHistoryRequest.setUsername(ADMIN); queryHistoryRequest.setProject(PROJECT); - List<QueryStatistics> modelList = queryHistoryDAO.getQueryHistoriesModelIds(queryHistoryRequest, 5); - Assert.assertEquals(3, modelList.size()); + List<QueryStatistics> modelList = queryHistoryDAO.getQueryHistoriesModelIds(queryHistoryRequest); + Assert.assertEquals(2, modelList.size()); Assert.assertEquals("RDBMS", modelList.get(0).getEngineType()); Assert.assertEquals("HIVE", modelList.get(1).getEngineType()); - Assert.assertEquals("82fa7671-a935-45f5-8779-85703601f49a.json", modelList.get(2).getModel()); } @Test diff --git a/src/query-server/src/main/java/org/apache/kylin/rest/controller/NQueryController.java b/src/query-server/src/main/java/org/apache/kylin/rest/controller/NQueryController.java index d6ca97cecc..9f16d94e68 100644 --- a/src/query-server/src/main/java/org/apache/kylin/rest/controller/NQueryController.java +++ b/src/query-server/src/main/java/org/apache/kylin/rest/controller/NQueryController.java @@ -18,12 +18,12 @@ package org.apache.kylin.rest.controller; +import static org.apache.kylin.common.constant.HttpConstant.HTTP_VND_APACHE_KYLIN_JSON; +import static org.apache.kylin.common.constant.HttpConstant.HTTP_VND_APACHE_KYLIN_V4_PUBLIC_JSON; import static org.apache.kylin.common.exception.ServerErrorCode.FAILED_DOWNLOAD_FILE; import static org.apache.kylin.common.exception.ServerErrorCode.INVALID_NAME; import static org.apache.kylin.common.exception.ServerErrorCode.PERMISSION_DENIED; import static org.apache.kylin.common.exception.ServerErrorCode.REDIS_CLEAR_ERROR; -import static org.apache.kylin.common.constant.HttpConstant.HTTP_VND_APACHE_KYLIN_JSON; -import static org.apache.kylin.common.constant.HttpConstant.HTTP_VND_APACHE_KYLIN_V4_PUBLIC_JSON; import java.io.IOException; import java.io.OutputStreamWriter; @@ -53,31 +53,34 @@ import org.apache.kylin.common.exception.KylinException; import org.apache.kylin.common.exception.KylinTimeoutException; import org.apache.kylin.common.exception.QueryErrorCode; import org.apache.kylin.common.msg.MsgPicker; +import org.apache.kylin.common.persistence.transaction.StopQueryBroadcastEventNotifier; +import org.apache.kylin.common.scheduler.EventBusFactory; +import org.apache.kylin.guava30.shaded.common.base.Preconditions; +import org.apache.kylin.guava30.shaded.common.collect.Maps; +import org.apache.kylin.metadata.query.QueryHistoryRequest; +import org.apache.kylin.metadata.query.util.QueryHisTransformStandardUtil; import org.apache.kylin.metadata.querymeta.SelectedColumnMeta; import org.apache.kylin.metadata.querymeta.TableMetaWithType; +import org.apache.kylin.query.plugin.asyncprofiler.AsyncProfiling; +import org.apache.kylin.rest.cluster.ClusterManager; import org.apache.kylin.rest.exception.ForbiddenException; import org.apache.kylin.rest.exception.InternalErrorException; import org.apache.kylin.rest.model.Query; import org.apache.kylin.rest.request.PrepareSqlRequest; +import org.apache.kylin.rest.request.SQLFormatRequest; import org.apache.kylin.rest.request.SQLRequest; import org.apache.kylin.rest.request.SaveSqlRequest; import org.apache.kylin.rest.response.DataResult; import org.apache.kylin.rest.response.EnvelopeResponse; +import org.apache.kylin.rest.response.QueryHistoryFiltersResponse; +import org.apache.kylin.rest.response.QueryStatisticsResponse; import org.apache.kylin.rest.response.SQLResponse; import org.apache.kylin.rest.response.ServerExtInfoResponse; -import org.apache.kylin.rest.service.QueryService; -import org.apache.kylin.rest.util.AclEvaluate; -import org.apache.kylin.common.persistence.transaction.StopQueryBroadcastEventNotifier; -import org.apache.kylin.common.scheduler.EventBusFactory; -import org.apache.kylin.metadata.query.QueryHistoryRequest; -import org.apache.kylin.metadata.query.util.QueryHisTransformStandardUtil; -import org.apache.kylin.query.plugin.asyncprofiler.AsyncProfiling; -import org.apache.kylin.rest.cluster.ClusterManager; -import org.apache.kylin.rest.request.SQLFormatRequest; -import org.apache.kylin.rest.response.QueryStatisticsResponse; import org.apache.kylin.rest.response.ServerInfoResponse; import org.apache.kylin.rest.service.QueryCacheManager; import org.apache.kylin.rest.service.QueryHistoryService; +import org.apache.kylin.rest.service.QueryService; +import org.apache.kylin.rest.util.AclEvaluate; import org.apache.kylin.util.DataRangeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -100,9 +103,6 @@ import org.supercsv.io.CsvListWriter; import org.supercsv.io.ICsvListWriter; import org.supercsv.prefs.CsvPreference; -import org.apache.kylin.guava30.shaded.common.base.Preconditions; -import org.apache.kylin.guava30.shaded.common.collect.Maps; - import io.swagger.annotations.ApiOperation; import lombok.val; import redis.clients.jedis.exceptions.JedisException; @@ -414,15 +414,16 @@ public class NQueryController extends NBasicController { @ApiOperation(value = "getQueryHistoryModels", tags = { "QE" }, notes = "Update Param: project, model_name") @GetMapping(value = "/query_history_models") @ResponseBody - public EnvelopeResponse<List<String>> getQueryHistoryModels(@RequestParam(value = "project") String project, + public EnvelopeResponse<QueryHistoryFiltersResponse> getQueryHistoryModels( + @RequestParam(value = "project") String project, @RequestParam(value = "model_name", required = false) String modelAlias, @RequestParam(value = "page_size", required = false, defaultValue = "100") Integer size) { checkProjectName(project); QueryHistoryRequest request = new QueryHistoryRequest(); request.setProject(project); request.setFilterModelName(modelAlias); - List<String> modelNames = queryHistoryService.getQueryHistoryModels(request, size); - return new EnvelopeResponse<>(KylinException.CODE_SUCCESS, modelNames, ""); + return new EnvelopeResponse<>(KylinException.CODE_SUCCESS, + queryHistoryService.getQueryHistoryModels(request, size), ""); } @ApiOperation(value = "queryHistoryTiredStorageMetrics", tags = {"QE"}, notes = "Update Param: project, query_id") diff --git a/src/query-server/src/test/java/org/apache/kylin/rest/controller/NQueryControllerTest.java b/src/query-server/src/test/java/org/apache/kylin/rest/controller/NQueryControllerTest.java index 51cef2da6f..d6e96b7baf 100644 --- a/src/query-server/src/test/java/org/apache/kylin/rest/controller/NQueryControllerTest.java +++ b/src/query-server/src/test/java/org/apache/kylin/rest/controller/NQueryControllerTest.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletResponse; @@ -36,6 +37,8 @@ import org.apache.kylin.common.exception.QueryErrorCode; import org.apache.kylin.common.msg.MsgPicker; import org.apache.kylin.common.util.JsonUtil; import org.apache.kylin.common.util.NLocalFileMetadataTestCase; +import org.apache.kylin.guava30.shaded.common.collect.Lists; +import org.apache.kylin.guava30.shaded.common.collect.Maps; import org.apache.kylin.metadata.query.NativeQueryRealization; import org.apache.kylin.metadata.query.QueryHistory; import org.apache.kylin.metadata.query.QueryHistoryInfo; @@ -46,6 +49,7 @@ import org.apache.kylin.rest.model.Query; import org.apache.kylin.rest.request.PrepareSqlRequest; import org.apache.kylin.rest.request.SQLRequest; import org.apache.kylin.rest.request.SaveSqlRequest; +import org.apache.kylin.rest.response.QueryHistoryFiltersResponse; import org.apache.kylin.rest.response.ServerInfoResponse; import org.apache.kylin.rest.service.QueryCacheManager; import org.apache.kylin.rest.service.QueryHistoryService; @@ -67,9 +71,6 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.apache.kylin.guava30.shaded.common.collect.Lists; -import org.apache.kylin.guava30.shaded.common.collect.Maps; - import redis.clients.jedis.exceptions.JedisException; /** @@ -581,15 +582,20 @@ public class NQueryControllerTest extends NLocalFileMetadataTestCase { final List<String> models = Lists.newArrayList(); models.add("MODEL1"); models.add("MODEL2"); + Map<String, List<String>> result = Maps.newHashMap(); + result.put("MODEL", models); - Mockito.when(queryHistoryService.getQueryHistoryModels(request, 3)).thenReturn(models); + Mockito.when(queryHistoryService.getQueryHistoryModels(request, 3)) + .thenReturn(new QueryHistoryFiltersResponse(10, 15, Collections.EMPTY_LIST, models)); mockMvc.perform(MockMvcRequestBuilders.get("/api/query/query_history_models") .contentType(MediaType.APPLICATION_JSON).param("project", PROJECT).param("model_name", "MODEL") .param("page_size", "3").accept(MediaType.parseMediaType(HTTP_VND_APACHE_KYLIN_JSON))) .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.jsonPath("$.data.length()").value(2)) - .andExpect(MockMvcResultMatchers.jsonPath("$.data[0]").value("MODEL1")) - .andExpect(MockMvcResultMatchers.jsonPath("$.data[1]").value("MODEL2")); + .andExpect(MockMvcResultMatchers.jsonPath("$.data.total_model_count").value(15)) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.search_count").value(10)) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.engines.length()").value(0)) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.models[0]").value("MODEL1")) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.models[1]").value("MODEL2")); Mockito.verify(nQueryController).getQueryHistoryModels(PROJECT, request.getFilterModelName(), 3); } diff --git a/src/query-service/src/main/java/org/apache/kylin/rest/response/QueryHistoryFiltersResponse.java b/src/query-service/src/main/java/org/apache/kylin/rest/response/QueryHistoryFiltersResponse.java new file mode 100644 index 0000000000..f907d00220 --- /dev/null +++ b/src/query-service/src/main/java/org/apache/kylin/rest/response/QueryHistoryFiltersResponse.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.kylin.rest.response; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Setter +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class QueryHistoryFiltersResponse { + + //for frontend display + @JsonProperty("search_count") + private Integer searchCount; + + //for frontend display + @JsonProperty("total_model_count") + private Integer totalModelCount; + + @JsonProperty("engines") + private List<String> engines; + + @JsonProperty("models") + private List<String> models; +} diff --git a/src/query-service/src/main/java/org/apache/kylin/rest/service/QueryHistoryService.java b/src/query-service/src/main/java/org/apache/kylin/rest/service/QueryHistoryService.java index 929bc5228d..0200c2f080 100644 --- a/src/query-service/src/main/java/org/apache/kylin/rest/service/QueryHistoryService.java +++ b/src/query-service/src/main/java/org/apache/kylin/rest/service/QueryHistoryService.java @@ -26,6 +26,7 @@ import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -37,6 +38,7 @@ import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.servlet.http.HttpServletResponse; @@ -53,6 +55,7 @@ import org.apache.kylin.guava30.shaded.common.base.Preconditions; import org.apache.kylin.guava30.shaded.common.collect.ImmutableMap; import org.apache.kylin.guava30.shaded.common.collect.Lists; import org.apache.kylin.guava30.shaded.common.collect.Maps; +import org.apache.kylin.metadata.cube.model.NDataflow; import org.apache.kylin.metadata.cube.model.NDataflowManager; import org.apache.kylin.metadata.cube.model.NIndexPlanManager; import org.apache.kylin.metadata.favorite.QueryHistoryIdOffset; @@ -70,6 +73,7 @@ import org.apache.kylin.metadata.query.QueryStatistics; import org.apache.kylin.metadata.query.RDBMSQueryHistoryDAO; import org.apache.kylin.rest.exception.ForbiddenException; import org.apache.kylin.rest.response.NDataModelResponse; +import org.apache.kylin.rest.response.QueryHistoryFiltersResponse; import org.apache.kylin.rest.response.QueryStatisticsResponse; import org.apache.kylin.rest.util.AclEvaluate; import org.slf4j.Logger; @@ -165,9 +169,9 @@ public class QueryHistoryService extends BasicService implements AsyncTaskQueryH return ImmutableMap.of("total_scan_count", 0L, "source_result_count", 0L, "total_scan_bytes", 0L); } - return ImmutableMap.of("total_scan_count", queryHistories.get(0).getTotalScanCount(), - "source_result_count", queryHistories.get(0).getQueryHistoryInfo().getSourceResultCount(), - "total_scan_bytes", queryHistories.get(0).getTotalScanBytes()); + return ImmutableMap.of("total_scan_count", queryHistories.get(0).getTotalScanCount(), "source_result_count", + queryHistories.get(0).getQueryHistoryInfo().getSourceResultCount(), "total_scan_bytes", + queryHistories.get(0).getTotalScanBytes()); } private void processRequestParams(QueryHistoryRequest request) { @@ -264,31 +268,27 @@ public class QueryHistoryService extends BasicService implements AsyncTaskQueryH return queryHistories.stream().map(QueryHistory::getQuerySubmitter).collect(Collectors.toList()); } - public List<String> getQueryHistoryModels(QueryHistoryRequest request, int size) { + public QueryHistoryFiltersResponse getQueryHistoryModels(QueryHistoryRequest request, int size) { QueryHistoryDAO queryHistoryDAO = getQueryHistoryDao(); - request.setUsername(SecurityContextHolder.getContext().getAuthentication().getName()); - if (aclEvaluate.hasProjectAdminPermission( - NProjectManager.getInstance(KylinConfig.getInstanceFromEnv()).getProject(request.getProject()))) { - request.setAdmin(true); - } - List<QueryStatistics> queryStatistics = queryHistoryDAO.getQueryHistoriesModelIds(request, size); + List<QueryStatistics> queryStatistics = queryHistoryDAO.getQueryHistoriesModelIds(request); + val dataFlowManager = NDataflowManager.getInstance(KylinConfig.getInstanceFromEnv(), request.getProject()); + Stream<String> engineStream = queryStatistics.stream().map(QueryStatistics::getEngineType); + List<NDataflow> models = dataFlowManager.listAllDataflows(); + Stream<String> modelStream = models.stream() + .sorted(Comparator.comparing(NDataflow::getQueryHitCount, Comparator.reverseOrder())) + .map(NDataflow::getModel).map(NDataModel::getAlias); + List<String> engineList = filterByName(engineStream, request.getFilterModelName()); + List<String> modelList = filterByName(modelStream, request.getFilterModelName()); + Integer count = engineList.size() + modelList.size(); + return new QueryHistoryFiltersResponse(count, models.size(), engineList, + modelList.stream().limit(size).collect(Collectors.toList())); + } - val dataflowManager = NDataflowManager.getInstance(KylinConfig.getInstanceFromEnv(), request.getProject()); - val modelAliasMap = dataflowManager.listUnderliningDataModels().stream() - .collect(Collectors.toMap(RootPersistentEntity::getUuid, NDataModel::getAlias)); - - return queryStatistics.stream().map(query -> { - // engineType && modelId are both saved into queryStatistics - if (!StringUtils.isEmpty(query.getEngineType())) { - return query.getEngineType(); - } else if (!StringUtils.isEmpty(query.getModel()) && modelAliasMap.containsKey(query.getModel())) { - return modelAliasMap.get(query.getModel()); - } else { - return null; - } - }).filter(alias -> !StringUtils.isEmpty(alias) && (StringUtils.isEmpty(request.getFilterModelName()) - || alias.toLowerCase(Locale.ROOT).contains(request.getFilterModelName().toLowerCase(Locale.ROOT)))) - .limit(size).collect(Collectors.toList()); + private List<String> filterByName(Stream<String> stream, String name) { + return stream + .filter(alias -> !StringUtils.isEmpty(alias) && (StringUtils.isEmpty(name) + || alias.toLowerCase(Locale.ROOT).contains(name.toLowerCase(Locale.ROOT)))) + .collect(Collectors.toList()); } private boolean haveSpaces(String text) { diff --git a/src/query-service/src/test/java/org/apache/kylin/rest/service/QueryHistoryServiceTest.java b/src/query-service/src/test/java/org/apache/kylin/rest/service/QueryHistoryServiceTest.java index 5cd5ff6655..e93b35dcce 100644 --- a/src/query-service/src/test/java/org/apache/kylin/rest/service/QueryHistoryServiceTest.java +++ b/src/query-service/src/test/java/org/apache/kylin/rest/service/QueryHistoryServiceTest.java @@ -43,6 +43,7 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.kylin.common.KylinConfig; import org.apache.kylin.common.util.NLocalFileMetadataTestCase; import org.apache.kylin.common.util.ProcessUtils; +import org.apache.kylin.guava30.shaded.common.collect.Lists; import org.apache.kylin.metadata.cube.model.NDataflowManager; import org.apache.kylin.metadata.cube.model.NIndexPlanManager; import org.apache.kylin.metadata.model.NDataModelManager; @@ -56,6 +57,7 @@ import org.apache.kylin.metadata.query.QueryStatistics; import org.apache.kylin.metadata.query.RDBMSQueryHistoryDAO; import org.apache.kylin.metadata.query.RDBMSQueryHistoryDaoTest; import org.apache.kylin.rest.constant.Constant; +import org.apache.kylin.rest.response.QueryHistoryFiltersResponse; import org.apache.kylin.rest.response.QueryStatisticsResponse; import org.apache.kylin.rest.util.AclEvaluate; import org.apache.kylin.rest.util.AclUtil; @@ -72,8 +74,6 @@ import org.springframework.security.authentication.TestingAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.util.ReflectionTestUtils; -import org.apache.kylin.guava30.shaded.common.collect.Lists; - import lombok.val; import lombok.var; @@ -717,15 +717,23 @@ public class QueryHistoryServiceTest extends NLocalFileMetadataTestCase { RDBMSQueryHistoryDAO queryHistoryDAO = Mockito.mock(RDBMSQueryHistoryDAO.class); Mockito.doReturn(Lists.newArrayList(queryStatistics, queryStatistics1, queryStatistics2, queryStatistics3)) - .when(queryHistoryDAO).getQueryHistoriesModelIds(Mockito.any(), Mockito.anyInt()); + .when(queryHistoryDAO).getQueryHistoriesModelIds(Mockito.any()); Mockito.doReturn(queryHistoryDAO).when(queryHistoryService).getQueryHistoryDao(); - List<String> models = queryHistoryService.getQueryHistoryModels(request, 10); - Assert.assertEquals(3, models.size()); - Assert.assertEquals("HIVE", models.get(0)); - Assert.assertEquals("CONSTANTS", models.get(1)); - Assert.assertEquals("ut_inner_join_cube_partial", models.get(2)); - + QueryHistoryFiltersResponse response = queryHistoryService.getQueryHistoryModels(request, 10); + assertEquals(10, (int) response.getSearchCount()); + Assert.assertEquals(8, (int) response.getTotalModelCount()); + Assert.assertEquals(10, response.getEngines().size() + response.getModels().size()); + Assert.assertEquals("HIVE", response.getEngines().get(0)); + Assert.assertEquals("CONSTANTS", response.getEngines().get(1)); + Assert.assertEquals("nmodel_basic", response.getModels().get(2)); + + request.setFilterModelName("nmodel"); + QueryHistoryFiltersResponse response1 = queryHistoryService.getQueryHistoryModels(request, 2); + Assert.assertEquals(8, (int) response.getTotalModelCount()); + assertEquals(3, (int) response1.getSearchCount()); + Assert.assertEquals(2, response1.getEngines().size() + response1.getModels().size()); + Assert.assertEquals("nmodel_basic", response1.getModels().get(1)); } @Test