Skip to content

Commit de6d36e

Browse files
authored
Merge pull request #1067 from ZakarFin/permission-joins
Refactor permission queries to joins
2 parents 9d3cfdb + 638e7bf commit de6d36e

File tree

6 files changed

+92
-50
lines changed

6 files changed

+92
-50
lines changed

service-map/src/main/java/fi/mml/map/mapwindow/util/OskariLayerWorker.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,20 @@ public static JSONObject getListOfMapLayersById(final List<Integer> layerIdList,
8080
*/
8181
public static JSONObject getListOfMapLayers(final List<OskariLayer> layers, final User user,
8282
final String lang, final String crs, final boolean isPublished, final boolean isSecure) {
83-
List<Resource> resources = permissionService.findResourcesByUser(user, ResourceType.maplayer);
83+
List<Resource> resources;
84+
if (layers.size() < 20) {
85+
// usually the case with loading the default app setup
86+
resources = layers.stream()
87+
.map(OskariLayer::getId)
88+
.map(id -> Integer.toString(id))
89+
.map(id -> permissionService.findResource(ResourceType.maplayer, id))
90+
.filter(Optional::isPresent)
91+
.map(Optional::get)
92+
.collect(Collectors.toList());
93+
} else {
94+
// more than 20 layers, just get all the permissions
95+
resources = permissionService.findResourcesByUser(user, ResourceType.maplayer);
96+
}
8497
return getListOfMapLayers(layers, user, lang, isSecure, crs, isPublished, new PermissionSet(resources));
8598
}
8699

service-permissions/src/main/java/org/oskari/permissions/PermissionServiceMybatisImpl.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
import fi.nls.oskari.log.Logger;
1010
import fi.nls.oskari.log.LogFactory;
1111
import fi.nls.oskari.mybatis.MyBatisHelper;
12+
import org.apache.ibatis.session.Configuration;
1213
import org.apache.ibatis.session.SqlSession;
1314
import org.apache.ibatis.session.SqlSessionFactory;
15+
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
1416
import org.oskari.permissions.model.Permission;
1517
import org.oskari.permissions.model.PermissionExternalType;
1618
import org.oskari.permissions.model.Resource;
@@ -42,11 +44,18 @@ public PermissionServiceMybatisImpl(DataSource ds) {
4244
LOG.warn("DataSource was null, all future calls will throw NPEs!");
4345
factory = null;
4446
} else {
45-
factory = MyBatisHelper.initMyBatis(ds, MAPPER);
47+
factory = initializeMyBatis(ds);
4648
}
4749
cache = CacheManager.getCache(PermissionServiceMybatisImpl.class.getName());
4850
}
4951

