From a071ad253fbebf6d4bce0fed6888f4e6002cde66 Mon Sep 17 00:00:00 2001 From: vysitor Date: Sun, 23 Mar 2025 00:32:01 +0100 Subject: [PATCH] Sped up loading all speeches, still slow --- .../gruppe_05_1/database/MongoPprUtils.java | 59 ++++++++++++------- .../rest/ParlamentarierController.java | 2 +- .../gruppe_05_1/rest/SpeechController.java | 4 ++ .../templates/showAllSpeechesList.ftl | 2 +- .../resources/templates/showSpeechesList.ftl | 2 +- 5 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoPprUtils.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoPprUtils.java index cfd5679..8e928a6 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoPprUtils.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/database/MongoPprUtils.java @@ -520,30 +520,46 @@ public class MongoPprUtils { * @return */ public static List getSpeechesMetadata(String filter) { - List speechMetaDataList = new ArrayList<>(); - List speeches = MongoPprUtils.getSpeeches(filter); - for (Speech speech : speeches) { - SpeechMetaData md = new SpeechMetaData(); - md.setSpeechKey(speech.getSpeechKey()); - md.setSpeechId(speech.getSpeechId()); - md.setSpeakerId(speech.getSpeakerId()); - md.setSpeakerName(speech.getSpeakerName()); - md.setFraktion(speech.getFraction()); - if (md.getFraktion() == null) {md.setFraktion(PPRUtils.PARTEILOS_KUERZEL);} - int sessionId = speech.getSessionId(); - md.setSessionId(sessionId); + MongoCursor cursor; - // aus "sessions" Collection - augmentSpeechMetaDataFromSession(sessionId, md); + if (filter== null || filter.isBlank()) { + cursor = getSpeechCollection().find().iterator(); + } else { + String pattern = ".*" + filter + ".*"; + Document searchDocument = new Document("$or", List.of( + new Document("speakerName", new Document("$regex", pattern).append("$options", "i")), + new Document("fraction", new Document("$regex", pattern).append("$options", "i")), + new Document("speechKey", new Document("$regex", pattern).append("$options", "i")) + )); + cursor = getSpeechCollection().find(searchDocument).cursor(); + } - // aus "agendaItems" Collection - int agendaItemId = speech.getAgendaItemId(); - String agendaTitel = getAgendaTitle(sessionId, agendaItemId); - md.setAgendaTitle(agendaTitel); + try { + while (cursor.hasNext()) { + Document doc = cursor.next(); + SpeechMetaData smd = new SpeechMetaData(); + smd.setSpeechKey(doc.getString("speechKey")); + Date dateTimeInMongo = doc.getDate("dateTime"); + smd.setDateTime(LocalDateTime.ofInstant(dateTimeInMongo.toInstant(), ZoneId.systemDefault())); + smd.setDateTimeString(doc.getString("dateTimeString")); + smd.setSpeakerName(doc.getString("speakerName")); + String fraktion = (doc.getString("fraction")); + if (fraktion == null) { + smd.setFraktion(PPRUtils.PARTEILOS_KUERZEL); + } else { + smd.setFraktion(fraktion); + } + smd.setAgendaTitle(doc.getString("agendaTitel")); + smd.setSpeakerId(doc.getInteger("speakerId")); - speechMetaDataList.add(md); + speechMetaDataList.add(smd); + } + } catch (Throwable t) { + Logger.error(String.valueOf(t)); + } finally { + cursor.close(); } // Sortiere nach Datum, absteigend @@ -557,6 +573,7 @@ public class MongoPprUtils { return speechMetaDataList; } + /** * Füge Rede-Metadaten (welche in der Session-Collection stehen) der Rede hinzu. * Achtung: Redezeit ist in der Datenbank in unterschiedlichen Formaten vorhanden. @@ -608,7 +625,8 @@ public class MongoPprUtils { if ((iter == null || (iter.first() == null))) { return "(kein Agendatitel)"; } else { - return (String) iter.first().get("title"); + String agendaTitel = (String) iter.first().get("title"); + return String.format("%d / %s", sessionId, agendaTitel); } } @@ -689,7 +707,6 @@ public class MongoPprUtils { Document groupStage = new Document("$group", new Document("_id", "$topics")); // Group by "topics" Document projectStage = new Document("$project", new Document("topic", "$_id").append("_id", 0)); // Optionally format the result - // Execute the aggregation AggregateIterable result = getSpeechCollection().aggregate(Arrays.asList(unwindStage, groupStage, projectStage)); Set topics = new HashSet<>(); for (Document doc : result) { diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/ParlamentarierController.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/ParlamentarierController.java index 15eb37c..e09bec6 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/ParlamentarierController.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/ParlamentarierController.java @@ -104,7 +104,7 @@ public class ParlamentarierController { // Foto des Abgeordnetes String picture = MongoPprUtils.getParlamentarierPictureByID(id); - attributes.put("pic", picture); + attributes.put("picture", picture); ctx.render("parlamentarierDetails.ftl", attributes); } diff --git a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/SpeechController.java b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/SpeechController.java index d8bee69..e565230 100644 --- a/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/SpeechController.java +++ b/src/main/java/org/texttechnologylab/project/gruppe_05_1/rest/SpeechController.java @@ -200,6 +200,10 @@ public class SpeechController { return iconNames; } + /** + * Zeige alle Reden + * @param ctx + */ @OpenApi( summary = "Liste alle Reden (Filtern ist möglich)", description = "Liste alle Reden. Man kann nach Freitext (MdB Name, Partei/Fraktion) oder nach Thema (Topic) filtern", diff --git a/src/main/resources/templates/showAllSpeechesList.ftl b/src/main/resources/templates/showAllSpeechesList.ftl index 07eb148..16d0945 100644 --- a/src/main/resources/templates/showAllSpeechesList.ftl +++ b/src/main/resources/templates/showAllSpeechesList.ftl @@ -33,7 +33,7 @@ ${redeMd.dateTimeString} ${redeMd.speakerName} ${redeMd.fraktion} - ${redeMd.sessionId} / ${redeMd.agendaTitle} + ${redeMd.agendaTitle} diff --git a/src/main/resources/templates/showSpeechesList.ftl b/src/main/resources/templates/showSpeechesList.ftl index c9e6dc0..84fc93a 100644 --- a/src/main/resources/templates/showSpeechesList.ftl +++ b/src/main/resources/templates/showSpeechesList.ftl @@ -32,7 +32,7 @@ <#list speechesMetaDataList as redeMd> ${redeMd.dateTimeString} - ${redeMd.sessionId} / ${redeMd.agendaTitle} + ${redeMd.agendaTitle}