import sys import os sys.path.append('/app/backend') import logging from src.services.postgresql_manager import PostgreSQLManager from src.utils.config import config from src.models.activity import Activity from src.models.bike_setup import BikeSetup from sqlalchemy import or_, and_ logging.basicConfig(level=logging.WARNING) def analyze(): print("Connecting to database...") db_manager = PostgreSQLManager(config.DATABASE_URL) session = db_manager.SessionLocal() try: # 1. Find the Stormchaser setup(s) stormchasers = session.query(BikeSetup).filter( or_( BikeSetup.name.ilike('%Stormchaser%'), BikeSetup.frame.ilike('%Stormchaser%') ) ).order_by(BikeSetup.purchase_date.asc()).all() reference_date = None for bike in stormchasers: if bike.purchase_date: if reference_date is None or bike.purchase_date < reference_date: reference_date = bike.purchase_date if not reference_date: print("No Stormchaser purchase date found.") return print(f"Using Reference Date: {reference_date}") # 2. Find Generic Bike ID generic = session.query(BikeSetup).filter(BikeSetup.name == 'GenericBike').first() if not generic: print("GenericBike setup not found.") return # 3. Query Activities # Find Generic Rides in range query = session.query(Activity).filter( Activity.bike_setup_id == generic.id, Activity.start_time >= reference_date ) count = query.count() print(f"\nResult: {count} rides tagged as Generic since {reference_date}") # Also check smart confidence stats on recently matched Stormchaser rides print("\n[Smart Match Stats Sample (Stormchaser)]") sc_rides = session.query(Activity).filter( Activity.bike_setup_id.in_([b.id for b in stormchasers]), Activity.start_time >= reference_date ).order_by(Activity.start_time.desc()).limit(10).all() for r in sc_rides: print(f"ID: {r.id} | Conf: {r.bike_match_confidence} | Type: {r.activity_type}") except Exception as e: print(f"Error during analysis: {e}") finally: session.close() if __name__ == "__main__": analyze()