from sqlalchemy.orm import Session from sqlalchemy import select, desc, or_ from app.models import SpaceObject, PairScore, PairScoreHistory, ScoringRun def upsert_space_object(db:Session,payload): obj=db.get(SpaceObject,payload["object_id"]) if obj: for k,v in payload.items(): setattr(obj,k,v) db.add(obj) else: db.add(SpaceObject(**payload)) def list_objects(db:Session,limit=100): return db.scalars(select(SpaceObject).limit(limit)).all() def get_object(db:Session,object_id): return db.get(SpaceObject,object_id) def save_pair_score(db:Session,payload): row=db.get(PairScore,payload["pair_id"]) if row: for k,v in payload.items(): setattr(row,k,v) db.add(row) else: db.add(PairScore(**payload)) def insert_pair_history(db:Session,payload): db.add(PairScoreHistory(**payload)) def list_high_risk_pairs(db:Session,limit=50): return db.scalars(select(PairScore).order_by(desc(PairScore.final_score)).limit(limit)).all() def get_pair(db:Session,pair_id): return db.get(PairScore,pair_id) def get_pair_history(db:Session,pair_id,limit=20): return db.scalars(select(PairScoreHistory).where(PairScoreHistory.pair_id==pair_id).order_by(desc(PairScoreHistory.created_at)).limit(limit)).all() def create_run(db:Session,payload): db.add(ScoringRun(**payload)) def latest_runs(db:Session,limit=10): return db.scalars(select(ScoringRun).order_by(desc(ScoringRun.created_at)).limit(limit)).all() def get_run(db:Session,run_id): return db.get(ScoringRun,run_id) def object_pairs(db:Session,object_id:str,limit=25): stmt=select(PairScore).where(or_(PairScore.primary_object_id==object_id, PairScore.secondary_object_id==object_id)).order_by(desc(PairScore.final_score)).limit(limit) return db.scalars(stmt).all() def pairs_in_same_shell(db:Session,shell_key:str,exclude_pair_id:str,limit=20): stmt=select(PairScore).where(PairScore.shell_key==shell_key, PairScore.pair_id!=exclude_pair_id).order_by(desc(PairScore.final_score)).limit(limit) return db.scalars(stmt).all()