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