Skip to content

Commit b410912

Browse files
committed
increase logging for duplicates
1 parent 6fac30d commit b410912

File tree

5 files changed

+63
-9
lines changed

5 files changed

+63
-9
lines changed

api/src/main/java/ca/bc/gov/educ/studentdatacollection/api/controller/v1/CollectionController.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,11 @@ public MonitorIndySdcSchoolCollectionsResponse getMonitorIndySdcSchoolCollection
131131

132132
@Override
133133
public List<String> findDuplicatesInCollection(UUID collectionID, List<String> matchedAssignedIDs) {
134-
return this.collectionService.findDuplicatesInCollection(collectionID, matchedAssignedIDs);
134+
long startTime = System.currentTimeMillis();
135+
log.info("CollectionController::findDuplicatesInCollection: Received request for collectionID :: {} with {} assignedIDs", collectionID, matchedAssignedIDs.size());
136+
List<String> result = this.collectionService.findDuplicatesInCollection(collectionID, matchedAssignedIDs);
137+
log.info("CollectionController::findDuplicatesInCollection: Completed in {} ms for collectionID :: {}. Returned {} duplicates", System.currentTimeMillis() - startTime, collectionID, result.size());
138+
return result;
135139
}
136140

137141
private void validatePayload(Supplier<List<FieldError>> validator) {

api/src/main/java/ca/bc/gov/educ/studentdatacollection/api/controller/v1/SdcDistrictCollectionController.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@
2020
import org.springframework.data.jpa.domain.Specification;
2121
import org.springframework.http.ResponseEntity;
2222
import org.springframework.web.bind.annotation.RestController;
23+
import lombok.extern.slf4j.Slf4j;
2324

2425
import java.util.ArrayList;
2526
import java.util.List;
2627
import java.util.UUID;
2728
import java.util.concurrent.CompletableFuture;
2829

2930
@RestController
31+
@Slf4j
3032
public class SdcDistrictCollectionController implements SdcDistrictCollectionEndpoint {
3133

3234
private static final SdcDistrictCollectionMapper mapper = SdcDistrictCollectionMapper.mapper;
@@ -57,7 +59,11 @@ public List<SdcDuplicate> getDistrictCollectionDuplicates(UUID sdcDistrictCollec
5759

5860
@Override
5961
public List<SdcDuplicate> getDistrictCollectionProvincialDuplicates(UUID sdcDistrictCollectionID) {
60-
return this.sdcDuplicatesService.getAllProvincialDuplicatesBySdcDistrictCollectionID(sdcDistrictCollectionID).stream().map(duplicateMapper::toSdcDuplicate).toList();
62+
long startTime = System.currentTimeMillis();
63+
log.info("getDistrictCollectionProvincialDuplicates: Received request for sdcDistrictCollectionID :: {}", sdcDistrictCollectionID);
64+
List<SdcDuplicate> result = this.sdcDuplicatesService.getAllProvincialDuplicatesBySdcDistrictCollectionID(sdcDistrictCollectionID).stream().map(duplicateMapper::toSdcDuplicate).toList();
65+
log.info("getDistrictCollectionProvincialDuplicates: Completed in {} ms for sdcDistrictCollectionID :: {}. Returned {} duplicates", System.currentTimeMillis() - startTime, sdcDistrictCollectionID, result.size());
66+
return result;
6167
}
6268

6369
@Override

api/src/main/java/ca/bc/gov/educ/studentdatacollection/api/controller/v1/SdcDuplicateController.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,11 @@ public ResponseEntity<Void> markPENForReview(SdcSchoolCollectionStudent sdcSchoo
6363

6464
@Override
6565
public List<SdcDuplicate> getSchoolCollectionProvincialDuplicates(UUID sdcSchoolCollectionID) {
66-
return this.sdcDuplicatesService.getAllProvincialDuplicatesBySdcSchoolCollectionID(sdcSchoolCollectionID).stream().map(duplicateMapper::toSdcDuplicate).toList();
66+
long startTime = System.currentTimeMillis();
67+
log.info("getSchoolCollectionProvincialDuplicates: Received request for sdcSchoolCollectionID :: {}", sdcSchoolCollectionID);
68+
List<SdcDuplicate> result = this.sdcDuplicatesService.getAllProvincialDuplicatesBySdcSchoolCollectionID(sdcSchoolCollectionID).stream().map(duplicateMapper::toSdcDuplicate).toList();
69+
log.info("getSchoolCollectionProvincialDuplicates: Completed in {} ms for sdcSchoolCollectionID :: {}. Returned {} duplicates", System.currentTimeMillis() - startTime, sdcSchoolCollectionID, result.size());
70+
return result;
6771
}
6872

6973
@Override

api/src/main/java/ca/bc/gov/educ/studentdatacollection/api/service/v1/CollectionService.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import ca.bc.gov.educ.studentdatacollection.api.util.TransformUtil;
1919
import lombok.AccessLevel;
2020
import lombok.Getter;
21+
import lombok.extern.slf4j.Slf4j;
2122
import org.springframework.beans.factory.annotation.Autowired;
2223
import org.springframework.stereotype.Service;
2324
import org.springframework.transaction.annotation.Propagation;
@@ -26,6 +27,7 @@
2627
import java.util.*;
2728

2829
@Service
30+
@Slf4j
2931
public class CollectionService {
3032

3133
@Getter(AccessLevel.PRIVATE)
@@ -209,9 +211,14 @@ private boolean isStatusConfirmed(String statusCode, String... confirmedStatuses
209211
}
210212

211213
public List<String> findDuplicatesInCollection(UUID collectionID, List<String> matchedAssignedIDs) {
214+
long startTime = System.currentTimeMillis();
215+
log.info("CollectionService::findDuplicatesInCollection: Starting for collectionID :: {} with {} assignedIDs", collectionID, matchedAssignedIDs.size());
212216
List<UUID> matchedAssignedUUIDs = matchedAssignedIDs.stream().map(UUID::fromString).toList();
213217
List<SdcSchoolCollectionStudentEntity> duplicateStudents = sdcSchoolCollectionStudentRepository.findAllDuplicateStudentsByCollectionID(collectionID, matchedAssignedUUIDs);
214-
return duplicateStudents.stream().map(s -> s.getAssignedStudentId().toString()).toList();
218+
log.info("CollectionService::findDuplicatesInCollection: DB query took {} ms, found {} duplicate students for collectionID :: {}", System.currentTimeMillis() - startTime, duplicateStudents.size(), collectionID);
219+
List<String> result = duplicateStudents.stream().map(s -> s.getAssignedStudentId().toString()).toList();
220+
log.info("CollectionService::findDuplicatesInCollection: Completed in {} ms for collectionID :: {}", System.currentTimeMillis() - startTime, collectionID);
221+
return result;
215222
}
216223

217224
public List<SdcSchoolCollectionEntity> getSchoolCollectionsInCollection(UUID collectionID){

api/src/main/java/ca/bc/gov/educ/studentdatacollection/api/service/v1/SdcDuplicatesService.java

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,26 @@ public List<SdcSchoolCollectionStudentLightEntity> findAllInProvinceDuplicateStu
7777
}
7878

7979
public List<SdcDuplicateEntity> getAllProvincialDuplicatesBySdcDistrictCollectionID(UUID sdcDistrictCollectionID) {
80+
long startTime = System.currentTimeMillis();
81+
log.info("getAllProvincialDuplicatesBySdcDistrictCollectionID: Starting provincial duplicates retrieval for sdcDistrictCollectionID :: {}", sdcDistrictCollectionID);
8082
var districtCollection = sdcDistrictCollectionRepository.findById(sdcDistrictCollectionID).orElseThrow(() -> new EntityNotFoundException(SdcDistrictCollectionEntity.class, "sdcDistrictCollectionEntity", sdcDistrictCollectionID.toString()));
83+
84+
long idQueryStart = System.currentTimeMillis();
8185
List<UUID> ids = sdcSchoolCollectionStudentRepository.findAllInProvinceDuplicateStudentIdsInSdcDistrictCollection(districtCollection.getCollectionEntity().getCollectionID(), sdcDistrictCollectionID);
86+
log.info("getAllProvincialDuplicatesBySdcDistrictCollectionID: DB query findAllInProvinceDuplicateStudentIdsInSdcDistrictCollection took {} ms, found {} IDs for sdcDistrictCollectionID :: {}", System.currentTimeMillis() - idQueryStart, ids.size(), sdcDistrictCollectionID);
87+
88+
List<SdcSchoolCollectionStudentLightEntity> provinceDupes;
89+
if (ids.isEmpty()) {
90+
provinceDupes = List.of();
91+
} else {
92+
long entityQueryStart = System.currentTimeMillis();
93+
provinceDupes = sdcSchoolCollectionStudentLightRepository.findAllById(ids);
94+
log.info("getAllProvincialDuplicatesBySdcDistrictCollectionID: DB query findAllById took {} ms, fetched {} light entities for sdcDistrictCollectionID :: {}", System.currentTimeMillis() - entityQueryStart, provinceDupes.size(), sdcDistrictCollectionID);
95+
}
8296

83-
List<SdcSchoolCollectionStudentLightEntity> provinceDupes = ids.isEmpty()
84-
? List.of()
85-
: sdcSchoolCollectionStudentLightRepository.findAllById(ids);
86-
97+
long generateStart = System.currentTimeMillis();
8798
var dupes = generateFinalDuplicatesSet(provinceDupes, DuplicateLevelCode.PROVINCIAL);
99+
log.info("getAllProvincialDuplicatesBySdcDistrictCollectionID: generateFinalDuplicatesSet took {} ms, produced {} duplicates for sdcDistrictCollectionID :: {}", System.currentTimeMillis() - generateStart, dupes.size(), sdcDistrictCollectionID);
88100

89101
var finalSet = new HashSet<SdcDuplicateEntity>();
90102
dupes.forEach(dupe -> {
@@ -95,14 +107,22 @@ public List<SdcDuplicateEntity> getAllProvincialDuplicatesBySdcDistrictCollectio
95107
});
96108
});
97109

110+
log.info("getAllProvincialDuplicatesBySdcDistrictCollectionID: Completed in {} ms for sdcDistrictCollectionID :: {}. Total duplicates found :: {}", System.currentTimeMillis() - startTime, sdcDistrictCollectionID, finalSet.size());
98111
return finalSet.stream().toList();
99112
}
100113

101114
public List<SdcDuplicateEntity> getAllProvincialDuplicatesBySdcSchoolCollectionID(UUID sdcSchoolCollectionID) {
115+
long startTime = System.currentTimeMillis();
116+
log.info("getAllProvincialDuplicatesBySdcSchoolCollectionID: Starting provincial duplicates retrieval for sdcSchoolCollectionID :: {}", sdcSchoolCollectionID);
102117
var schoolCollection = sdcSchoolCollectionRepository.findById(sdcSchoolCollectionID).orElseThrow(() -> new EntityNotFoundException(SdcSchoolCollectionEntity.class, "sdcSchoolCollectionEntity", sdcSchoolCollectionID.toString()));
118+
119+
long dbQueryStart = System.currentTimeMillis();
103120
List<SdcSchoolCollectionStudentLightEntity> provinceDupes = sdcSchoolCollectionStudentRepository.findAllInProvinceDuplicateStudentsInSdcSchoolCollection(schoolCollection.getCollectionEntity().getCollectionID(), sdcSchoolCollectionID);
121+
log.info("getAllProvincialDuplicatesBySdcSchoolCollectionID: DB query findAllInProvinceDuplicateStudentsInSdcSchoolCollection took {} ms, found {} students for sdcSchoolCollectionID :: {}", System.currentTimeMillis() - dbQueryStart, provinceDupes.size(), sdcSchoolCollectionID);
104122

123+
long generateStart = System.currentTimeMillis();
105124
var dupes = generateFinalDuplicatesSet(provinceDupes, DuplicateLevelCode.PROVINCIAL);
125+
log.info("getAllProvincialDuplicatesBySdcSchoolCollectionID: generateFinalDuplicatesSet took {} ms, produced {} duplicates for sdcSchoolCollectionID :: {}", System.currentTimeMillis() - generateStart, dupes.size(), sdcSchoolCollectionID);
106126

107127
var finalSet = new HashSet<SdcDuplicateEntity>();
108128
dupes.forEach(dupe -> {
@@ -113,6 +133,7 @@ public List<SdcDuplicateEntity> getAllProvincialDuplicatesBySdcSchoolCollectionI
113133
});
114134
});
115135

136+
log.info("getAllProvincialDuplicatesBySdcSchoolCollectionID: Completed in {} ms for sdcSchoolCollectionID :: {}. Total duplicates found :: {}", System.currentTimeMillis() - startTime, sdcSchoolCollectionID, finalSet.size());
116137
return finalSet.stream().toList();
117138
}
118139

@@ -205,7 +226,7 @@ public void generateAllProvincialDuplicates(UUID collectionID){
205226

206227
List<SdcSchoolCollectionStudentLightEntity> provinceDupes = findAllInProvinceDuplicateStudentsInCollection(collectionID);
207228

208-
List<SdcDuplicateEntity> finalDuplicatesSet = generateFinalDuplicatesSet(provinceDupes, DuplicateLevelCode.PROVINCIAL);
229+
List<SdcDuplicateEntity> finalDuplicatesSet = generateFinalDuplicatesSet(provinceDupes, DuplicateLevelCode.PROVINCIAL);
209230
sdcDuplicateRepository.saveAll(finalDuplicatesSet);
210231

211232
this.collectionRepository.updateCollectionStatus(collectionID, String.valueOf(CollectionStatus.PROVDUPES));
@@ -244,12 +265,17 @@ public void generateAllProvincialDuplicates(UUID collectionID){
244265
}
245266

246267
public List<SdcDuplicateEntity> generateFinalDuplicatesSet(List<SdcSchoolCollectionStudentLightEntity> duplicateStudentEntities, DuplicateLevelCode duplicateLevelCode) {
268+
long startTime = System.currentTimeMillis();
269+
log.info("generateFinalDuplicatesSet: Starting with {} students at level :: {}", duplicateStudentEntities.size(), duplicateLevelCode);
247270
HashMap<UUID, List<SdcSchoolCollectionStudentLightEntity>> groupedDups = new HashMap<>();
248271

249272
for (SdcSchoolCollectionStudentLightEntity student : duplicateStudentEntities) {
250273
groupedDups.computeIfAbsent(student.getAssignedStudentId(), k -> new ArrayList<>()).add(student);
251274
}
275+
log.info("generateFinalDuplicatesSet: Grouped into {} unique assigned student IDs in {} ms", groupedDups.size(), System.currentTimeMillis() - startTime);
276+
252277
List<SdcDuplicateEntity> finalDuplicatesSet = new ArrayList<>();
278+
int pairsChecked = 0;
253279

254280
for (List<SdcSchoolCollectionStudentLightEntity> group : groupedDups.values()) {
255281
for (int i = 0; i < group.size(); i++) {
@@ -258,10 +284,12 @@ public List<SdcDuplicateEntity> generateFinalDuplicatesSet(List<SdcSchoolCollect
258284
SdcSchoolCollectionStudentLightEntity entity2 = group.get(j);
259285
List<SdcDuplicateEntity> duplicateRecords = runDuplicatesCheck(duplicateLevelCode, entity1, entity2);
260286
finalDuplicatesSet.addAll(duplicateRecords);
287+
pairsChecked++;
261288
}
262289
}
263290
}
264291

292+
log.info("generateFinalDuplicatesSet: Completed in {} ms. Checked {} pairs, generated {} duplicate records at level :: {}", System.currentTimeMillis() - startTime, pairsChecked, finalDuplicatesSet.size(), duplicateLevelCode);
265293
return finalDuplicatesSet;
266294
}
267295

@@ -346,6 +374,7 @@ public Set<String> pluckEmailAddressesFromDistrict(List<EdxUser> edxUsers){
346374
}
347375

348376
public List<SdcDuplicateEntity> runDuplicatesCheck(DuplicateLevelCode level, SdcSchoolCollectionStudentLightEntity entity1, SdcSchoolCollectionStudentLightEntity entity2){
377+
long startTime = System.currentTimeMillis();
349378
List<SdcDuplicateEntity> dups = new ArrayList<>();
350379
SchoolTombstone schoolTombstone1 = restUtils.getSchoolBySchoolID(entity1.getSdcSchoolCollectionEntitySchoolID().toString()).orElseThrow(() ->
351380
new StudentDataCollectionAPIRuntimeException("School provided by ID " + entity1.getSdcSchoolCollectionEntitySchoolID() + "was not found - this is not expected"));
@@ -427,10 +456,13 @@ public List<SdcDuplicateEntity> runDuplicatesCheck(DuplicateLevelCode level, Sdc
427456
}
428457
}
429458

459+
log.debug("runDuplicatesCheck: Completed in {} ms for assignedStudentId :: {}. Found {} duplicates at level :: {}", System.currentTimeMillis() - startTime, entity1.getAssignedStudentId(), dups.size(), level);
430460
return dups;
431461
}
432462

433463
private List<SdcDuplicateEntity> generateProgramDuplicates(List<SdcDuplicateEntity> newDuplicates, SdcSchoolCollectionStudentLightEntity student1, SdcSchoolCollectionStudentLightEntity student2, DuplicateLevelCode level) {
464+
long startTime = System.currentTimeMillis();
465+
int initialSize = newDuplicates.size();
434466
List<String> student1Programs = validationRulesService.splitEnrolledProgramsString(student1.getEnrolledProgramCodes());
435467
List<String> student2Programs = validationRulesService.splitEnrolledProgramsString(student2.getEnrolledProgramCodes());
436468

@@ -461,6 +493,7 @@ private List<SdcDuplicateEntity> generateProgramDuplicates(List<SdcDuplicateEnti
461493
newDuplicates.add(generateDuplicateEntity(level, student1, student2, DuplicateTypeCode.PROGRAM, DuplicateSeverityCode.NON_ALLOWABLE, ProgramDuplicateTypeCode.CAREER, null));
462494
}
463495

496+
log.debug("generateProgramDuplicates: Completed in {} ms for assignedStudentId :: {}. Added {} program duplicates at level :: {}", System.currentTimeMillis() - startTime, student1.getAssignedStudentId(), newDuplicates.size() - initialSize, level);
464497
return newDuplicates;
465498
}
466499

0 commit comments

Comments
 (0)