52+
private SqlSessionFactory initializeMyBatis(final DataSource dataSource) {
53+
final Configuration configuration = MyBatisHelper.getConfig(dataSource);
54+
MyBatisHelper.addAliases(configuration, Resource.class, Permission.class);
55+
MyBatisHelper.addMappers(configuration, MAPPER);
56+
return new SqlSessionFactoryBuilder().build(configuration);
57+
}
58+
5059
public List<Resource> findResourcesByUser(User user, ResourceType type) {
5160
// TODO: add userId and user.getRoles() to query and remove filtering on code
5261
List<Resource> all = findResourcesByType(type);

service-permissions/src/main/java/org/oskari/permissions/ResourceMapper.java

Lines changed: 2 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.List;
44
import java.util.Set;
55

6+
import fi.nls.oskari.domain.map.userlayer.UserLayerData;
67
import org.apache.ibatis.annotations.Delete;
78
import org.apache.ibatis.annotations.Insert;
89
import org.apache.ibatis.annotations.Many;
@@ -19,46 +20,15 @@
1920

2021
public interface ResourceMapper {
2122

22-
// TODO: Join tables in SQL and map the result -> improves performance by ~5x
23-
@Results(id = "ResourceResult", value = {
24-
@Result(property="id", column="id", id=true),
25-
@Result(property="type", column="resource_type"),
26-
@Result(property="mapping", column="resource_mapping"),
27-
@Result(property="permissions", column="id",
28-
javaType=List.class, many=@Many(select="findPermissionsByResourceId", fetchType= FetchType.EAGER))
29-
})
30-
@Select("SELECT id,"
31-
+ "resource_type,"
32-
+ "resource_mapping "
33-
+ "FROM oskari_resource "
34-
+ "WHERE id = #{id}")
3523
Resource findById(@Param("id") int id);
3624

3725
@Select("SELECT EXISTS (SELECT 1 FROM oskari_resource WHERE id = #{id})")
3826
boolean existsById(@Param("id") int id);
3927

40-
@ResultMap("ResourceResult")
41-
@Select("SELECT id,"
42-
+ "resource_type,"
43-
+ "resource_mapping "
44-
+ "FROM oskari_resource")
4528
List<Resource> findAll();
4629

47-
@ResultMap("ResourceResult")
48-
@Select("SELECT id,"
49-
+ "resource_type,"
50-
+ "resource_mapping "
51-
+ "FROM oskari_resource "
52-
+ "WHERE resource_type = #{type}")
53-
List<Resource> findByType(String type);
30+
List<Resource> findByType(@Param("type") String type);
5431

55-
@ResultMap("ResourceResult")
56-
@Select("SELECT id,"
57-
+ "resource_type,"
58-
+ "resource_mapping "
59-
+ "FROM oskari_resource "
60-
+ "WHERE resource_type = #{type} "
61-
+ "AND resource_mapping = #{mapping}")
6232
Resource findByTypeAndMapping(@Param("type") String type, @Param("mapping") String mapping);
6333

6434
@Select("SELECT EXISTS (SELECT 1 FROM oskari_resource WHERE resource_type = #{type} AND resource_mapping = #{mapping})")
@@ -79,20 +49,6 @@ Set<String> findMappingsForPermission(@Param("resourceType") String resourceType
7949
@Param("permission") String permission,
8050
@Param("external_id") String external_id);
8151

82-
@Results({
83-
@Result(property="id", column="id", id=true),
84-
@Result(property="type", column="permission"),
85-
@Result(property="externalType", column="external_type"),
86-
@Result(property="externalId", column="external_id")
87-
})
88-
@Select("SELECT id,"
89-
+ "external_type,"
90-
+ "permission,"
91-
+ "external_id "
92-
+ "FROM oskari_resource_permission "
93-
+ "WHERE resource_id = #{resourceId}")
94-
List<Permission> findPermissionsByResourceId(@Param("resourceId") int resourceId);
95-
9652
@Insert("INSERT INTO oskari_resource (resource_type, resource_mapping) VALUES (#{type},#{mapping})")
9753
@Options(useGeneratedKeys=true, keyColumn="id", keyProperty="id")
9854
void insertResource(Resource resource);

service-permissions/src/main/java/org/oskari/permissions/model/Permission.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ public String getType() {
2424

2525
public void setType(String type) {
2626
this.type = type;
27-
2827
}
2928

3029
public void setType(PermissionType type) {
@@ -39,6 +38,10 @@ public void setExternalType(String externalType) {
3938
setExternalType(PermissionExternalType.valueOf(externalType));
4039
}
4140

41+
public void setExternalTypeMybatis(String externalType) {
42+
setExternalType(PermissionExternalType.valueOf(externalType));
43+
}
44+
4245
public void setExternalType(PermissionExternalType externalType) {
4346
this.externalType = externalType;
4447
}
@@ -55,6 +58,11 @@ public void setExternalId(String externalId) {
5558
setExternalId(Integer.parseInt(externalId));
5659
}
5760

61+
public void setExternalIdMybatis(String externalId) {
62+
setExternalId(externalId);
63+
}
64+
65+
5866
public void setRoleId(int roleId) {
5967
setExternalType(PermissionExternalType.ROLE);
6068
setExternalId(roleId);

service-permissions/src/main/java/org/oskari/permissions/model/Resource.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ public void setMapping(String namespace, String name) {
5353

5454
public List<Permission> getPermissions() {
5555
if (permissions == null) {
56-
return Collections.emptyList();
56+
// mybatis calls get to fill in the results to
57+
// -> we can't use Collections.emptyList() here
58+
permissions = new ArrayList<>();
5759
}
5860
return permissions;
5961
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
3+
<!DOCTYPE mapper
4+
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
5+
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
6+
7+
<mapper namespace="org.oskari.permissions.ResourceMapper">
8+
9+
<resultMap id="resourceWithPermissions" type="Resource">
10+
<id property="id" column="id" />
11+
<result property="type" column="resource_type" javaType="String" />
12+
<result property="mapping" column="resource_mapping" javaType="String" />
13+
<collection property="permissions" javaType="list" ofType="Permission">
14+
<result property="id" column="permission_id" javaType="int"/>
15+
<result property="type" column="permission" javaType="String" />
16+
<result property="externalTypeMybatis" column="external_type" javaType="String"/>
17+
<result property="externalIdMybatis" column="external_id" javaType="String" />
18+
</collection>
19+
</resultMap>
20+
21+
<select id="findAll" resultMap="resourceWithPermissions" useCache="false">
22+
SELECT r.id, r.resource_type, r.resource_mapping, p.id as permission_id, p.external_type, p.permission, p.external_id
23+
FROM oskari_resource r
24+
LEFT JOIN oskari_resource_permission p
25+
ON r.id = p.resource_id
26+
</select>
27+
28+
<select id="findById" resultMap="resourceWithPermissions" useCache="false">
29+
SELECT r.id, r.resource_type, r.resource_mapping, p.id as permission_id, p.resource_id, p.external_type, p.permission, p.external_id
30+
FROM oskari_resource r
31+
JOIN oskari_resource_permission p
32+
ON r.id = p.resource_id
33+
WHERE r.id = #{id}
34+
</select>
35+
36+
<select id="findByType" resultMap="resourceWithPermissions" useCache="false">
37+
SELECT r.id, r.resource_type, r.resource_mapping, p.id as permission_id, p.external_type, p.permission, p.external_id
38+
FROM oskari_resource r
39+
LEFT JOIN oskari_resource_permission p
40+
ON r.id = p.resource_id
41+
WHERE r.resource_type = #{type}
42+
</select>
43+
44+
<select id="findByTypeAndMapping" resultMap="resourceWithPermissions" useCache="false">
45+
SELECT r.id, r.resource_type, r.resource_mapping, p.id as permission_id, p.external_type, p.permission, p.external_id
46+
FROM oskari_resource r
47+
LEFT JOIN oskari_resource_permission p
48+
ON r.id = p.resource_id
49+
WHERE r.resource_type = #{type}
50+
AND r.resource_mapping = #{mapping}
51+
</select>
52+
53+
54+
</mapper>

0 commit comments

Comments
 (0)