from sqlalchemy import func from backend.app.db.models.recommendations import Plan, PlanRecommendations, Recommendation from backend.app.db.models.portfolio import Portfolio def aggregate_portfolio_recommendations(session, portfolio_id: int): # Aggregate multiple fields aggregates = ( session.query( func.sum(Recommendation.estimated_cost).label("cost"), # For future usage we will aggregate multiple fields in this step # func.sum(Recommendation.heat_demand).label("total_heat_demand"), # func.sum(Recommendation.energy_savings).label("total_energy_savings") ) .join(PlanRecommendations, PlanRecommendations.recommendation_id == Recommendation.id) .join(Plan, Plan.id == PlanRecommendations.plan_id) .filter(Plan.portfolio_id == portfolio_id, Plan.is_default == True, Recommendation.default == True) .one() ) aggregates_dict = { "cost": aggregates.cost or 0, # "total_heat_demand": aggregates.total_heat_demand or 0, # "total_energy_savings": aggregates.total_energy_savings or 0 } # Get the portfolio and update the fields portfolio = session.query(Portfolio).filter_by(id=portfolio_id).one() # Update the data for key, value in aggregates_dict.items(): setattr(portfolio, key, value) # Merge the updated portfolio back into the session session.merge(portfolio) session.flush()