|
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