This is an automated email from the ASF dual-hosted git repository.

lidongdai pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new 5d264c9  [Improvement][Api] Optimize query processInstanceList #5134 
(#5135)
5d264c9 is described below

commit 5d264c9f208a089bc1f23be5f3077d2dab2b0f40
Author: wenjun <[email protected]>
AuthorDate: Tue Mar 23 23:48:13 2021 +0800

    [Improvement][Api] Optimize query processInstanceList #5134 (#5135)
    
    * Batch query user rather than several query
---
 .../dolphinscheduler/api/service/UsersService.java |  8 +++++
 .../service/impl/ProcessInstanceServiceImpl.java   |  4 ++-
 .../api/service/impl/UsersServiceImpl.java         |  8 +++++
 .../api/service/UsersServiceTest.java              | 13 +++++++++
 .../common/utils/CollectionUtils.java              | 34 ++++++++++++++++++++++
 .../common/utils/CollectionUtilsTest.java          | 16 ++++++++++
 .../dolphinscheduler/dao/mapper/UserMapper.java    |  8 +++++
 .../dolphinscheduler/dao/mapper/UserMapper.xml     |  8 +++++
 .../dao/mapper/UserMapperTest.java                 | 11 +++++++
 9 files changed, 109 insertions(+), 1 deletion(-)

diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java
index ff73e52..b00f914 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java
@@ -71,6 +71,14 @@ public interface UsersService {
     User queryUser(int id);
 
     /**
+     * query user by ids
+     *
+     * @param ids id list
+     * @return user list
+     */
+    List<User> queryUser(List<Integer> ids);
+
+    /**
      * query user
      *
      * @param name name
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessInstanceServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessInstanceServiceImpl.java
index 4310652..f8a9250 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessInstanceServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessInstanceServiceImpl.java
@@ -252,10 +252,12 @@ public class ProcessInstanceServiceImpl extends 
BaseServiceImpl implements Proce
                         project.getId(), processDefineId, searchVal, 
executorId, statusArray, host, start, end);
 
         List<ProcessInstance> processInstances = 
processInstanceList.getRecords();
+        List<Integer> userIds = 
CollectionUtils.transformToList(processInstances, 
ProcessInstance::getExecutorId);
+        Map<Integer, User> idToUserMap = 
CollectionUtils.collectionToMap(usersService.queryUser(userIds), User::getId);
 
         for (ProcessInstance processInstance : processInstances) {
             
processInstance.setDuration(DateUtils.format2Duration(processInstance.getStartTime(),
 processInstance.getEndTime()));
-            User executor = 
usersService.queryUser(processInstance.getExecutorId());
+            User executor = idToUserMap.get(processInstance.getExecutorId());
             if (null != executor) {
                 processInstance.setExecutorName(executor.getUserName());
             }
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java
index 62561ae..bd329a4 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java
@@ -245,6 +245,14 @@ public class UsersServiceImpl extends BaseServiceImpl 
implements UsersService {
         return userMapper.selectById(id);
     }
 
+    @Override
+    public List<User> queryUser(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return new ArrayList<>();
+        }
+        return userMapper.selectByIds(ids);
+    }
+
     /**
      * query user
      *
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java
index e8707fc..d8bcdb8 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java
@@ -181,6 +181,19 @@ public class UsersServiceTest {
     }
 
     @Test
+    public void testSelectByIds() {
+        List<Integer> ids = new ArrayList<>();
+        List<User> users = usersService.queryUser(ids);
+        Assert.assertTrue(users.isEmpty());
+        ids.add(1);
+        List<User> userList = new ArrayList<>();
+        userList.add(new User());
+        when(userMapper.selectByIds(ids)).thenReturn(userList);
+        List<User> userList1 = usersService.queryUser(ids);
+        Assert.assertFalse(userList1.isEmpty());
+    }
+
+    @Test
     public void testGetUserIdByName() {
         User user = new User();
         user.setId(1);
diff --git 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/CollectionUtils.java
 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/CollectionUtils.java
index e90c606..64759c4 100644
--- 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/CollectionUtils.java
+++ 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/CollectionUtils.java
@@ -27,6 +27,8 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * Provides utility methods and decorators for {@link Collection} instances.
@@ -127,6 +129,38 @@ public class CollectionUtils {
     }
 
     /**
+     * Transform item in collection
+     *
+     * @param collection origin collection
+     * @param transformFunc transform function
+     * @param <R> origin item type
+     * @param <T> target type
+     * @return transform list
+     */
+    public static <R, T> List<T> transformToList(Collection<R> collection, 
Function<R, T> transformFunc) {
+        if (isEmpty(collection)) {
+            return new ArrayList<>();
+        }
+        return 
collection.stream().map(transformFunc).collect(Collectors.toList());
+    }
+
+    /**
+     * Collect collection to map
+     *
+     * @param collection origin collection
+     * @param keyTransformFunction key transform function
+     * @param <K> target k type
+     * @param <V> value
+     * @return map
+     */
+    public static <K, V> Map<K, V> collectionToMap(Collection<V> collection, 
Function<V, K> keyTransformFunction) {
+        if (isEmpty(collection)) {
+            return new HashMap<>();
+        }
+        return 
collection.stream().collect(Collectors.toMap(keyTransformFunction, 
Function.identity()));
+    }
+
+    /**
      * Helper class to easily access cardinality properties of two collections.
      *
      * @param <O> the element type
diff --git 
a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/CollectionUtilsTest.java
 
b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/CollectionUtilsTest.java
index 9968526..ccf8ace 100644
--- 
a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/CollectionUtilsTest.java
+++ 
b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/CollectionUtilsTest.java
@@ -142,4 +142,20 @@ public class CollectionUtilsTest {
         Assert.assertEquals(2, cardinalityMap.get(2).intValue());
         Assert.assertEquals(3, cardinalityMap.get(3).intValue());
     }
+
+    @Test
+    public void transformToList() {
+        List<String> stringList = new ArrayList<>();
+        stringList.add("1");
+        List<Integer> integers = CollectionUtils.transformToList(stringList, 
String::length);
+        Assert.assertFalse(integers.isEmpty());
+    }
+
+    @Test
+    public void collectionToMap() {
+        List<String> stringList = new ArrayList<>();
+        stringList.add("1");
+        Map<Integer, String> lengthStringMap = 
CollectionUtils.collectionToMap(stringList, String::length);
+        Assert.assertFalse(lengthStringMap.isEmpty());
+    }
 }
diff --git 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/UserMapper.java
 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/UserMapper.java
index 3e76638..4418363 100644
--- 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/UserMapper.java
+++ 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/UserMapper.java
@@ -116,4 +116,12 @@ public interface UserMapper extends BaseMapper<User> {
      * @return update rows
      */
     Integer updateUserQueue(@Param("oldQueue") String oldQueue, 
@Param("newQueue") String newQueue);
+
+    /**
+     * query user by ids
+     *
+     * @param ids id list
+     * @return user list
+     */
+    List<User> selectByIds(@Param("ids") List<Integer> ids);
 }
diff --git 
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/UserMapper.xml
 
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/UserMapper.xml
index 32768a8..7faff8b 100644
--- 
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/UserMapper.xml
+++ 
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/UserMapper.xml
@@ -115,4 +115,12 @@
         set queue = #{newQueue}
         where queue = #{oldQueue}
     </update>
+    <select id="selectByIds" 
resultType="org.apache.dolphinscheduler.dao.entity.User">
+        select *
+        from t_ds_user
+        where id in
+        <foreach item="id" index="index" collection="ids" open="(" 
separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
 </mapper>
diff --git 
a/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/UserMapperTest.java
 
b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/UserMapperTest.java
index e573ad7..3ee0e6c 100644
--- 
a/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/UserMapperTest.java
+++ 
b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/UserMapperTest.java
@@ -25,6 +25,7 @@ import org.apache.dolphinscheduler.dao.entity.Queue;
 import org.apache.dolphinscheduler.dao.entity.Tenant;
 import org.apache.dolphinscheduler.dao.entity.User;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -316,6 +317,16 @@ public class UserMapperTest {
     }
 
     @Test
+    public void selectByIds() {
+        //insertOne
+        User user = insertOne();
+        List<Integer> userIds = new ArrayList<>();
+        userIds.add(user.getId());
+        List<User> users = userMapper.selectByIds(userIds);
+        Assert.assertFalse(users.isEmpty());
+    }
+
+    @Test
     public void testExistUser() {
         String queueName = "queue";
         Assert.assertNull(userMapper.existUser(queueName));

Reply via email to