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

Commit 4effb2d

Browse files
author
ge85riz
committed
⚡️ perf: batch database operations while performing Table Based Seat Allocation
Replace "individual DB calls" with "batch operations" for seat creation, seat allocation, and previous matching insertion to reduce round trips
1 parent 32939c6 commit 4effb2d

11 files changed

Lines changed: 277 additions & 135 deletions
Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,33 @@
11
package com.itestra.eep.repositories;
22

33
import com.itestra.eep.models.Chair;
4+
import com.itestra.eep.repositories.custom.ChairRepositoryCustom;
45
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.springframework.data.jpa.repository.Modifying;
7+
import org.springframework.data.jpa.repository.Query;
8+
import org.springframework.data.repository.query.Param;
59
import org.springframework.stereotype.Repository;
610

711
import java.util.UUID;
812

913
@Repository
10-
public interface ChairRepository extends JpaRepository<Chair, UUID> {
14+
public interface ChairRepository extends JpaRepository<Chair, UUID>, ChairRepositoryCustom {
15+
16+
@Modifying
17+
@Query("UPDATE EmployeeParticipation p SET p.chair.id = :chairId WHERE p.id = :participationId")
18+
void updateEmployeeParticipationChairId(@Param("participationId") UUID participationId, @Param("chairId") UUID chairId);
19+
20+
@Modifying
21+
@Query("UPDATE VisitorParticipation v SET v.chair.id = :chairId WHERE v.id = :participationId")
22+
void updateVisitorParticipationChairId(@Param("participationId") UUID participationId, @Param("chairId") UUID chairId);
23+
24+
@Modifying
25+
@Query("UPDATE EmployeeParticipation ep SET ep.chair.id = null WHERE ep.eventId = :eventId")
26+
void unsetAllEmployeeParticipationChairsByEventId(@Param("eventId") UUID eventId);
27+
28+
@Modifying
29+
@Query("UPDATE VisitorParticipation vp SET vp.chair.id = null WHERE vp.eventId = :eventId")
30+
void unsetAllVisitorParticipationChairsByEventId(@Param("eventId") UUID eventId);
31+
1132

1233
}

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

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
import com.itestra.eep.models.Event;
55
import com.itestra.eep.models.Profile;
66
import jakarta.persistence.LockModeType;
7-
import org.springframework.data.jpa.repository.*;
7+
import org.springframework.data.jpa.repository.EntityGraph;
8+
import org.springframework.data.jpa.repository.JpaRepository;
9+
import org.springframework.data.jpa.repository.Lock;
10+
import org.springframework.data.jpa.repository.Query;
811
import org.springframework.data.repository.query.Param;
912
import org.springframework.stereotype.Repository;
1013

@@ -34,22 +37,6 @@ public interface EventRepository extends JpaRepository<Event, UUID> {
3437
@Query("SELECT e FROM Event e WHERE e.id = :id")
3538
Optional<Event> findByIdWithUpdateLock(@Param("id") UUID id);
3639

37-
@Modifying
38-
@Query("UPDATE EmployeeParticipation p SET p.chair.id = :chairId WHERE p.id = :participationId")
39-
void updateEmployeeParticipationChairId(@Param("participationId") UUID participationId, @Param("chairId") UUID chairId);
40-
41-
@Modifying
42-
@Query("UPDATE VisitorParticipation v SET v.chair.id = :chairId WHERE v.id = :participationId")
43-
void updateVisitorParticipationChairId(@Param("participationId") UUID participationId, @Param("chairId") UUID chairId);
44-
45-
@Modifying
46-
@Query("UPDATE EmployeeParticipation ep SET ep.chair.id = null WHERE ep.eventId = :eventId")
47-
void unsetAllEmployeeParticipationChairsByEventId(@Param("eventId") UUID eventId);
48-
49-
@Modifying
50-
@Query("UPDATE VisitorParticipation vp SET vp.chair.id = null WHERE vp.eventId = :eventId")
51-
void unsetAllVisitorParticipationChairsByEventId(@Param("eventId") UUID eventId);
52-
5340
@Query("""
5441
SELECT new com.itestra.eep.dtos.SeatAllocationDetailsDTO(
5542
p.employee.profile,

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.itestra.eep.repositories;
22

33
import com.itestra.eep.models.PreviousMatch;
4+
import com.itestra.eep.repositories.custom.PreviousMatchesRepositoryCustom;
45
import org.springframework.data.jpa.repository.JpaRepository;
56
import org.springframework.data.jpa.repository.Modifying;
67
import org.springframework.data.jpa.repository.Query;
@@ -9,7 +10,7 @@
910
import java.util.UUID;
1011

1112
@Repository
12-
public interface PreviousMatchesRepository extends JpaRepository<PreviousMatch, PreviousMatch.PreviousMatchId> {
13+
public interface PreviousMatchesRepository extends JpaRepository<PreviousMatch, PreviousMatch.PreviousMatchId>, PreviousMatchesRepositoryCustom {
1314

1415
@Modifying(clearAutomatically = true)
1516
@Query("delete from PreviousMatch p where p.id.eventId = ?1")

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@
77
import org.springframework.stereotype.Repository;
88

99
import java.time.LocalDateTime;
10-
import java.util.List;
1110
import java.util.Optional;
12-
import java.util.Set;
1311
import java.util.UUID;
1412

1513
@Repository
@@ -18,7 +16,4 @@ public interface VisitorParticipationRepository extends JpaRepository<VisitorPar
1816
@Query("select v.profile from VisitorParticipation v where v.accessLink = ?1 and v.event.date >= ?2")
1917
Optional<Profile> findByAccessLink(String accessLink, LocalDateTime now);
2018

21-
@Query("select e.id from VisitorParticipation e where e.id in ?1")
22-
Set<UUID> findExistingVisitorParticipationIdsIn(List<UUID> ids);
23-
2419
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.itestra.eep.repositories.custom;
2+
3+
import com.itestra.eep.models.Chair;
4+
import org.springframework.stereotype.Repository;
5+
6+
import java.util.List;
7+
import java.util.Map;
8+
import java.util.UUID;
9+
10+
@Repository
11+
public interface ChairRepositoryCustom {
12+
13+
void batchInsertChair(List<Chair> chairs);
14+
15+
void batchUpdateEmployeeParticipationsChairAssignments(Map<UUID, UUID> participationToChairMap);
16+
17+
void batchUpdateVisitorParticipationsChairAssignments(Map<UUID, UUID> participationToChairMap);
18+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.itestra.eep.repositories.custom;
2+
3+
import com.itestra.eep.models.PreviousMatch;
4+
import org.springframework.stereotype.Repository;
5+
6+
import java.util.List;
7+
8+
@Repository
9+
public interface PreviousMatchesRepositoryCustom {
10+
11+
void batchInsertPreviousMatches(List<PreviousMatch> matches);
12+
13+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package com.itestra.eep.repositories.custom.impl;
2+
3+
import com.itestra.eep.models.Chair;
4+
import com.itestra.eep.repositories.custom.ChairRepositoryCustom;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.jdbc.core.JdbcTemplate;
7+
import org.springframework.stereotype.Repository;
8+
9+
import java.sql.PreparedStatement;
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
import java.util.Map;
13+
import java.util.UUID;
14+
15+
@Repository
16+
@RequiredArgsConstructor
17+
public class ChairRepositoryCustomImpl implements ChairRepositoryCustom {
18+
19+
private final JdbcTemplate jdbcTemplate;
20+
21+
@Override
22+
public void batchInsertChair(List<Chair> chairs) {
23+
if (chairs.isEmpty()) {
24+
return;
25+
}
26+
27+
String sql = """
28+
INSERT INTO organization.chair
29+
(id, event_id)
30+
VALUES (?, ?)
31+
ON CONFLICT DO NOTHING
32+
""";
33+
34+
jdbcTemplate.batchUpdate(sql, chairs, chairs.size(),
35+
(PreparedStatement ps, Chair chair) -> {
36+
ps.setObject(1, chair.getId());
37+
ps.setObject(2, chair.getEvent().getId());
38+
});
39+
}
40+
41+
@Override
42+
public void batchUpdateEmployeeParticipationsChairAssignments(Map<UUID, UUID> participationToChairMap) {
43+
if (participationToChairMap.isEmpty()) {
44+
return;
45+
}
46+
47+
String sql = """
48+
UPDATE organization.employee_participation
49+
SET chair_id = ?
50+
WHERE id = ?
51+
""";
52+
53+
handleInsert(participationToChairMap, sql);
54+
}
55+
56+
@Override
57+
public void batchUpdateVisitorParticipationsChairAssignments(Map<UUID, UUID> participationToChairMap) {
58+
if (participationToChairMap.isEmpty()) {
59+
return;
60+
}
61+
62+
String sql = """
63+
UPDATE organization.visitor_participation
64+
SET chair_id = ?
65+
WHERE id = ?
66+
""";
67+
68+
handleInsert(participationToChairMap, sql);
69+
}
70+
71+
private void handleInsert(Map<UUID, UUID> participationToChairMap, String sql) {
72+
List<Map.Entry<UUID, UUID>> entries = new ArrayList<>(participationToChairMap.entrySet());
73+
74+
jdbcTemplate.batchUpdate(sql, entries, entries.size(),
75+
(PreparedStatement ps, Map.Entry<UUID, UUID> entry) -> {
76+
ps.setObject(1, entry.getValue()); // chairId
77+
ps.setObject(2, entry.getKey()); // participationId
78+
});
79+
}
80+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.itestra.eep.repositories.custom.impl;
2+
3+
import com.itestra.eep.models.PreviousMatch;
4+
import com.itestra.eep.repositories.custom.PreviousMatchesRepositoryCustom;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.jdbc.core.JdbcTemplate;
7+
import org.springframework.stereotype.Repository;
8+
9+
import java.sql.PreparedStatement;
10+
import java.util.List;
11+
12+
@Repository
13+
@RequiredArgsConstructor
14+
public class PreviousMatchesRepositoryCustomImpl implements PreviousMatchesRepositoryCustom {
15+
16+
private final JdbcTemplate jdbcTemplate;
17+
18+
@Override
19+
public void batchInsertPreviousMatches(List<PreviousMatch> matches) {
20+
if (matches.isEmpty()) {
21+
return;
22+
}
23+
24+
String sql = """
25+
INSERT INTO organization.previous_matches
26+
(first_employee_id, second_employee_id, event_id)
27+
VALUES (?, ?, ?)
28+
ON CONFLICT DO NOTHING
29+
""";
30+
31+
jdbcTemplate.batchUpdate(sql, matches, matches.size(),
32+
(PreparedStatement ps, PreviousMatch match) -> {
33+
ps.setObject(1, match.getId().getFirstEmployeeId());
34+
ps.setObject(2, match.getId().getSecondEmployeeId());
35+
ps.setObject(3, match.getId().getEventId());
36+
});
37+
}
38+
39+
}

backend/src/main/java/com/itestra/eep/services/SeatAllocationService.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,8 @@ public interface SeatAllocationService {
1212

1313
List<SeatAllocationDetailsDTO> getSeatAllocations(UUID eventId);
1414

15-
<T extends Participation> void assignParticipantToChair(UUID participationId, UUID chairId, UUID eventId, Class<T> participationClass);
16-
17-
<T extends Participation> void assignParticipantToChairAndPersistNewNeighbors(UUID participationId, UUID chairId, UUID eventId,
18-
Class<T> participationClass, UUID[] neighborProfileIds);
15+
<T extends Participation> void assignOneParticipantToChairAndPersistNewNeighbors(UUID participationId, UUID chairId, UUID eventId,
16+
Class<T> participationClass, UUID[] neighborProfileIds);
1917

2018
void performTableBasedSeatAllocation(UUID eventId, StageMapDTO stageMap) throws IOException, InterruptedException;
2119
}

0 commit comments

Comments
 (0)