Skip to content
This repository was archived by the owner on Jan 28, 2026. It is now read-only.

Commit e5e56a1

Browse files
author
ge85riz
committed
⚡️ perf: adjust entity graphs according to business logic
1 parent 04faa09 commit e5e56a1

File tree

14 files changed

+142
-46
lines changed

14 files changed

+142
-46
lines changed

backend/src/main/java/com/itestra/eep/dtos/EmployeeCreateDTO.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
package com.itestra.eep.dtos;
22

3+
import com.fasterxml.jackson.annotation.JsonProperty;
34
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
45
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
56
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
67
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
78
import com.itestra.eep.enums.DietaryPreference;
89
import com.itestra.eep.enums.Role;
10+
import com.itestra.eep.serializers.GenderDeserializer;
11+
import com.itestra.eep.validators.ValidGender;
912
import jakarta.persistence.EnumType;
1013
import jakarta.persistence.Enumerated;
1114
import jakarta.validation.Valid;
1215
import jakarta.validation.constraints.*;
1316
import lombok.AllArgsConstructor;
1417
import lombok.Getter;
18+
import lombok.NoArgsConstructor;
1519
import lombok.Setter;
16-
import org.hibernate.annotations.JdbcTypeCode;
17-
import org.hibernate.type.SqlTypes;
1820

