diff options
| author | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-08-27 11:21:17 +0200 |
|---|---|---|
| committer | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-08-27 11:21:17 +0200 |
| commit | 825cf388b55a6c8441e02149749bb6e2968477c0 (patch) | |
| tree | e3394cef97aa43df9775a1465d3c99f386ce3a9b /ride/store.go | |
| parent | 366e7b0d671395c2ad32f85ee7706a592db69d15 (diff) | |
Extract climb detection into a dedicated climb package
Move climb detection, slope, and Cotacol scoring out of ride into a new
climb package that operates on a geometry-only Route (distances, elevations,
coords). Ride embeds climb.Route and keeps its timing and telemetry columns.
- climb.Detect returns []DetectedClimb (Climb + ride-absolute Start).
- Climb owns its sliced geometry; indices are local, with Start reported at
the detection boundary for absolute position.
- Detected bounds use core.Interval; freeRegions claim suppression fixed.
- ride no longer builds slices: ClimbFromDist/ClimbFromIndexes/climbFrom and
ride.Climb/Interval/Range are removed; rideanalysis, mountain_pass MatchClimb,
and web views are rewired to climb types.
- New internal/routetest builds climb.Route from the ride DSL; ridetest reuses
it and adds timestamps and telemetry.
- Tests moved to climb (synthetic detection and difficulty) and kept in ride
for GPX-example integration; ride.comparison detection coverage retained.
- mountain_pass.nearestCrossing now reuses geo.Nearest.
Diffstat (limited to 'ride/store.go')
| -rw-r--r-- | ride/store.go | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/ride/store.go b/ride/store.go index 2d022ad..b906b42 100644 --- a/ride/store.go +++ b/ride/store.go @@ -7,6 +7,7 @@ import ( "strings" "time" + "github.com/martinlehoux/biking_home/climb" "github.com/martinlehoux/kagamigo/kcore" ) @@ -57,8 +58,8 @@ func Save(db *sql.DB, r StoredRide) error { if err != nil { return fmt.Errorf("compute ride values for %q: %w", r.ExternalID, err) } - cotacolScore = Cotacol(parsed) - cotacolAlgorithmVersion = CotacolAlgorithmVersion + cotacolScore = climb.Cotacol(parsed.Distances, parsed.Elevations) + cotacolAlgorithmVersion = climb.CotacolAlgorithmVersion movingTimeS = int64(MovingTime(parsed) / time.Second) movingTimeAlgorithmVersion = MovingTimeAlgorithmVersion } @@ -151,7 +152,7 @@ func ListSorted(db *sql.DB, column SortColumn, descending bool) ([]StoredRide, e args = append(args, MovingTimeAlgorithmVersion) } else if isComputedSort(column) { query += "(cotacol_score IS NULL OR cotacol_algo_version IS NULL OR cotacol_algo_version <> ? OR distance_m <= 0) ASC, " - args = append(args, CotacolAlgorithmVersion) + args = append(args, climb.CotacolAlgorithmVersion) } query += expression + " " + direction + ", id DESC" rows, err := db.Query(query, args...) |
