mirror of
https://github.com/Freika/dawarich.git
synced 2026-01-10 17:21:38 -05:00
54 lines
1.6 KiB
Ruby
54 lines
1.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Point loading strategy for bulk track generation from existing GPS points.
|
|
#
|
|
# This loader retrieves all valid points for a user within an optional time range,
|
|
# suitable for regenerating all tracks at once or processing historical data.
|
|
#
|
|
# How it works:
|
|
# 1. Queries all points belonging to the user
|
|
# 2. Filters out points without valid coordinates or timestamps
|
|
# 3. Optionally filters by start_at/end_at time range if provided
|
|
# 4. Returns points ordered by timestamp for sequential processing
|
|
#
|
|
# Used primarily for:
|
|
# - Initial track generation when a user first enables tracks
|
|
# - Bulk regeneration of all tracks after settings changes
|
|
# - Processing historical data imports
|
|
#
|
|
# The loader is designed to be efficient for large datasets while ensuring
|
|
# data integrity by filtering out invalid points upfront.
|
|
#
|
|
# Example usage:
|
|
# loader = Tracks::PointLoaders::BulkLoader.new(user, start_at: 1.week.ago, end_at: Time.current)
|
|
# points = loader.load_points
|
|
#
|
|
module Tracks
|
|
module PointLoaders
|
|
class BulkLoader
|
|
attr_reader :user, :start_at, :end_at
|
|
|
|
def initialize(user, start_at: nil, end_at: nil)
|
|
@user = user
|
|
@start_at = start_at
|
|
@end_at = end_at
|
|
end
|
|
|
|
def load_points
|
|
scope = Point.where(user: user)
|
|
.where.not(lonlat: nil)
|
|
.where.not(timestamp: nil)
|
|
|
|
if start_at.present?
|
|
scope = scope.where('timestamp >= ?', start_at)
|
|
end
|
|
|
|
if end_at.present?
|
|
scope = scope.where('timestamp <= ?', end_at)
|
|
end
|
|
|
|
scope.order(:timestamp)
|
|
end
|
|
end
|
|
end
|
|
end
|