import sys import os from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker # Add backend to path sys.path.append(os.path.join(os.getcwd(), 'backend')) from src.models.activity import Activity from src.models.segment_effort import SegmentEffort from src.models.segment import Segment from src.services.segment_matcher import SegmentMatcher from src.services.parsers import extract_activity_data # verify import works from src.utils.config import config # Setup DB engine = create_engine(config.DATABASE_URL) Session = sessionmaker(bind=engine) db = Session() def rematch_activity(garmin_activity_id): print(f"\n--- Rematching Segments for {garmin_activity_id} ---") activity = db.query(Activity).filter(Activity.garmin_activity_id == garmin_activity_id).first() if not activity: print(f"Activity {garmin_activity_id} not found.") return # Delete existing efforts deleted = db.query(SegmentEffort).filter(SegmentEffort.activity_id == activity.id).delete() db.commit() print(f"Deleted {deleted} existing efforts.") # Extract points (and full data implicitly used in matcher) # Matcher expects list of points for geometric match from src.services.parsers import extract_points_from_file points = extract_points_from_file(activity.file_content, activity.file_type) if not points: print("No points found.") return print(f"Loaded {len(points)} points. triggering match...") matcher = SegmentMatcher(db) efforts = matcher.match_activity(activity, points) print(f"Matched {len(efforts)} segments.") for eff in efforts: print(f" - Segment: {eff.segment_id} | Time: {eff.elapsed_time}s | HR: {eff.avg_hr} | Power: {eff.avg_power}") if __name__ == "__main__": rematch_activity("21249259141")