from Controllers.Postgres.engine import get_db, Base from Controllers.Postgres.schema import ( User, Order, Product, Supplier, ShippingAddress, Category, ) from sqlalchemy import func import time with get_db() as session: start_time = time.time() # Product table analysis max_price = session.query(func.max(Product.price)).scalar() min_price = session.query(func.min(Product.price)).scalar() avg_price = session.query(func.avg(Product.price)).scalar() print(f"product_prices Product Prices - Max: {max_price}, Min: {min_price}, Average: {avg_price}") # Supplier table analysis max_rating = session.query(func.max(Supplier.rating)).scalar() min_rating = session.query(func.min(Supplier.rating)).scalar() avg_rating = session.query(func.avg(Supplier.rating)).scalar() print(f"supplier_ratings Supplier Ratings - Max: {max_rating}, Min: {min_rating}, Average: {avg_rating}") # User table analysis max_balance = session.query(func.max(User.account_balance)).scalar() min_balance = session.query(func.min(User.account_balance)).scalar() avg_balance = session.query(func.avg(User.account_balance)).scalar() print(f"user_balances User Balances - Max: {max_balance}, Min: {min_balance}, Average: {avg_balance}") # Order table analysis max_order_amount = session.query(func.max(Order.order_date)).scalar() min_order_amount = session.query(func.min(Order.total_amount)).scalar() avg_order_amount = session.query(func.avg(Order.total_amount)).scalar() print(f"order_amounts Order Amounts - Max: {max_order_amount}, Min: {min_order_amount}, Average: {avg_order_amount}") # Example complex joins # Join User with Preferred Category and Last Ordered Product user_category_product = session.query(User.username, Category.name.label('preferred_category'), Product.name.label('last_product')) \ .join(Category, User.preferred_category_id == Category.id) \ .join(Product, User.last_ordered_product_id == Product.id) \ .all() print("\nUsers, their Preferred Category, and Last Ordered Product:") for user, category, product in user_category_product[0:5]: print(f"user_category_product User: {user}, Preferred Category: {category}, Last Product: {product}") # Join User with Orders and Shipping Address user_orders_shipping = session.query(User.username, Order.total_amount, ShippingAddress.city) \ .join(Order, User.id == Order.user_id) \ .join(ShippingAddress, Order.shipping_address_id == ShippingAddress.id) \ .all() print("\n Users, their Order Amounts, and Shipping City:") for user, amount, city in user_orders_shipping[0:5]: print(f"user_orders_shipping User: {user}, Order Amount: {amount}, Shipping City: {city}") # Join User with Preferred Category and Supplier Rating user_category_supplier = session.query(User.username, Category.name.label('preferred_category'), Supplier.rating.label('supplier_rating')) \ .join(Category, User.preferred_category_id == Category.id) \ .join(Supplier, User.supplier_rating_id == Supplier.id) \ .all() print("\nUsers, their Preferred Category, and Supplier Rating:") for user, category, rating in user_category_supplier[0:5]: print(f"user_category_supplier User: {user}, Preferred Category: {category}, Supplier Rating: {rating}") left_join_result = session.query(User.username, Category.name.label('preferred_category')) \ .outerjoin(Category, User.preferred_category_id == Category.id) \ .all() print("\nLeft Outer Join (All Users and their Preferred Categories):") for user, category in left_join_result[0:5]: print(f"left_join_result User: {user}, Preferred Category: {category}") right_join_result = session.query(User.username, Category.name.label('preferred_category')) \ .outerjoin(User, Category.id == User.preferred_category_id) \ .all() print("\nRight Outer Join (All Categories and the Users who Prefer Them):") for user, category in right_join_result[0:5]: print(f"right_join_result Category: {category}, User: {user}") end_time = time.time() print(f"Total time taken: {end_time - start_time} seconds")