This is an automated email from the ASF dual-hosted git repository.
kirs 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 ba039dc [Improvement][dao] Resource features SQL slow query
optimization. (#4947)
ba039dc is described below
commit ba039dc252a2ddfe316297a2955f0ea9f966432a
Author: zhuangchong <[email protected]>
AuthorDate: Sat Mar 20 12:50:26 2021 +0800
[Improvement][dao] Resource features SQL slow query optimization. (#4947)
* Resourse features SQL slow query optimization.
* update resource mapper queryResourcePaging method.
* split resource and resource_uesr sql statement.
* determine the size of the collection.
* update process service class code style.
* update ResourceUserMapper java class code style.
* add resourceUserMapper in the test config file.
* solve code smell
* split paging query join statement.
* update ResourceUserMapper class.
* remove sql join statement.
* update resource test class code style.
* update ResourcesServiceTest test class.
* rerun ut.
* update user service test class.
* solve query resource list method code smell.
---
.../api/service/impl/ResourcesServiceImpl.java | 66 +++++++----
.../api/service/impl/UsersServiceImpl.java | 3 +-
.../api/service/ResourcesServiceTest.java | 11 +-
.../api/service/UsersServiceTest.java | 1 -
.../dao/mapper/ResourceMapper.java | 43 +++----
.../dao/mapper/ResourceUserMapper.java | 16 ++-
.../dolphinscheduler/dao/mapper/ResourceMapper.xml | 123 +++++++++++----------
.../dao/mapper/ResourceUserMapper.xml | 14 +++
.../dao/mapper/ResourceMapperTest.java | 60 +++++-----
.../server/registry/DependencyConfig.java | 6 +
.../processor/TaskCallbackServiceTestConfig.java | 6 +
.../service/process/ProcessService.java | 39 ++++++-
12 files changed, 252 insertions(+), 136 deletions(-)
diff --git
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ResourcesServiceImpl.java
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ResourcesServiceImpl.java
index f4da1dc..4b7cc59 100644
---
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ResourcesServiceImpl.java
+++
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ResourcesServiceImpl.java
@@ -529,8 +529,10 @@ public class ResourcesServiceImpl extends BaseServiceImpl
implements ResourcesSe
}
}
- IPage<Resource> resourceIPage =
resourcesMapper.queryResourcePaging(page,
- userId,directoryId, type.ordinal(), searchVal);
+ List<Integer> resourcesIds =
resourceUserMapper.queryResourcesIdListByUserIdAndPerm(userId, 0);
+
+ IPage<Resource> resourceIPage =
resourcesMapper.queryResourcePaging(page, userId, directoryId, type.ordinal(),
searchVal,resourcesIds);
+
PageInfo<Resource> pageInfo = new PageInfo<>(pageNo, pageSize);
pageInfo.setTotalCount((int)resourceIPage.getTotal());
pageInfo.setLists(resourceIPage.getRecords());
@@ -615,15 +617,10 @@ public class ResourcesServiceImpl extends BaseServiceImpl
implements ResourcesSe
@Override
public Map<String, Object> queryResourceList(User loginUser, ResourceType
type) {
Map<String, Object> result = new HashMap<>();
-
- int userId = loginUser.getId();
- if (isAdmin(loginUser)) {
- userId = 0;
- }
- List<Resource> allResourceList =
resourcesMapper.queryResourceListAuthored(userId, type.ordinal(),0);
+ List<Resource> allResourceList = queryAuthoredResourceList(loginUser,
type);
Visitor resourceTreeVisitor = new ResourceTreeVisitor(allResourceList);
result.put(Constants.DATA_LIST,
resourceTreeVisitor.visit().getChildren());
- putMsg(result,Status.SUCCESS);
+ putMsg(result, Status.SUCCESS);
return result;
}
@@ -638,11 +635,10 @@ public class ResourcesServiceImpl extends BaseServiceImpl
implements ResourcesSe
@Override
public Map<String, Object> queryResourceByProgramType(User loginUser,
ResourceType type, ProgramType programType) {
Map<String, Object> result = new HashMap<>();
+
+ List<Resource> allResourceList = queryAuthoredResourceList(loginUser,
type);
+
String suffix = ".jar";
- int userId = loginUser.getId();
- if (isAdmin(loginUser)) {
- userId = 0;
- }
if (programType != null) {
switch (programType) {
case JAVA:
@@ -654,11 +650,10 @@ public class ResourcesServiceImpl extends BaseServiceImpl
implements ResourcesSe
default:
}
}
- List<Resource> allResourceList =
resourcesMapper.queryResourceListAuthored(userId, type.ordinal(),0);
- List<Resource> resources = new ResourceFilter(suffix,new
ArrayList<>(allResourceList)).filter();
+ List<Resource> resources = new ResourceFilter(suffix, new
ArrayList<>(allResourceList)).filter();
Visitor resourceTreeVisitor = new ResourceTreeVisitor(resources);
result.put(Constants.DATA_LIST,
resourceTreeVisitor.visit().getChildren());
- putMsg(result,Status.SUCCESS);
+ putMsg(result, Status.SUCCESS);
return result;
}
@@ -1173,8 +1168,7 @@ public class ResourcesServiceImpl extends BaseServiceImpl
implements ResourcesSe
List<Resource> list;
if (resourceList != null && !resourceList.isEmpty()) {
Set<Resource> resourceSet = new HashSet<>(resourceList);
- List<Resource> authedResourceList =
resourcesMapper.queryAuthorizedResourceList(userId);
-
+ List<Resource> authedResourceList = queryResourceList(userId,
Constants.AUTHORIZE_WRITABLE_PERM);
getAuthorizedResourceList(resourceSet, authedResourceList);
list = new ArrayList<>(resourceSet);
} else {
@@ -1249,7 +1243,7 @@ public class ResourcesServiceImpl extends BaseServiceImpl
implements ResourcesSe
if (isNotAdmin(loginUser, result)) {
return result;
}
- List<Resource> authedResources =
resourcesMapper.queryAuthorizedResourceList(userId);
+ List<Resource> authedResources = queryResourceList(userId,
Constants.AUTHORIZE_WRITABLE_PERM);
Visitor visitor = new ResourceTreeVisitor(authedResources);
String visit = JSONUtils.toJsonString(visitor.visit(),
SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS);
logger.info(visit);
@@ -1329,4 +1323,38 @@ public class ResourcesServiceImpl extends
BaseServiceImpl implements ResourcesSe
}
}
+ /**
+ * query authored resource list (own and authorized)
+ * @param loginUser login user
+ * @param type ResourceType
+ * @return all authored resource list
+ */
+ private List<Resource> queryAuthoredResourceList(User loginUser,
ResourceType type) {
+ List<Resource> relationResources;
+ int userId = loginUser.getId();
+ if (isAdmin(loginUser)) {
+ userId = 0;
+ relationResources = new ArrayList<>();
+ } else {
+ // query resource relation
+ relationResources = queryResourceList(userId, 0);
+ }
+
+ List<Resource> ownResourceList =
resourcesMapper.queryResourceListAuthored(userId, type.ordinal());
+ ownResourceList.addAll(relationResources);
+
+ return ownResourceList;
+ }
+
+ /**
+ * query resource list by userId and perm
+ * @param userId userId
+ * @param perm perm
+ * @return resource list
+ */
+ private List<Resource> queryResourceList(Integer userId, int perm) {
+ List<Integer> resIds =
resourceUserMapper.queryResourcesIdListByUserIdAndPerm(userId, perm);
+ return CollectionUtils.isEmpty(resIds) ? new ArrayList<>() :
resourcesMapper.queryResourceListById(resIds);
+ }
+
}
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 865f4c3..62561ae 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
@@ -586,7 +586,8 @@ public class UsersServiceImpl extends BaseServiceImpl
implements UsersService {
}
//get the authorized resource id list by user id
- List<Resource> oldAuthorizedRes =
resourceMapper.queryAuthorizedResourceList(userId);
+ List<Integer> resIds =
resourceUserMapper.queryResourcesIdListByUserIdAndPerm(userId,
Constants.AUTHORIZE_WRITABLE_PERM);
+ List<Resource> oldAuthorizedRes = CollectionUtils.isEmpty(resIds) ?
new ArrayList<>() : resourceMapper.queryResourceListById(resIds);
//if resource type is UDF,need check whether it is bound by UDF
function
Set<Integer> oldAuthorizedResIds =
oldAuthorizedRes.stream().map(Resource::getId).collect(Collectors.toSet());
diff --git
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ResourcesServiceTest.java
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ResourcesServiceTest.java
index 89bd3df..931a419 100644
---
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ResourcesServiceTest.java
+++
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ResourcesServiceTest.java
@@ -266,8 +266,9 @@ public class ResourcesServiceTest {
IPage<Resource> resourcePage = new Page<>(1, 10);
resourcePage.setTotal(1);
resourcePage.setRecords(getResourceList());
+
Mockito.when(resourcesMapper.queryResourcePaging(Mockito.any(Page.class),
- Mockito.eq(0), Mockito.eq(-1), Mockito.eq(0),
Mockito.eq("test"))).thenReturn(resourcePage);
+ Mockito.eq(0), Mockito.eq(-1), Mockito.eq(0),
Mockito.eq("test"), Mockito.any())).thenReturn(resourcePage);
Map<String, Object> result =
resourcesService.queryResourceListPaging(loginUser, -1, ResourceType.FILE,
"test", 1, 10);
logger.info(result.toString());
Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
@@ -281,7 +282,7 @@ public class ResourcesServiceTest {
User loginUser = new User();
loginUser.setId(0);
loginUser.setUserType(UserType.ADMIN_USER);
- Mockito.when(resourcesMapper.queryResourceListAuthored(0, 0,
0)).thenReturn(getResourceList());
+ Mockito.when(resourcesMapper.queryResourceListAuthored(0,
0)).thenReturn(getResourceList());
Map<String, Object> result =
resourcesService.queryResourceList(loginUser, ResourceType.FILE);
logger.info(result.toString());
Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
@@ -615,7 +616,11 @@ public class ResourcesServiceTest {
Assert.assertEquals(Status.USER_NO_OPERATION_PERM,
result.get(Constants.STATUS));
//SUCCESS
user.setUserType(UserType.ADMIN_USER);
-
Mockito.when(resourcesMapper.queryAuthorizedResourceList(1)).thenReturn(getResourceList());
+
+ List<Integer> resIds = new ArrayList<>();
+ resIds.add(1);
+
Mockito.when(resourceUserMapper.queryResourcesIdListByUserIdAndPerm(Mockito.anyInt(),
Mockito.anyInt())).thenReturn(resIds);
+
Mockito.when(resourcesMapper.queryResourceListById(Mockito.any())).thenReturn(getResourceList());
result = resourcesService.authorizedFile(user, 1);
logger.info(result.toString());
Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
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 39b8cda..e8707fc 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
@@ -325,7 +325,6 @@ public class UsersServiceTest {
logger.info(result.toString());
Assert.assertEquals(Status.USER_NOT_EXIST,
result.get(Constants.STATUS));
//success
- when(resourceMapper.queryAuthorizedResourceList(1)).thenReturn(new
ArrayList<Resource>());
when(resourceMapper.selectById(Mockito.anyInt())).thenReturn(getResource());
when(resourceUserMapper.deleteResourceUser(1, 0)).thenReturn(1);
result = usersService.grantResources(loginUser, 1, resourceIds);
diff --git
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ResourceMapper.java
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ResourceMapper.java
index 96b2039..8fbd9a3 100644
---
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ResourceMapper.java
+++
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ResourceMapper.java
@@ -14,15 +14,18 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package org.apache.dolphinscheduler.dao.mapper;
import org.apache.dolphinscheduler.dao.entity.Resource;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
+
import org.apache.ibatis.annotations.Param;
import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
/**
* resource mapper interface
*/
@@ -43,14 +46,10 @@ public interface ResourceMapper extends
BaseMapper<Resource> {
* query resource list
* @param userId userId
* @param type type
- * @param perm perm
* @return resource list
*/
- List<Resource> queryResourceListAuthored(
- @Param("userId") int userId,
- @Param("type") int type,
- @Param("perm") int perm);
-
+ List<Resource> queryResourceListAuthored(@Param("userId") int userId,
+ @Param("type") int type);
/**
* resource page
@@ -59,20 +58,15 @@ public interface ResourceMapper extends
BaseMapper<Resource> {
* @param id id
* @param type type
* @param searchVal searchVal
+ * @param resIds resIds
* @return resource page
*/
IPage<Resource> queryResourcePaging(IPage<Resource> page,
@Param("userId") int userId,
@Param("id") int id,
@Param("type") int type,
- @Param("searchVal") String searchVal);
-
- /**
- * query Authed resource list
- * @param userId userId
- * @return resource list
- */
- List<Resource> queryAuthorizedResourceList(@Param("userId") int userId);
+ @Param("searchVal") String searchVal,
+ @Param("resIds") List<Integer> resIds);
/**
* query resource except userId
@@ -82,23 +76,20 @@ public interface ResourceMapper extends
BaseMapper<Resource> {
List<Resource> queryResourceExceptUserId(@Param("userId") int userId);
/**
- * query tenant code by name
- * @param resName resource name
- * @param resType resource type
- * @return tenant code
- */
- String queryTenantCodeByResourceName(@Param("resName") String
resName,@Param("resType") int resType);
-
- /**
* list authorized resource
* @param userId userId
* @param resNames resNames
* @param <T> T
* @return resource list
*/
- <T> List<Resource> listAuthorizedResource(@Param("userId") int
userId,@Param("resNames")T[] resNames);
-
+ <T> List<Resource> listAuthorizedResource(@Param("userId") int userId,
@Param("resNames") T[] resNames);
+ /**
+ * list resources by id
+ * @param resIds resIds
+ * @return resource list
+ */
+ List<Resource> queryResourceListById(@Param("resIds") List<Integer>
resIds);
/**
* list authorized resource
diff --git
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ResourceUserMapper.java
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ResourceUserMapper.java
index 176f7d8..dbaca25 100644
---
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ResourceUserMapper.java
+++
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ResourceUserMapper.java
@@ -14,18 +14,32 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package org.apache.dolphinscheduler.dao.mapper;
import org.apache.dolphinscheduler.dao.entity.ResourcesUser;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
import org.apache.ibatis.annotations.Param;
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
/**
* resource user relation mapper interface
*/
public interface ResourceUserMapper extends BaseMapper<ResourcesUser> {
/**
+ * query resourcesId list by userId and perm
+ * @param userId userId
+ * @param perm perm
+ * @return resourcesId list result
+ */
+ List<Integer> queryResourcesIdListByUserIdAndPerm(@Param("userId") int
userId,
+ @Param("perm") int perm);
+
+ /**
* delete resource user relation
* @param userId userId
* @param resourceId resourceId
diff --git
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ResourceMapper.xml
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ResourceMapper.xml
index c67fd72..7a8b043 100644
---
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ResourceMapper.xml
+++
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ResourceMapper.xml
@@ -18,90 +18,82 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="org.apache.dolphinscheduler.dao.mapper.ResourceMapper">
- <sql id="baseSql">
- id, alias, file_name, description, user_id, type, size, create_time,
update_time,
- pid, full_name, is_directory
- </sql>
<sql id="baseSqlV2">
${alias}.id, ${alias}.alias, ${alias}.file_name, ${alias}.description,
${alias}.user_id, ${alias}.type, ${alias}.size, ${alias}.create_time,
${alias}.update_time,
${alias}.pid, ${alias}.full_name, ${alias}.is_directory
</sql>
<select id="queryResourceList"
resultType="org.apache.dolphinscheduler.dao.entity.Resource">
select
- <include refid="baseSql"/>
- from t_ds_resources
+ <include refid="baseSqlV2">
+ <property name="alias" value="r"/>
+ </include>
+ from t_ds_resources r
where 1= 1
<if test="fullName != null and fullName != ''">
- and full_name = #{fullName}
+ and r.full_name = #{fullName}
</if>
<if test="type != -1">
- and type = #{type}
+ and r.type = #{type}
</if>
<if test="userId != 0">
- and user_id = #{userId}
+ and r.user_id = #{userId}
</if>
</select>
<select id="queryResourceListAuthored"
resultType="org.apache.dolphinscheduler.dao.entity.Resource">
select
- <include refid="baseSql"/>
- from t_ds_resources
+ <include refid="baseSqlV2">
+ <property name="alias" value="r"/>
+ </include>
+ from t_ds_resources r
where 1 = 1
<if test="type != -1">
- and type=#{type}
+ and r.type=#{type}
</if>
- <if test="userId != 0 and perm != 0">
- and id in (select resources_id from t_ds_relation_resources_user
where user_id=#{userId} and perm=#{perm}
- union select id as resources_id from t_ds_resources where
user_id=#{userId})
- </if>
- <if test="userId != 0 and perm == 0">
- and id in (select resources_id from t_ds_relation_resources_user
where user_id=#{userId}
- union select id as resources_id from t_ds_resources where
user_id=#{userId})
+ <if test="userId != 0">
+ and r.user_id=#{userId}
</if>
</select>
<select id="queryResourcePaging"
resultType="org.apache.dolphinscheduler.dao.entity.Resource">
select
- d.id, d.alias, d.file_name, d.description, d.user_id, d.type, d.size,
d.create_time, d.update_time,
- d.pid, d.full_name, d.is_directory,
- u.user_name as user_name
+ <include refid="baseSqlV2">
+ <property name="alias" value="d"/>
+ </include>
from t_ds_resources d
- join t_ds_user u on d.user_id = u.id
where d.type=#{type} and d.pid=#{id}
<if test="userId != 0">
- and d.id in (select resources_id from t_ds_relation_resources_user
where user_id=#{userId}
- union select id as resources_id from t_ds_resources where
user_id=#{userId})
+ and (
+ <if test="resIds != null and resIds.size() > 0">
+ and d.id in
+ <foreach collection="resIds" item="i" open="(" close=") or"
separator=",">
+ #{i}
+ </foreach>
+ </if>
+ d.user_id=#{userId} )
</if>
<if test="searchVal != null and searchVal != ''">
and d.alias like concat('%', #{searchVal}, '%')
</if>
order by d.update_time desc
</select>
- <select id="queryAuthorizedResourceList"
resultType="org.apache.dolphinscheduler.dao.entity.Resource">
+
+ <select id="queryResourceExceptUserId"
resultType="org.apache.dolphinscheduler.dao.entity.Resource">
select
<include refid="baseSqlV2">
<property name="alias" value="r"/>
</include>
- from t_ds_resources r,t_ds_relation_resources_user rel
- where r.id = rel.resources_id AND rel.user_id = #{userId} and perm=7
- </select>
- <select id="queryResourceExceptUserId"
resultType="org.apache.dolphinscheduler.dao.entity.Resource">
- select
- <include refid="baseSql"/>
- from t_ds_resources
- where user_id <![CDATA[ <> ]]> #{userId}
- </select>
- <select id="queryTenantCodeByResourceName" resultType="java.lang.String">
- select tenant_code
- from t_ds_tenant t, t_ds_user u, t_ds_resources res
- where t.id = u.tenant_id and u.id = res.user_id and res.type=#{resType}
- and res.full_name= #{resName}
+ from t_ds_resources r
+ where r.user_id <![CDATA[ <> ]]> #{userId}
</select>
+
<select id="listAuthorizedResource"
resultType="org.apache.dolphinscheduler.dao.entity.Resource">
select
- <include refid="baseSql"/>
- from t_ds_resources
- where type=0
- and id in (select resources_id from t_ds_relation_resources_user where
user_id=#{userId} and perm=7
- union select id as resources_id from t_ds_resources where
user_id=#{userId})
+ <include refid="baseSqlV2">
+ <property name="alias" value="r"/>
+ </include>
+ from t_ds_resources r
+ where r.type = 0
+ and r.user_id=#{userId}
+
<if test="resNames != null and resNames.length > 0">
and full_name in
<foreach collection="resNames" item="i" open="(" close=")"
separator=",">
@@ -109,12 +101,27 @@
</foreach>
</if>
</select>
+ <select id="queryResourceListById"
resultType="org.apache.dolphinscheduler.dao.entity.Resource">
+ select
+ <include refid="baseSqlV2">
+ <property name="alias" value="r"/>
+ </include>
+ from t_ds_resources r
+ where 1 = 1
+ <if test="resIds != null and resIds.size() > 0">
+ and r.id in
+ <foreach collection="resIds" item="i" open="(" close=")"
separator=",">
+ #{i}
+ </foreach>
+ </if>
+ </select>
<select id="listAuthorizedResourceById"
resultType="org.apache.dolphinscheduler.dao.entity.Resource">
select
- <include refid="baseSql"/>
- from t_ds_resources
- where id in (select resources_id from t_ds_relation_resources_user
where user_id=#{userId} and perm=7
- union select id as resources_id from t_ds_resources where
user_id=#{userId})
+ <include refid="baseSqlV2">
+ <property name="alias" value="r"/>
+ </include>
+ from t_ds_resources r
+ where r.user_id=#{userId}
<if test="resIds != null and resIds.length > 0">
and id in
<foreach collection="resIds" item="i" open="(" close=")"
separator=",">
@@ -138,10 +145,12 @@
<select id="queryResource"
resultType="org.apache.dolphinscheduler.dao.entity.Resource">
select
- <include refid="baseSql"/>
- from t_ds_resources
- where type = #{type}
- and full_name = #{fullName}
+ <include refid="baseSqlV2">
+ <property name="alias" value="r"/>
+ </include>
+ from t_ds_resources r
+ where r.type = #{type}
+ and r.full_name = #{fullName}
</select>
<update id="batchUpdateResource" parameterType="java.util.List">
@@ -159,9 +168,11 @@
<select id="listResourceByIds"
resultType="org.apache.dolphinscheduler.dao.entity.Resource">
select
- <include refid="baseSql"/>
- from t_ds_resources
- where id in
+ <include refid="baseSqlV2">
+ <property name="alias" value="r"/>
+ </include>
+ from t_ds_resources r
+ where r.id in
<foreach collection="resIds" item="i" open="(" close=")" separator=",">
#{i}
</foreach>
diff --git
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ResourceUserMapper.xml
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ResourceUserMapper.xml
index 7fdd09f..d5500b4 100644
---
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ResourceUserMapper.xml
+++
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ResourceUserMapper.xml
@@ -18,6 +18,20 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="org.apache.dolphinscheduler.dao.mapper.ResourceUserMapper">
+
+ <select id="queryResourcesIdListByUserIdAndPerm"
resultType="java.lang.Integer">
+ select
+ resources_id
+ from t_ds_relation_resources_user rel
+ where 1 = 1
+ <if test="userId != 0 and perm != 0">
+ and rel.user_id=#{userId} and rel.perm=#{perm}
+ </if>
+ <if test="userId != 0 and perm == 0">
+ and rel.user_id=#{userId}
+ </if>
+ </select>
+
<delete id="deleteResourceUser">
delete
from t_ds_relation_resources_user
diff --git
a/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/ResourceMapperTest.java
b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/ResourceMapperTest.java
index f06e4fc..011d69c 100644
---
a/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/ResourceMapperTest.java
+++
b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/ResourceMapperTest.java
@@ -14,18 +14,29 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package org.apache.dolphinscheduler.dao.mapper;
+import static java.util.stream.Collectors.toList;
+
+import static org.hamcrest.Matchers.greaterThan;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.dolphinscheduler.common.Constants;
import org.apache.dolphinscheduler.common.enums.ResourceType;
import org.apache.dolphinscheduler.common.enums.UserType;
+import org.apache.dolphinscheduler.common.utils.CollectionUtils;
import org.apache.dolphinscheduler.dao.entity.Resource;
import org.apache.dolphinscheduler.dao.entity.ResourcesUser;
import org.apache.dolphinscheduler.dao.entity.Tenant;
import org.apache.dolphinscheduler.dao.entity.User;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -35,15 +46,8 @@ import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-
-import static java.util.stream.Collectors.toList;
-import static org.hamcrest.Matchers.greaterThan;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertThat;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@RunWith(SpringRunner.class)
@SpringBootTest
@@ -238,14 +242,16 @@ public class ResourceMapperTest {
0,
-1,
resource.getType().ordinal(),
- ""
+ "",
+ new ArrayList<>()
);
IPage<Resource> resourceIPage1 = resourceMapper.queryResourcePaging(
page,
1110,
-1,
resource.getType().ordinal(),
- ""
+ "",
+ null
);
Assert.assertNotEquals(resourceIPage.getTotal(), 0);
Assert.assertNotEquals(resourceIPage1.getTotal(), 0);
@@ -259,7 +265,8 @@ public class ResourceMapperTest {
public void testQueryResourceListAuthored() {
Resource resource = insertOne();
- List<Resource> resources =
resourceMapper.queryAuthorizedResourceList(resource.getUserId());
+ List<Integer> resIds =
resourceUserMapper.queryResourcesIdListByUserIdAndPerm(resource.getUserId(),
Constants.AUTHORIZE_WRITABLE_PERM);
+ List<Resource> resources = CollectionUtils.isEmpty(resIds) ? new
ArrayList<>() : resourceMapper.queryResourceListById(resIds);
ResourcesUser resourcesUser = new ResourcesUser();
@@ -268,7 +275,8 @@ public class ResourceMapperTest {
resourcesUser.setPerm(Constants.AUTHORIZE_WRITABLE_PERM);
resourceUserMapper.insert(resourcesUser);
- List<Resource> resources1 =
resourceMapper.queryAuthorizedResourceList(1110);
+ List<Integer> resIds1 =
resourceUserMapper.queryResourcesIdListByUserIdAndPerm(1110,
Constants.AUTHORIZE_WRITABLE_PERM);
+ List<Resource> resources1 = CollectionUtils.isEmpty(resIds1) ? new
ArrayList<>() : resourceMapper.queryResourceListById(resIds1);
Assert.assertEquals(0, resources.size());
Assert.assertNotEquals(0, resources1.size());
@@ -282,7 +290,8 @@ public class ResourceMapperTest {
public void testQueryAuthorizedResourceList() {
Resource resource = insertOne();
- List<Resource> resources =
resourceMapper.queryAuthorizedResourceList(resource.getUserId());
+ List<Integer> resIds =
resourceUserMapper.queryResourcesIdListByUserIdAndPerm(resource.getUserId(),
Constants.AUTHORIZE_WRITABLE_PERM);
+ List<Resource> resources = CollectionUtils.isEmpty(resIds) ? new
ArrayList<>() : resourceMapper.queryResourceListById(resIds);
resourceMapper.deleteById(resource.getId());
Assert.assertEquals(0, resources.size());
@@ -306,7 +315,6 @@ public class ResourceMapperTest {
@Test
public void testQueryTenantCodeByResourceName() {
-
Tenant tenant = new Tenant();
tenant.setTenantCode("ut tenant code for resource");
int tenantInsertStatus = tenantMapper.insert(tenant);
@@ -324,7 +332,6 @@ public class ResourceMapperTest {
Assert.fail("insert user data error");
}
-
Resource resource = insertOne();
resource.setUserId(user.getId());
int userUpdateStatus = resourceMapper.updateById(resource);
@@ -332,12 +339,13 @@ public class ResourceMapperTest {
Assert.fail("update user data error");
}
- String resource1 = resourceMapper.queryTenantCodeByResourceName(
- resource.getFullName(), ResourceType.FILE.ordinal()
- );
+ List<Resource> resourceList =
resourceMapper.queryResource(resource.getFullName(),
ResourceType.FILE.ordinal());
+ int resourceUserId = resourceList.get(0).getUserId();
+ User resourceUser = userMapper.selectById(resourceUserId);
+ Tenant resourceTenant =
tenantMapper.selectById(resourceUser.getTenantId());
- Assert.assertEquals("ut tenant code for resource", resource1);
+ Assert.assertEquals("ut tenant code for resource",
resourceTenant.getTenantCode());
}
@@ -358,7 +366,6 @@ public class ResourceMapperTest {
Assert.assertEquals(generalUser2.getId(), resource.getUserId());
Assert.assertFalse(resources.stream().map(t ->
t.getFullName()).collect(toList()).containsAll(Arrays.asList(resNames)));
-
// authorize object unauthorizedResource to generalUser
createResourcesUser(unauthorizedResource, generalUser2);
List<Resource> authorizedResources =
resourceMapper.listAuthorizedResource(generalUser2.getId(), resNames);
@@ -390,10 +397,10 @@ public class ResourceMapperTest {
Resource resource = createResource(generalUser1);
createResourcesUser(resource, generalUser2);
- List<Resource> resourceList =
resourceMapper.queryResourceListAuthored(generalUser2.getId(),
ResourceType.FILE.ordinal(), 0);
+ List<Resource> resourceList =
resourceMapper.queryResourceListAuthored(generalUser2.getId(),
ResourceType.FILE.ordinal());
Assert.assertNotNull(resourceList);
- resourceList =
resourceMapper.queryResourceListAuthored(generalUser2.getId(),
ResourceType.FILE.ordinal(), 4);
+ resourceList =
resourceMapper.queryResourceListAuthored(generalUser2.getId(),
ResourceType.FILE.ordinal());
Assert.assertFalse(resourceList.contains(resource));
}
@@ -422,4 +429,5 @@ public class ResourceMapperTest {
insertOne();
Assert.assertTrue(resourceMapper.existResource(fullName, userId,
type));
}
-}
\ No newline at end of file
+}
+
diff --git
a/dolphinscheduler-server/src/test/java/org/apache/dolphinscheduler/server/registry/DependencyConfig.java
b/dolphinscheduler-server/src/test/java/org/apache/dolphinscheduler/server/registry/DependencyConfig.java
index d51d64d..f237bca 100644
---
a/dolphinscheduler-server/src/test/java/org/apache/dolphinscheduler/server/registry/DependencyConfig.java
+++
b/dolphinscheduler-server/src/test/java/org/apache/dolphinscheduler/server/registry/DependencyConfig.java
@@ -30,6 +30,7 @@ import
org.apache.dolphinscheduler.dao.mapper.ProcessInstanceMapMapper;
import org.apache.dolphinscheduler.dao.mapper.ProcessInstanceMapper;
import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
import org.apache.dolphinscheduler.dao.mapper.ResourceMapper;
+import org.apache.dolphinscheduler.dao.mapper.ResourceUserMapper;
import org.apache.dolphinscheduler.dao.mapper.ScheduleMapper;
import org.apache.dolphinscheduler.dao.mapper.TaskInstanceMapper;
import org.apache.dolphinscheduler.dao.mapper.TenantMapper;
@@ -131,6 +132,11 @@ public class DependencyConfig {
}
@Bean
+ public ResourceUserMapper resourceUserMapper() {
+ return Mockito.mock(ResourceUserMapper.class);
+ }
+
+ @Bean
public ErrorCommandMapper errorCommandMapper() {
return Mockito.mock(ErrorCommandMapper.class);
}
diff --git
a/dolphinscheduler-server/src/test/java/org/apache/dolphinscheduler/server/worker/processor/TaskCallbackServiceTestConfig.java
b/dolphinscheduler-server/src/test/java/org/apache/dolphinscheduler/server/worker/processor/TaskCallbackServiceTestConfig.java
index 224764c..f4876a6 100644
---
a/dolphinscheduler-server/src/test/java/org/apache/dolphinscheduler/server/worker/processor/TaskCallbackServiceTestConfig.java
+++
b/dolphinscheduler-server/src/test/java/org/apache/dolphinscheduler/server/worker/processor/TaskCallbackServiceTestConfig.java
@@ -30,6 +30,7 @@ import
org.apache.dolphinscheduler.dao.mapper.ProcessInstanceMapMapper;
import org.apache.dolphinscheduler.dao.mapper.ProcessInstanceMapper;
import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
import org.apache.dolphinscheduler.dao.mapper.ResourceMapper;
+import org.apache.dolphinscheduler.dao.mapper.ResourceUserMapper;
import org.apache.dolphinscheduler.dao.mapper.ScheduleMapper;
import org.apache.dolphinscheduler.dao.mapper.TaskInstanceMapper;
import org.apache.dolphinscheduler.dao.mapper.TenantMapper;
@@ -119,6 +120,11 @@ public class TaskCallbackServiceTestConfig {
}
@Bean
+ public ResourceUserMapper resourceUserMapper() {
+ return Mockito.mock(ResourceUserMapper.class);
+ }
+
+ @Bean
public ErrorCommandMapper errorCommandMapper() {
return Mockito.mock(ErrorCommandMapper.class);
}
diff --git
a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
index fe73eae..55b1d0f 100644
---
a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
+++
b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
@@ -76,6 +76,7 @@ import
org.apache.dolphinscheduler.dao.mapper.ProcessInstanceMapMapper;
import org.apache.dolphinscheduler.dao.mapper.ProcessInstanceMapper;
import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
import org.apache.dolphinscheduler.dao.mapper.ResourceMapper;
+import org.apache.dolphinscheduler.dao.mapper.ResourceUserMapper;
import org.apache.dolphinscheduler.dao.mapper.ScheduleMapper;
import org.apache.dolphinscheduler.dao.mapper.TaskInstanceMapper;
import org.apache.dolphinscheduler.dao.mapper.TenantMapper;
@@ -156,6 +157,9 @@ public class ProcessService {
private ResourceMapper resourceMapper;
@Autowired
+ private ResourceUserMapper resourceUserMapper;
+
+ @Autowired
private ErrorCommandMapper errorCommandMapper;
@Autowired
@@ -1794,7 +1798,21 @@ public class ProcessService {
public String queryTenantCodeByResName(String resName, ResourceType
resourceType) {
// in order to query tenant code successful although the version is
older
String fullName = resName.startsWith("/") ? resName :
String.format("/%s", resName);
- return resourceMapper.queryTenantCodeByResourceName(fullName,
resourceType.ordinal());
+
+ List<Resource> resourceList = resourceMapper.queryResource(fullName,
resourceType.ordinal());
+ if (CollectionUtils.isEmpty(resourceList)) {
+ return StringUtils.EMPTY;
+ }
+ int userId = resourceList.get(0).getUserId();
+ User user = userMapper.selectById(userId);
+ if (Objects.isNull(user)) {
+ return StringUtils.EMPTY;
+ }
+ Tenant tenant = tenantMapper.selectById(user.getTenantId());
+ if (Objects.isNull(tenant)) {
+ return StringUtils.EMPTY;
+ }
+ return tenant.getTenantCode();
}
/**
@@ -2036,11 +2054,15 @@ public class ProcessService {
switch (authorizationType) {
case RESOURCE_FILE_ID:
case UDF_FILE:
- Set<Integer> authorizedResourceFiles =
resourceMapper.listAuthorizedResourceById(userId,
needChecks).stream().map(Resource::getId).collect(toSet());
+ List<Resource> ownUdfResources =
resourceMapper.listAuthorizedResourceById(userId, needChecks);
+ addAuthorizedResources(ownUdfResources, userId);
+ Set<Integer> authorizedResourceFiles =
ownUdfResources.stream().map(Resource::getId).collect(toSet());
originResSet.removeAll(authorizedResourceFiles);
break;
case RESOURCE_FILE_NAME:
- Set<String> authorizedResources =
resourceMapper.listAuthorizedResource(userId,
needChecks).stream().map(Resource::getFullName).collect(toSet());
+ List<Resource> ownResources =
resourceMapper.listAuthorizedResource(userId, needChecks);
+ addAuthorizedResources(ownResources, userId);
+ Set<String> authorizedResources =
ownResources.stream().map(Resource::getFullName).collect(toSet());
originResSet.removeAll(authorizedResources);
break;
case DATASOURCE:
@@ -2163,4 +2185,15 @@ public class ProcessService {
}
return JSONUtils.toJsonString(processData);
}
+
+ /**
+ * add authorized resources
+ * @param ownResources own resources
+ * @param userId userId
+ */
+ private void addAuthorizedResources(List<Resource> ownResources, int
userId) {
+ List<Integer> relationResourceIds =
resourceUserMapper.queryResourcesIdListByUserIdAndPerm(userId, 7);
+ List<Resource> relationResources =
CollectionUtils.isNotEmpty(relationResourceIds) ?
resourceMapper.queryResourceListById(relationResourceIds) : new ArrayList<>();
+ ownResources.addAll(relationResources);
+ }
}