From ab63f72d935c2b5e78c183e3e58972005b9154ba Mon Sep 17 00:00:00 2001 From: zhaowei Date: Mon, 21 Sep 2026 10:21:35 +0800 Subject: [PATCH 1/3] [Improvement-18666] Support field sorting on workflow definition list --- .../WorkflowDefinitionController.java | 10 ++- .../service/WorkflowDefinitionService.java | 4 +- .../impl/WorkflowDefinitionServiceImpl.java | 6 +- .../WorkflowDefinitionControllerTest.java | 5 +- .../WorkflowDefinitionServiceTest.java | 11 ++- .../dao/mapper/WorkflowDefinitionMapper.java | 4 +- .../dao/repository/WorkflowDefinitionDao.java | 4 +- .../impl/WorkflowDefinitionDaoImpl.java | 5 +- .../dao/mapper/WorkflowDefinitionMapper.xml | 14 +++- .../mapper/WorkflowDefinitionMapperTest.java | 67 +++++++++++++++++-- .../modules/workflow-definition/types.ts | 2 + .../projects/workflow/definition/index.tsx | 9 +++ .../projects/workflow/definition/use-table.ts | 21 +++++- 13 files changed, 138 insertions(+), 24 deletions(-) diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowDefinitionController.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowDefinitionController.java index 38685d6bbde9..a6d880b39238 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowDefinitionController.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowDefinitionController.java @@ -479,7 +479,9 @@ public Result queryWorkflowDefinitionSimpleList(@Parameter(hidden = t @Parameter(name = "userId", description = "USER_ID", required = false, schema = @Schema(implementation = int.class, example = "100")), @Parameter(name = "pageNo", description = "PAGE_NO", required = true, schema = @Schema(implementation = int.class, example = "1")), @Parameter(name = "pageSize", description = "PAGE_SIZE", required = true, schema = @Schema(implementation = int.class, example = "10")), - @Parameter(name = "otherParamsJson", description = "OTHER_PARAMS_JSON", required = false, schema = @Schema(implementation = String.class)) + @Parameter(name = "otherParamsJson", description = "OTHER_PARAMS_JSON", required = false, schema = @Schema(implementation = String.class)), + @Parameter(name = "sortField", description = "SORT_FIELD", required = false, schema = @Schema(implementation = String.class, example = "updateTime")), + @Parameter(name = "sortOrder", description = "SORT_ORDER", required = false, schema = @Schema(implementation = String.class, example = "desc")) }) @GetMapping() @ResponseStatus(HttpStatus.OK) @@ -491,13 +493,15 @@ public Result> queryWorkflowDefinitionListPaging( @RequestParam(value = "otherParamsJson", required = false) String otherParamsJson, @RequestParam(value = "userId", required = false, defaultValue = "0") Integer userId, @RequestParam("pageNo") Integer pageNo, - @RequestParam("pageSize") Integer pageSize) { + @RequestParam("pageSize") Integer pageSize, + @RequestParam(value = "sortField", required = false) String sortField, + @RequestParam(value = "sortOrder", required = false) String sortOrder) { checkPageParams(pageNo, pageSize); searchVal = ParameterUtils.handleEscapes(searchVal); PageInfo pageInfo = workflowDefinitionService.queryWorkflowDefinitionListPaging( - loginUser, projectCode, searchVal, otherParamsJson, userId, pageNo, pageSize); + loginUser, projectCode, searchVal, otherParamsJson, userId, pageNo, pageSize, sortField, sortOrder); if (pageInfo != null && pageInfo.getTotalList() != null) { pageInfo.setTotalList(pageInfo.getTotalList().stream() .map(SensitivePropertyUtils::mask) diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionService.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionService.java index b71075ec411d..c44bd69b842e 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionService.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionService.java @@ -74,7 +74,9 @@ PageInfo queryWorkflowDefinitionListPaging(User loginUser, String otherParamsJson, Integer userId, Integer pageNo, - Integer pageSize); + Integer pageSize, + String sortField, + String sortOrder); /** * query detail of workflow definition diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowDefinitionServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowDefinitionServiceImpl.java index 730152ff1340..771e47ccdbb2 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowDefinitionServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowDefinitionServiceImpl.java @@ -506,14 +506,16 @@ public PageInfo queryWorkflowDefinitionListPaging(@NonNull U String otherParamsJson, Integer userId, Integer pageNo, - Integer pageSize) { + Integer pageSize, + String sortField, + String sortOrder) { // check user access for project projectService.checkProjectAndAuthThrowException(loginUser, projectCode, WORKFLOW_DEFINITION); PageListingResult workflowDefinitionPageListingResult = workflowDefinitionDao.listingWorkflowDefinition( - pageNo, pageSize, searchVal, userId, projectCode); + pageNo, pageSize, searchVal, userId, projectCode, sortField, sortOrder); List workflowDefinitions = workflowDefinitionPageListingResult.getRecords(); List workflowDefinitionCodes = diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkflowDefinitionControllerTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkflowDefinitionControllerTest.java index 470d1cf571a4..c8db31efa1a9 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkflowDefinitionControllerTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkflowDefinitionControllerTest.java @@ -310,10 +310,11 @@ public void testQueryWorkflowDefinitionListPaging() { Mockito.when( processDefinitionService.queryWorkflowDefinitionListPaging(user, projectCode, searchVal, "", userId, - pageNo, pageSize)) + pageNo, pageSize, null, null)) .thenReturn(pageInfo); Result> response = workflowDefinitionController - .queryWorkflowDefinitionListPaging(user, projectCode, searchVal, "", userId, pageNo, pageSize); + .queryWorkflowDefinitionListPaging(user, projectCode, searchVal, "", userId, pageNo, pageSize, + null, null); Assertions.assertTrue(response != null && response.isSuccess()); assertMaskedAndOriginalUnchanged(workflowDefinition.getGlobalParams(), diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionServiceTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionServiceTest.java index c5af336eff84..0dcc07f31590 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionServiceTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionServiceTest.java @@ -336,7 +336,8 @@ public void testQueryWorkflowDefinitionListPaging() { try { doThrow(new ServiceException(Status.PROJECT_NOT_EXIST)).when(projectService) .checkProjectAndAuthThrowException(user, projectCode, WORKFLOW_DEFINITION); - workflowDefinitionService.queryWorkflowDefinitionListPaging(user, projectCode, "", "", 1, 5, 0); + workflowDefinitionService.queryWorkflowDefinitionListPaging(user, projectCode, "", "", 1, 5, 0, null, + null); } catch (ServiceException serviceException) { Assertions.assertEquals(Status.PROJECT_NOT_EXIST.getCode(), serviceException.getCode()); } @@ -363,7 +364,9 @@ public void testQueryWorkflowDefinitionListPaging() { eq(10), eq(""), eq(1), - eq(projectCode))).thenReturn(pageListingResult); + eq(projectCode), + any(), + any())).thenReturn(pageListingResult); String user1 = "user1"; String user2 = "user2"; when(userDao.queryUserWithWorkflowDefinitionCode(processDefinitionCodes)) @@ -391,7 +394,9 @@ public void testQueryWorkflowDefinitionListPaging() { "", 1, 0, - 10); + 10, + null, + null); Assertions.assertNotNull(pageInfo); WorkflowDefinition pd1 = pageInfo.getTotalList().stream() .filter(pd -> pd.getCode() == processDefinitionCode1).findFirst().orElse(null); diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkflowDefinitionMapper.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkflowDefinitionMapper.java index 6fa7e6e50fb5..0eda15ff18d0 100644 --- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkflowDefinitionMapper.java +++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkflowDefinitionMapper.java @@ -101,7 +101,9 @@ WorkflowDefinition queryByDefineName(@Param("projectCode") long projectCode, IPage queryDefineListPaging(IPage page, @Param("searchVal") String searchVal, @Param("userId") int userId, - @Param("projectCode") long projectCode); + @Param("projectCode") long projectCode, + @Param("sortField") String sortField, + @Param("sortOrder") String sortOrder); /** * Filter workflow definitions diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/WorkflowDefinitionDao.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/WorkflowDefinitionDao.java index d202471a24da..eacac975ac3b 100644 --- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/WorkflowDefinitionDao.java +++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/WorkflowDefinitionDao.java @@ -42,7 +42,9 @@ PageListingResult listingWorkflowDefinition( int pageSize, @Nullable String searchVal, int userId, - long projectCode); + long projectCode, + @Nullable String sortField, + @Nullable String sortOrder); Optional queryByCode(long code); diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/impl/WorkflowDefinitionDaoImpl.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/impl/WorkflowDefinitionDaoImpl.java index b21a49ed59e2..558351da3a12 100644 --- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/impl/WorkflowDefinitionDaoImpl.java +++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/impl/WorkflowDefinitionDaoImpl.java @@ -52,10 +52,11 @@ public WorkflowDefinitionDaoImpl(@NonNull WorkflowDefinitionMapper workflowDefin @Override public PageListingResult listingWorkflowDefinition(int pageNumber, int pageSize, String searchVal, - int userId, long projectCode) { + int userId, long projectCode, + String sortField, String sortOrder) { Page page = new Page<>(pageNumber, pageSize); IPage processDefinitions = - mybatisMapper.queryDefineListPaging(page, searchVal, userId, projectCode); + mybatisMapper.queryDefineListPaging(page, searchVal, userId, projectCode, sortField, sortOrder); return PageListingResult.builder() .totalCount(processDefinitions.getTotal()) diff --git a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkflowDefinitionMapper.xml b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkflowDefinitionMapper.xml index ceec6371e68d..a24f2c69bb30 100644 --- a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkflowDefinitionMapper.xml +++ b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkflowDefinitionMapper.xml @@ -79,7 +79,19 @@ name like concat('%', #{searchVal}, '%') OR description like concat('%', #{searchVal}, '%') ) - order by update_time desc, id asc + order by + + name + create_time + update_time + update_time + + + asc + desc + desc + + , id asc diff --git a/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/WorkflowDefinitionMapperTest.java b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/WorkflowDefinitionMapperTest.java index 93e661ac3251..8ad4cd1d0cee 100644 --- a/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/WorkflowDefinitionMapperTest.java +++ b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/WorkflowDefinitionMapperTest.java @@ -276,6 +276,10 @@ public void testQueryDefineListPaging() { // invalid sortField/sortOrder -> fallback to default (update_time desc, id asc) Assertions.assertEquals(List.of("wf-gamma", "wf-beta", "wf-alpha"), definitionNames(queryPaging("foo", "bar"))); + // invalid sortField with a valid sortOrder=asc must still yield the + // complete default (update_time desc, id asc), not update_time asc + Assertions.assertEquals(List.of("wf-gamma", "wf-beta", "wf-alpha"), + definitionNames(queryPaging("foo", "asc"))); // sortField without sortOrder -> default direction desc Assertions.assertEquals(List.of("wf-gamma", "wf-beta", "wf-alpha"), definitionNames(queryPaging("name", null))); From 0a8b5073279d2bd029c23ee5e17cee828ab9cd13 Mon Sep 17 00:00:00 2001 From: zhaowei Date: Sat, 3 Oct 2026 11:05:41 +0800 Subject: [PATCH 3/3] [Improvement-18666] Support field sorting on workflow definition list --- .../mapper/WorkflowDefinitionMapperTest.java | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/WorkflowDefinitionMapperTest.java b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/WorkflowDefinitionMapperTest.java index 8ad4cd1d0cee..0f6c13c378e0 100644 --- a/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/WorkflowDefinitionMapperTest.java +++ b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/WorkflowDefinitionMapperTest.java @@ -26,9 +26,11 @@ import org.apache.dolphinscheduler.dao.entity.WorkflowDefinition; import org.apache.dolphinscheduler.dao.model.WorkflowDefinitionCountDto; +import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.concurrent.atomic.AtomicLong; +import java.util.stream.Collectors; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -256,32 +258,32 @@ public void testQueryDefineListPaging() { insertWithTimes("wf-beta", base + 120_000L, base + 120_000L); // default (no sort) -> update_time desc, id asc - Assertions.assertEquals(List.of("wf-gamma", "wf-beta", "wf-alpha"), + Assertions.assertEquals(Arrays.asList("wf-gamma", "wf-beta", "wf-alpha"), definitionNames(queryPaging(null, null))); // name asc / desc - Assertions.assertEquals(List.of("wf-alpha", "wf-beta", "wf-gamma"), + Assertions.assertEquals(Arrays.asList("wf-alpha", "wf-beta", "wf-gamma"), definitionNames(queryPaging("name", "asc"))); - Assertions.assertEquals(List.of("wf-gamma", "wf-beta", "wf-alpha"), + Assertions.assertEquals(Arrays.asList("wf-gamma", "wf-beta", "wf-alpha"), definitionNames(queryPaging("name", "desc"))); // createTime asc / desc - Assertions.assertEquals(List.of("wf-gamma", "wf-alpha", "wf-beta"), + Assertions.assertEquals(Arrays.asList("wf-gamma", "wf-alpha", "wf-beta"), definitionNames(queryPaging("createTime", "asc"))); - Assertions.assertEquals(List.of("wf-beta", "wf-alpha", "wf-gamma"), + Assertions.assertEquals(Arrays.asList("wf-beta", "wf-alpha", "wf-gamma"), definitionNames(queryPaging("createTime", "desc"))); // updateTime asc / desc - Assertions.assertEquals(List.of("wf-alpha", "wf-beta", "wf-gamma"), + Assertions.assertEquals(Arrays.asList("wf-alpha", "wf-beta", "wf-gamma"), definitionNames(queryPaging("updateTime", "asc"))); - Assertions.assertEquals(List.of("wf-gamma", "wf-beta", "wf-alpha"), + Assertions.assertEquals(Arrays.asList("wf-gamma", "wf-beta", "wf-alpha"), definitionNames(queryPaging("updateTime", "desc"))); // invalid sortField/sortOrder -> fallback to default (update_time desc, id asc) - Assertions.assertEquals(List.of("wf-gamma", "wf-beta", "wf-alpha"), + Assertions.assertEquals(Arrays.asList("wf-gamma", "wf-beta", "wf-alpha"), definitionNames(queryPaging("foo", "bar"))); // invalid sortField with a valid sortOrder=asc must still yield the // complete default (update_time desc, id asc), not update_time asc - Assertions.assertEquals(List.of("wf-gamma", "wf-beta", "wf-alpha"), + Assertions.assertEquals(Arrays.asList("wf-gamma", "wf-beta", "wf-alpha"), definitionNames(queryPaging("foo", "asc"))); // sortField without sortOrder -> default direction desc - Assertions.assertEquals(List.of("wf-gamma", "wf-beta", "wf-alpha"), + Assertions.assertEquals(Arrays.asList("wf-gamma", "wf-beta", "wf-alpha"), definitionNames(queryPaging("name", null))); } @@ -291,7 +293,7 @@ private IPage queryPaging(String sortField, String sortOrder } private List definitionNames(IPage page) { - return page.getRecords().stream().map(WorkflowDefinition::getName).toList(); + return page.getRecords().stream().map(WorkflowDefinition::getName).collect(Collectors.toList()); } private WorkflowDefinition insertWithTimes(String name, long createTimeMillis, long updateTimeMillis) {