1921
import java.io.Serializable;
2022
import java.time.LocalDate;
@@ -24,6 +26,7 @@
2426
@Getter
2527
@Setter
2628
@AllArgsConstructor
29+
@NoArgsConstructor
2730
public class EmployeeCreateDTO implements Serializable {
2831

2932
@Valid
@@ -53,6 +56,9 @@ public static class ProfileCreateDTO implements Serializable {
5356

5457
@Size(max = 255)
5558
@NotBlank(message = "Gender cannot be empty.")
59+
@ValidGender
60+
@JsonProperty("gender")
61+
@JsonDeserialize(using = GenderDeserializer.class)
5662
String gender;
5763

5864
@Size(max = 255, message = "GitLab username should be shorter than 255 characters")
@@ -65,7 +71,6 @@ public static class ProfileCreateDTO implements Serializable {
6571
@Email(message = "Email should be valid.")
6672
String email;
6773

68-
@JdbcTypeCode(SqlTypes.ARRAY)
6974
@Enumerated(EnumType.STRING)
7075
DietaryPreference[] dietTypes;
7176

backend/src/main/java/com/itestra/eep/dtos/EmployeeUpdateDTO.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
77
import com.itestra.eep.enums.DietaryPreference;
88
import com.itestra.eep.enums.Role;
9+
import com.itestra.eep.serializers.GenderDeserializer;
10+
import com.itestra.eep.validators.ValidGender;
911
import jakarta.persistence.EnumType;
1012
import jakarta.persistence.Enumerated;
1113
import jakarta.validation.Valid;
@@ -15,8 +17,6 @@
1517
import jakarta.validation.constraints.Size;
1618
import lombok.Getter;
1719
import lombok.Setter;
18-
import org.hibernate.annotations.JdbcTypeCode;
19-
import org.hibernate.type.SqlTypes;
2020

2121
import java.io.Serializable;
2222
import java.time.LocalDate;
@@ -51,6 +51,8 @@ public static class ProfileUpdateDTO implements Serializable {
5151

5252
@Size(max = 255)
5353
@NotBlank(message = "Gender cannot be empty.")
54+
@ValidGender
55+
@JsonDeserialize(using = GenderDeserializer.class)
5456
String gender;
5557

5658
@Size(max = 255, message = "GitLab username should be shorter than 255 characters")
@@ -63,7 +65,6 @@ public static class ProfileUpdateDTO implements Serializable {
6365
@Email(message = "Email should be valid.")
6466
String email;
6567

66-
@JdbcTypeCode(SqlTypes.ARRAY)
6768
@Enumerated(EnumType.STRING)
6869
DietaryPreference[] dietTypes;
6970

backend/src/main/java/com/itestra/eep/dtos/ProfileUpdateDTO.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package com.itestra.eep.dtos;
22

3+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
34
import com.itestra.eep.enums.DietaryPreference;
5+
import com.itestra.eep.serializers.GenderDeserializer;
6+
import com.itestra.eep.validators.ValidGender;
47
import jakarta.persistence.EnumType;
58
import jakarta.persistence.Enumerated;
69
import jakarta.validation.constraints.Email;
710
import jakarta.validation.constraints.NotBlank;
811
import jakarta.validation.constraints.Size;
912
import lombok.Value;
10-
import org.hibernate.annotations.JdbcTypeCode;
11-
import org.hibernate.type.SqlTypes;
1213

1314
import java.io.Serializable;
1415

@@ -26,6 +27,8 @@ public class ProfileUpdateDTO implements Serializable {
2627

2728
@Size(max = 255)
2829
@NotBlank(message = "Gender cannot be empty.")
30+
@ValidGender
31+
@JsonDeserialize(using = GenderDeserializer.class)
2932
String gender;
3033

3134
@Size(max = 255, message = "GitLab username should be shorter than 255 characters")
@@ -35,7 +38,6 @@ public class ProfileUpdateDTO implements Serializable {
3538
@Email(message = "Email should be valid.")
3639
String email;
3740

38-
@JdbcTypeCode(SqlTypes.ARRAY)
3941
@Enumerated(EnumType.STRING)
4042
DietaryPreference[] dietTypes;
4143
}

backend/src/main/java/com/itestra/eep/dtos/constraintSolver/ConstraintSolverDTO.java

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,12 @@
22

33
import com.fasterxml.jackson.annotation.JsonIgnore;
44
import com.fasterxml.jackson.annotation.JsonProperty;
5-
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
6-
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
7-
import com.itestra.eep.enums.DietaryPreference;
8-
import com.itestra.eep.serializers.DateDeserializer;
9-
import com.itestra.eep.serializers.DateSerializer;
105
import lombok.Getter;
116
import lombok.Setter;
127

138
import java.io.Serializable;
149
import java.time.LocalDate;
10+
import java.time.temporal.ChronoUnit;
1511
import java.util.UUID;
1612

1713

@@ -22,39 +18,40 @@ public class ConstraintSolverDTO implements Serializable {
2218
@JsonIgnore
2319
int guestCount;
2420

21+
@JsonIgnore
22+
LocalDate employeeEmploymentStartDate;
23+
2524
@JsonProperty("ProfileID")
2625
UUID profileId;
2726

28-
@JsonProperty("Anzahl")
29-
public int getGuestCount() {
30-
return guestCount + 1;
31-
}
32-
3327
@JsonProperty("Vorname")
3428
String employeeProfileName;
3529

3630
@JsonProperty("Nachname")
3731
String employeeProfileLastName;
3832

39-
@JsonProperty("Projekt")
40-
String project = "";
41-
4233
@JsonProperty("Geschlecht")
4334
String employeeProfileGender;
4435

4536
@JsonProperty("last neighborhood")
4637
UUID[] lastNeighbourhood;
4738

48-
DietaryPreference[] employeeProfileDietTypes;
49-
50-
@JsonSerialize(using = DateSerializer.class)
51-
@JsonDeserialize(using = DateDeserializer.class)
52-
@JsonProperty("Zugehörigkeit")
53-
LocalDate employeeEmploymentStartDate;
54-
5539
@JsonProperty("Standort")
5640
String employeeLocation = null;
5741

5842
@JsonProperty("TableNr")
5943
Object[] tableIds;
44+
45+
@JsonProperty("Anzahl")
46+
public int getGuestCount() {
47+
return guestCount + 1;
48+
}
49+
50+
@JsonProperty("Zugehörigkeit")
51+
public Integer getEmploymentDuration() {
52+
if (employeeEmploymentStartDate == null) {
53+
return null;
54+
}
55+
return (int) ChronoUnit.MONTHS.between(employeeEmploymentStartDate, LocalDate.now());
56+
}
6057
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.itestra.eep.enums;
2+
3+
import java.util.Arrays;
4+
import java.util.Map;
5+
import java.util.stream.Collectors;
6+
7+
public enum Gender {
8+
9+
MALE(new String[]{"MALE", "M"}),
10+
FEMALE(new String[]{"FEMALE", "F", "W"}),
11+
DIVERSE(new String[]{"DIVERSE", "D"});
12+
13+
private final String[] values;
14+
private static final Map<String, Gender> LOOKUP_MAP;
15+
16+
17+
static {
18+
LOOKUP_MAP = Arrays.stream(Gender.values())
19+
.flatMap(gender -> Arrays.stream(gender.values)
20+
.map(value -> Map.entry(value.toUpperCase(), gender)))
21+
.collect(Collectors.toMap(
22+
Map.Entry::getKey,
23+
Map.Entry::getValue,
24+
(existing, replacement) -> existing
25+
));
26+
}
27+
28+
Gender(String[] values) {
29+
this.values = values;
30+
}
31+
32+
public static Gender fromStringOrNull(String value) {
33+
if (value == null || value.trim().isEmpty()) {
34+
return null;
35+
}
36+
return LOOKUP_MAP.get(value.trim().toUpperCase());
37+
}
38+
}

backend/src/main/java/com/itestra/eep/mappers/EmployeeParticipationMapper.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ public interface EmployeeParticipationMapper {
1919
@Mapping(source = "employee.profile.name", target = "employeeProfileName")
2020
@Mapping(source = "employee.profile.lastName", target = "employeeProfileLastName")
2121
@Mapping(source = "employee.profile.gender", target = "employeeProfileGender")
22-
@Mapping(source = "employee.profile.dietTypes", target = "employeeProfileDietTypes")
2322
@Mapping(source = "employee.employmentStartDate", target = "employeeEmploymentStartDate")
2423
@Mapping(source = "employee.location", target = "employeeLocation")
2524
@Mapping(target = "lastNeighbourhood", expression = "java(findPreviouslyMatchedEmployeeIds(employeeParticipation))")

backend/src/main/java/com/itestra/eep/models/Employee.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@
1717
@NoArgsConstructor
1818
@Table(name = "employee", schema = "organization")
1919
@AllArgsConstructor
20-
@NamedEntityGraph(name = "Employee.profile_participations",
21-
attributeNodes = {@NamedAttributeNode("profile"), @NamedAttributeNode("participations")}
22-
)
2320
public class Employee {
2421

2522
@Id

backend/src/main/java/com/itestra/eep/models/Event.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@
1818
@Builder
1919
@NoArgsConstructor
2020
@AllArgsConstructor
21-
@NamedEntityGraph(name = "Event.files_schematics",
22-
attributeNodes = {@NamedAttributeNode("fileEntities"), @NamedAttributeNode("schematics")}
23-
)
2421
public class Event {
2522

2623
@Id

backend/src/main/java/com/itestra/eep/repositories/EmployeeRepository.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515
public interface EmployeeRepository extends JpaRepository<Employee, UUID> {
1616

1717
@Override
18-
@EntityGraph("Employee.profile_participations")
1918
@NonNull
19+
@EntityGraph(attributePaths = {"profile", "participations", "participationCount"})
2020
Optional<Employee> findById(@NonNull UUID id);
2121

22-
@EntityGraph("Employee.profile_participations")
22+
@EntityGraph(attributePaths = {"profile.authorities", "participations", "participationCount"})
2323
List<Employee> findAllByOrderByProfileNameAsc();
2424

25-
@EntityGraph(attributePaths = {"profile"})
25+
@EntityGraph(attributePaths = {"profile.authorities", "participations", "participationCount"})
2626
List<Employee> findByProfileEmailIn(Set<String> profile_email);
2727

2828
}

backend/src/main/java/com/itestra/eep/repositories/EventRepository.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@ public interface EventRepository extends JpaRepository<Event, UUID> {
2727
@EntityGraph(attributePaths = {"employeeParticipations.employee.previousMatches"})
2828
Optional<Event> findByIdJoinedWithPreviousMatches(UUID id);
2929

30-
@EntityGraph("Event.files_schematics")
30+
31+
@EntityGraph(attributePaths = {"schematics", "fileEntities"})
3132
List<Event> findAllByDateAfter(LocalDateTime dateAfter);
3233

33-
@EntityGraph("Event.files_schematics")
34+
@EntityGraph(attributePaths = {"schematics", "fileEntities"})
3435
List<Event> findByDateAfterAndVisitorParticipations_Profile_Id(LocalDateTime from, UUID participantId);
3536

3637
@Lock(LockModeType.PESSIMISTIC_WRITE)
@@ -72,20 +73,22 @@ public interface EventRepository extends JpaRepository<Event, UUID> {
7273
List<SeatAllocationDetailsDTO> findCurrentSeatAllocationsByEventId(@Param("eventId") UUID eventId);
7374

7475

75-
@EntityGraph(attributePaths = {
76-
"employeeParticipations.employee.profile.authorities",
77-
"visitorParticipations.profile.authorities"})
7876
@Query("""
7977
SELECT p.employee.profile
8078
FROM Event e
8179
JOIN e.employeeParticipations p
80+
JOIN p.employee emp
81+
JOIN emp.profile prof
82+
LEFT JOIN FETCH prof.authorities
8283
WHERE e.id = :eventId
8384
8485
UNION
8586
8687
SELECT v.profile
8788
FROM Event e
8889
JOIN e.visitorParticipations v
90+
JOIN v.profile prof
91+
LEFT JOIN FETCH prof.authorities
8992
WHERE e.id = :eventId
9093
""")
9194
List<Profile> findAllParticipantProfilesByEventId(@Param("eventId") UUID eventId);

0 commit comments

Comments
 (0)