diff --git a/src/main/java/net/javahippie/fitpub/repository/ActivityRepository.java b/src/main/java/net/javahippie/fitpub/repository/ActivityRepository.java index 6b057d7..bf3ca87 100644 --- a/src/main/java/net/javahippie/fitpub/repository/ActivityRepository.java +++ b/src/main/java/net/javahippie/fitpub/repository/ActivityRepository.java @@ -20,6 +20,9 @@ import java.util.UUID; @Repository public interface ActivityRepository extends JpaRepository { + @Query("SELECT a.id FROM Activity a") + List findAllIds(); + /** * Find all activities for a specific user. * diff --git a/src/main/java/net/javahippie/fitpub/service/PeakDetectionService.java b/src/main/java/net/javahippie/fitpub/service/PeakDetectionService.java index 7763e50..6cb5de7 100644 --- a/src/main/java/net/javahippie/fitpub/service/PeakDetectionService.java +++ b/src/main/java/net/javahippie/fitpub/service/PeakDetectionService.java @@ -8,8 +8,6 @@ import net.javahippie.fitpub.model.entity.Peak; import net.javahippie.fitpub.repository.ActivityPeakRepository; import net.javahippie.fitpub.repository.ActivityRepository; import net.javahippie.fitpub.repository.PeakRepository; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -86,32 +84,37 @@ public class PeakDetectionService { } try { - log.info("Starting retroactive peak detection for all activities"); + // Fetch only IDs to avoid loading huge BLOB fields into memory + List activityIds = activityRepository.findAllIds(); + + log.info("Starting retroactive peak detection for {} activities", activityIds.size()); - int page = 0; - int pageSize = 100; int totalProcessed = 0; int totalPeaksFound = 0; - Page activityPage; - do { - activityPage = activityRepository.findAll(PageRequest.of(page, pageSize)); - for (Activity activity : activityPage.getContent()) { - try { - List peaks = detectPeaksForActivity(activity); - totalPeaksFound += peaks.size(); - totalProcessed++; - } catch (Exception e) { - log.warn("Failed peak detection for activity {}: {}", activity.getId(), e.getMessage()); + for (UUID activityId : activityIds) { + try { + Activity activity = activityRepository.findById(activityId).orElse(null); + if (activity == null) continue; + + List peaks = detectPeaksForActivity(activity); + totalPeaksFound += peaks.size(); + totalProcessed++; + + if (totalProcessed % 100 == 0) { + log.info("Peak backfill progress: processed {} / {} activities, found {} peaks so far", + totalProcessed, activityIds.size(), totalPeaksFound); } + } catch (Exception e) { + log.warn("Failed peak detection for activity {}: {}", activityId, e.getMessage(), e); + totalProcessed++; } - page++; - log.info("Peak backfill progress: processed {} / {} activities, found {} peaks so far", - totalProcessed, activityPage.getTotalElements(), totalPeaksFound); - } while (activityPage.hasNext()); + } log.info("Peak backfill complete: processed {} activities, found {} total peak associations", totalProcessed, totalPeaksFound); + } catch (Exception e) { + log.error("Peak backfill failed: {}", e.getMessage(), e); } finally { backfillRunning.set(false); }