刘光辉
3 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package jnpf.dmsMapper;
 
import jnpf.dmsDatabase.DmsUuidTypeHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.Configuration;
import org.junit.jupiter.api.Test;
 
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
 
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
 
class DmsPermissionResourceMapperSqlTest {
 
    @Test
    void childListIncludesCurrentDocumentVersionPropertiesInOneQuery() {
        Configuration configuration = new Configuration();
        configuration.getTypeHandlerRegistry().register(UUID.class, DmsUuidTypeHandler.class);
        configuration.addMapper(DmsPermissionResourceMapper.class);
        MappedStatement statement = configuration.getMappedStatement(
                DmsPermissionResourceMapper.class.getName() + ".selectChildren");
 
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("tenantId", "tenant-1");
        parameters.put("parentId", UUID.fromString("018f0000-0000-7000-8000-000000000301"));
        parameters.put("limit", 100);
        BoundSql boundSql = statement.getBoundSql(parameters);
        String sql = boundSql.getSql().replaceAll("\\s+", " ").trim();
 
        assertTrue(sql.contains("LEFT JOIN public.dms_version_states current_state"));
        assertTrue(sql.contains("current_state.lifecycle_status = 'EFFECTIVE'"));
        assertTrue(sql.contains("LEFT JOIN public.dms_file_versions current_version"));
        assertTrue(sql.contains("COALESCE(d.document_no, version_document.document_no) AS document_no"));
        assertTrue(sql.contains("COALESCE(d.document_type, version_document.document_type) AS document_type"));
        assertTrue(sql.contains("COALESCE(v.version_label, current_version.version_label) AS version_label"));
        assertTrue(sql.contains("COALESCE(v.prepared_by, current_version.prepared_by) AS prepared_by"));
        assertTrue(sql.contains("COALESCE(version_state.effective_to, current_state.effective_to) AS effective_to"));
        assertTrue(sql.contains("COALESCE(version_state.review_cycle_months, current_state.review_cycle_months) AS review_cycle_months"));
        assertTrue(sql.contains("COALESCE(version_state.next_review_on, current_state.next_review_on) AS next_review_on"));
        assertTrue(sql.contains("f.f_delete_mark IS NULL"));
        assertTrue(sql.contains("CASE WHEN r.resource_type = 'FOLDER' THEN f.sort_code END"));
        assertTrue(sql.contains("CASE WHEN r.resource_type = 'FOLDER' THEN f.revision END"));
        assertTrue(sql.contains("CASE WHEN r.resource_type = 'FOLDER' THEN f.sort_code END, name, r.id"));
        assertTrue(sql.endsWith("LIMIT ?"));
        assertFalse(sql.contains("SELECT *"));
    }
 
    @Test
    void fileSearchUsesUnifiedFieldsAcrossFolderSubtreeOrDocument() {
        Configuration configuration = new Configuration();
        configuration.getTypeHandlerRegistry().register(UUID.class, DmsUuidTypeHandler.class);
        configuration.addMapper(DmsPermissionResourceMapper.class);
        MappedStatement statement = configuration.getMappedStatement(
                DmsPermissionResourceMapper.class.getName() + ".searchFiles");
 
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("tenantId", "tenant-1");
        parameters.put("parentId", UUID.fromString("018f0000-0000-7000-8000-000000000301"));
        parameters.put("keyword", "report");
        parameters.put("limit", 100);
        String sql = statement.getBoundSql(parameters).getSql().replaceAll("\\s+", " ").trim();
 
        assertTrue(sql.contains("r.resource_type = 'FILE_VERSION'"));
        assertTrue(sql.contains("WITH RECURSIVE search_folders"));
        assertTrue(sql.contains("child.parent_id = parent.id"));
        assertTrue(sql.contains("v.document_id = ? OR version_document.folder_id IN (SELECT id FROM search_folders)"));
        assertTrue(sql.contains("STRPOS(LOWER(COALESCE(v.file_name, '')), LOWER(?)) > 0"));
        assertTrue(sql.contains("STRPOS(LOWER(COALESCE(version_document.name, '')), LOWER(?)) > 0"));
        assertTrue(sql.contains("STRPOS(LOWER(COALESCE(version_document.document_no, '')), LOWER(?)) > 0"));
        assertTrue(sql.contains("ORDER BY v.file_name, v.id LIMIT ?"));
    }
 
    @Test
    void rootFileSearchCoversTheWholeTenant() {
        Configuration configuration = new Configuration();
        configuration.getTypeHandlerRegistry().register(UUID.class, DmsUuidTypeHandler.class);
        configuration.addMapper(DmsPermissionResourceMapper.class);
        MappedStatement statement = configuration.getMappedStatement(
                DmsPermissionResourceMapper.class.getName() + ".searchFiles");
 
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("tenantId", "tenant-1");
        parameters.put("parentId", null);
        parameters.put("keyword", "report");
        parameters.put("limit", 100);
        String sql = statement.getBoundSql(parameters).getSql().replaceAll("\\s+", " ").trim();
 
        assertTrue(sql.contains("r.tenant_id = ? AND r.resource_type = 'FILE_VERSION'"));
        assertFalse(sql.contains("v.document_id = ?"));
        assertFalse(sql.contains("version_document.folder_id IN (SELECT id FROM search_folders)"));
    }
}