1package com.example.graphql.resolvers;
2
3import com.example.graphql.models.Product;
4import com.example.graphql.models.Review;
5import com.example.graphql.models.User;
6import com.example.graphql.services.ProductService;
7import com.example.graphql.services.ReviewService;
8import com.example.graphql.services.UserService;
9
10import java.util.List;
11import java.util.ArrayList;
12import java.util.Map;
13import java.util.HashMap;
14
15public class AggregationResolver {
16
17private ProductService productService;
18private ReviewService reviewService;
19private UserService userService;
20
21public AggregationResolver(ProductService prodService, ReviewService revService, UserService userServ) {
22this.productService = prodService;
23this.reviewService = revService;
24this.userService = userServ;
25}
26
27
28
29
30
31
32
33public Map<String, Object> getProductWithAggregatedData(String productId) {
34Map<String, Object> result = new HashMap<>();
35
36
37Product product = productService.getProductById(productId);
38if (product == null) {
39
40System.err.println("Error: Product with ID " + productId + " not found.");
41return result;
42}
43result.put("product", product);
44
45
46List<Review> reviews = reviewService.getReviewsForProduct(productId);
47List<Map<String, Object>> aggregatedReviews = new ArrayList<>();
48
49if (reviews != null && !reviews.isEmpty()) {
50for (Review review : reviews) {
51Map<String, Object> reviewData = new HashMap<>();
52reviewData.put("id", review.getId());
53reviewData.put("rating", review.getRating());
54reviewData.put("comment", review.getComment());
55
56
57User author = userService.getUserById(review.getAuthorId());
58if (author != null) {
59Map<String, Object> authorInfo = new HashMap<>();
60authorInfo.put("id", author.getId());
61authorInfo.put("username", author.getUsername());
62reviewData.put("author", authorInfo);
63} else {
64
65System.err.println("Warning: Author not found for review ID " + review.getId());
66reviewData.put("author", null);
67}
68aggregatedReviews.add(reviewData);
69}
70} else {
71
72System.out.println("Info: No reviews found for product ID " + productId);
73}
74result.put("reviews", aggregatedReviews);
75
76
77double averageRating = calculateAverageRating(aggregatedReviews);
78result.put("averageRating", averageRating);
79
80return result;
81}
82
83
84
85
86
87
88
89private double calculateAverageRating(List<Map<String, Object>> aggregatedReviews) {
90if (aggregatedReviews == null || aggregatedReviews.isEmpty()) {
91return 0.0;
92}
93
94double totalRating = 0;
95int reviewCount = 0;
96
97for (Map<String, Object> reviewData : aggregatedReviews) {
98Object ratingObj = reviewData.get("rating");
99if (ratingObj instanceof Number) {
100totalRating += ((Number) ratingObj).doubleValue();
101reviewCount++;
102}
103}
104
105
106if (reviewCount == 0) {
107return 0.0;
108}
109
110return totalRating / reviewCount;
111}
112
113
114private static class ProductService {
115public Product getProductById(String id) { return new Product(id, "Sample Product"); }
116}
117private static class ReviewService {
118public List<Review> getReviewsForProduct(String productId) {
119List<Review> reviews = new ArrayList<>();
120if ("prod123".equals(productId)) {
121reviews.add(new Review("rev1", "prod123", "userA", 5, "Great!"));
122reviews.add(new Review("rev2", "prod123", "userB", 4, "Good."));
123}
124return reviews;
125}
126}
127private static class UserService {
128public User getUserById(String id) {
129Map<String, User> users = new HashMap<>();
130users.put("userA", new User("userA", "Alice"));
131users.put("userB", new User("userB", "Bob"));
132return users.get(id);
133}
134}
135
136
137private static class Product { String id; String name; Product(String id, String name) { this.id = id; this.name = name; } public String getId() { return id; } public String getName() { return name; } }
138private static class Review { String id; String productId; String authorId; int rating; String comment; Review(String id, String productId, String authorId, int rating, String comment) { this.id = id; this.productId = productId; this.authorId = authorId; this.rating = rating; this.comment = comment; } public String getId() { return id; } public String getProductId() { return productId; } public String getAuthorId() { return authorId; } public int getRating() { return rating; } public String getComment() { return comment; } }
139private static class User { String id; String username; User(String id, String username) { this.id = id; this.username = username; } public String getId() { return id; } public String getUsername() { return username; } }
140}