|
8 | 8 | import jakarta.persistence.TypedQuery; |
9 | 9 | import jakarta.persistence.criteria.*; |
10 | 10 |
|
| 11 | +import java.util.Comparator; |
11 | 12 | import java.util.List; |
12 | 13 |
|
13 | 14 | /** |
@@ -52,68 +53,62 @@ public MetadataBlock findByName(String name) { |
52 | 53 | public List<MetadataBlock> listMetadataBlocksDisplayedOnCreate(Dataverse ownerDataverse) { |
53 | 54 | CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); |
54 | 55 | CriteriaQuery<MetadataBlock> criteriaQuery = criteriaBuilder.createQuery(MetadataBlock.class); |
55 | | - Root<MetadataBlock> metadataBlockRoot = criteriaQuery.from(MetadataBlock.class); |
56 | | - Join<MetadataBlock, DatasetFieldType> datasetFieldTypeJoin = metadataBlockRoot.join("datasetFieldTypes"); |
57 | | - |
| 56 | + Root<Dataverse> dataverseRoot = criteriaQuery.from(Dataverse.class); |
| 57 | + |
| 58 | + // Join metadataBlocks from Dataverse |
| 59 | + Join<Dataverse, MetadataBlock> metadataBlockJoin = dataverseRoot.join("metadataBlocks"); |
| 60 | + |
| 61 | + // Join datasetFieldTypes from MetadataBlock |
| 62 | + Join<MetadataBlock, DatasetFieldType> datasetFieldTypeJoin = metadataBlockJoin.join("datasetFieldTypes"); |
| 63 | + |
| 64 | + Predicate displayOnCreatePredicate = criteriaBuilder.isTrue(datasetFieldTypeJoin.get("displayOnCreate")); |
| 65 | + Predicate requiredPredicate = criteriaBuilder.isTrue(datasetFieldTypeJoin.get("required")); |
| 66 | + |
58 | 67 | if (ownerDataverse != null) { |
59 | | - Root<Dataverse> dataverseRoot = criteriaQuery.from(Dataverse.class); |
60 | | - Join<Dataverse, DataverseFieldTypeInputLevel> datasetFieldTypeInputLevelJoin = |
61 | | - dataverseRoot.join("dataverseFieldTypeInputLevels", JoinType.LEFT); |
62 | | - |
63 | | - // Subquery to check if the input level exists |
64 | | - Subquery<Long> inputLevelSubquery = criteriaQuery.subquery(Long.class); |
65 | | - Root<DataverseFieldTypeInputLevel> subqueryRoot = inputLevelSubquery.from(DataverseFieldTypeInputLevel.class); |
66 | | - inputLevelSubquery.select(criteriaBuilder.literal(1L)) |
67 | | - .where( |
68 | | - criteriaBuilder.equal(subqueryRoot.get("dataverse"), dataverseRoot), |
69 | | - criteriaBuilder.equal(subqueryRoot.get("datasetFieldType"), datasetFieldTypeJoin) |
70 | | - ); |
71 | | - |
72 | | - // Predicate for displayOnCreate in the input level |
73 | | - Predicate displayOnCreateInputLevelPredicate = criteriaBuilder.and( |
74 | | - datasetFieldTypeInputLevelJoin.get("datasetFieldType").in(metadataBlockRoot.get("datasetFieldTypes")), |
75 | | - criteriaBuilder.isNotNull(datasetFieldTypeInputLevelJoin.get("displayOnCreate")), |
76 | | - criteriaBuilder.isTrue(datasetFieldTypeInputLevelJoin.get("displayOnCreate"))); |
77 | | - |
78 | | - // Predicate for required fields |
79 | | - Predicate requiredPredicate = criteriaBuilder.and( |
80 | | - datasetFieldTypeInputLevelJoin.get("datasetFieldType").in(metadataBlockRoot.get("datasetFieldTypes")), |
81 | | - criteriaBuilder.isTrue(datasetFieldTypeInputLevelJoin.get("required"))); |
82 | | - |
83 | | - // Predicate for default displayOnCreate (when there is no input level) |
84 | | - Predicate defaultDisplayOnCreatePredicate = criteriaBuilder.and( |
85 | | - criteriaBuilder.not(criteriaBuilder.exists(inputLevelSubquery)), |
86 | | - criteriaBuilder.or( |
87 | | - criteriaBuilder.isTrue(datasetFieldTypeJoin.get("displayOnCreate")), |
88 | | - criteriaBuilder.isTrue(datasetFieldTypeJoin.get("required")) |
89 | | - )); |
90 | | - |
91 | | - Predicate unionPredicate = criteriaBuilder.or( |
92 | | - displayOnCreateInputLevelPredicate, |
93 | | - requiredPredicate, |
94 | | - defaultDisplayOnCreatePredicate |
| 68 | + // Ensure we filter for the specific Dataverse |
| 69 | + Predicate dataversePredicate = criteriaBuilder.equal(dataverseRoot.get("id"), ownerDataverse.getId()); |
| 70 | + |
| 71 | + // Join DataverseFieldTypeInputLevel (LEFT JOIN) |
| 72 | + Join<Dataverse, DataverseFieldTypeInputLevel> datasetFieldTypeInputLevelJoin = |
| 73 | + dataverseRoot.join("dataverseFieldTypeInputLevels", JoinType.LEFT); |
| 74 | + |
| 75 | + // Check if input level explicitly defines displayOnCreate |
| 76 | + Predicate inputLevelDisplayPredicate = criteriaBuilder.and( |
| 77 | + criteriaBuilder.equal(datasetFieldTypeInputLevelJoin.get("datasetFieldType"), datasetFieldTypeJoin), |
| 78 | + criteriaBuilder.isTrue(datasetFieldTypeInputLevelJoin.get("displayOnCreate")) |
| 79 | + ); |
| 80 | + |
| 81 | + // Check if input level explicitly defines required |
| 82 | + Predicate inputLevelRequiredPredicate = criteriaBuilder.and( |
| 83 | + criteriaBuilder.equal(datasetFieldTypeInputLevelJoin.get("datasetFieldType"), datasetFieldTypeJoin), |
| 84 | + criteriaBuilder.isTrue(datasetFieldTypeInputLevelJoin.get("required")) |
95 | 85 | ); |
96 | 86 |
|
97 | | - criteriaQuery.where(criteriaBuilder.and( |
98 | | - criteriaBuilder.equal(dataverseRoot.get("id"), ownerDataverse.getId()), |
99 | | - metadataBlockRoot.in(dataverseRoot.get("metadataBlocks")), |
100 | | - unionPredicate |
101 | | - )); |
| 87 | + Predicate finalDisplayPredicate = criteriaBuilder.or(inputLevelDisplayPredicate, displayOnCreatePredicate); |
| 88 | + Predicate finalRequiredPredicate = criteriaBuilder.or(inputLevelRequiredPredicate, requiredPredicate); |
| 89 | + |
| 90 | + criteriaQuery.where( |
| 91 | + dataversePredicate, |
| 92 | + criteriaBuilder.or(finalDisplayPredicate, finalRequiredPredicate) |
| 93 | + ); |
102 | 94 | } else { |
103 | 95 | // When ownerDataverse is null, we need to include fields that are either displayOnCreate=true OR required=true |
104 | | - Predicate displayOnCreatePredicate = criteriaBuilder.isTrue(datasetFieldTypeJoin.get("displayOnCreate")); |
105 | | - Predicate requiredPredicate = criteriaBuilder.isTrue(datasetFieldTypeJoin.get("required")); |
106 | | - |
107 | 96 | // We also need to ensure that fields from linked metadata blocks are included |
108 | 97 | Predicate linkedFieldsPredicate = criteriaBuilder.and( |
109 | | - criteriaBuilder.isNotNull(datasetFieldTypeJoin.get("id")), |
110 | | - criteriaBuilder.or(displayOnCreatePredicate, requiredPredicate) |
| 98 | + criteriaBuilder.isNotNull(datasetFieldTypeJoin.get("id")), |
| 99 | + criteriaBuilder.or(displayOnCreatePredicate, requiredPredicate) |
111 | 100 | ); |
112 | | - |
| 101 | + |
113 | 102 | criteriaQuery.where(linkedFieldsPredicate); |
114 | 103 | } |
115 | 104 |
|
116 | | - criteriaQuery.select(metadataBlockRoot).distinct(true); |
117 | | - return em.createQuery(criteriaQuery).getResultList(); |
| 105 | + criteriaQuery.select(metadataBlockJoin).distinct(true); |
| 106 | + |
| 107 | + List<MetadataBlock> result = em.createQuery(criteriaQuery).getResultList(); |
| 108 | + |
| 109 | + // Order by id |
| 110 | + result.sort(Comparator.comparing(MetadataBlock::getId)); |
| 111 | + |
| 112 | + return result; |
118 | 113 | } |
119 | 114 | } |
0 commit comments