diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/FrontEndController.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/FrontEndController.java index c7ba4c0..c44818d 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/FrontEndController.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/FrontEndController.java @@ -111,4 +111,76 @@ public class FrontEndController { public static void getAboutPage(Context ctx) { ctx.render("about.ftl"); } + + /** + * Aggregiert für alle Reden die NLP‑Ergebnisse (Topics, POS, Named Entities, erste Sentiment‑Objekte) + * und liefert die zusammengefassten Daten an die Charts‑Ansicht. + * @param ctx Javalin Context zum Rendern der Seite mit den aggregierten Chart‑Daten + * Implementiert von Leon + */ + public static void getCharts(Context ctx) { + MongoCollection col = MongoPprUtils.getSpeechCollection(); + + List topicsPipeline = List.of( + Aggregates.match(Filters.exists("analysisResults.topics.0")), + Aggregates.unwind("$analysisResults.topics"), + Aggregates.group( + "$analysisResults.topics.topic", + Accumulators.sum("totalScore", "$analysisResults.topics.score") + ) + ); + List posPipeline = List.of( + Aggregates.match(Filters.exists("analysisResults.tokens")), + Aggregates.unwind("$analysisResults.tokens"), + Aggregates.group("$analysisResults.tokens.pos", Accumulators.sum("count", 1)) + ); + List nePipeline = List.of( + Aggregates.match(Filters.exists("analysisResults.namedEntities")), + Aggregates.unwind("$analysisResults.namedEntities"), + Aggregates.group("$analysisResults.namedEntities.type", Accumulators.sum("count", 1)) + ); + List sentimentsPipeline = List.of( + Aggregates.match(Filters.exists("analysisResults.sentiments")), + Aggregates.project(Projections.computed("firstSentiment", + new Document("$arrayElemAt", List.of("$analysisResults.sentiments", 0)))), + Aggregates.replaceRoot("$firstSentiment") + ); + + CompletableFuture> topicsF = CompletableFuture.supplyAsync(() -> col.aggregate(topicsPipeline).into(new ArrayList<>())); + CompletableFuture> posF = CompletableFuture.supplyAsync(() -> col.aggregate(posPipeline).into(new ArrayList<>())); + CompletableFuture> neF = CompletableFuture.supplyAsync(() -> col.aggregate(nePipeline).into(new ArrayList<>())); + CompletableFuture> sentF = CompletableFuture.supplyAsync(() -> col.aggregate(sentimentsPipeline).into(new ArrayList<>())); + + CompletableFuture.allOf(topicsF, posF, neF, sentF).join(); + + List aggregatedTopics = topicsF.join().stream() + .map(d -> new Topic(d.getString("_id"), d.getDouble("totalScore"), null)) + .collect(Collectors.toList()); + + List aggregatedPOS = posF.join().stream() + .map(d -> new Token(d.getString("_id"), String.valueOf(d.getInteger("count")), "")) + .collect(Collectors.toList()); + + Map> aggregatedNE = new HashMap<>(); + neF.join().forEach(d -> { + List entities = d.getList("entities", Document.class); + Map typeMap = (entities == null) + ? new HashMap<>() + : entities.stream() + .collect(Collectors.toMap( + e -> e.getString("text"), + e -> e.getInteger("count") + )); + aggregatedNE.put(d.getString("_id"), typeMap); + }); + + List aggregatedSentiments = Sentiment.readSentimentsFromMongo(sentF.join()); + + ctx.render("charts.ftl", Map.of( + "aggregatedTopics", aggregatedTopics, + "aggregatedPOS", aggregatedPOS, + "aggregatedNE", aggregatedNE, + "aggregatedSentiments", aggregatedSentiments + )); + } } diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandler.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandler.java index 9571bf6..6092e48 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandler.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/RESTHandler.java @@ -75,8 +75,6 @@ public class RESTHandler { // Charts app.get("/charts", FrontEndController::getCharts); - app.get("/about", FrontEndController::getAbout); - app.get("/export/pdf/speech/{id}", SpeechesLatexExportController::exportSpeech); // exportiere eine Rede als PDF app.get("/export/pdf/speech", SpeechesLatexExportController::exportSpeech); // exportiere eine Rede als PDF app.get("/export/pdf/speaker/{id}", SpeechesLatexExportController::exportSpeechesFromSpeaker); // exportiere alle Reden eines Parlamentariers als PDF