From c6523bf96e24c667a3408423791b2af808d0e5c7 Mon Sep 17 00:00:00 2001 From: vysitor Date: Sun, 23 Mar 2025 20:29:10 +0100 Subject: [PATCH] Added Filter to Speeches search function --- .../gruppe_05_1/database/MongoPprUtils.java | 55 +++++++++++++++++++ .../gruppe_05_1/rest/SpeechController.java | 11 +--- .../templates/filterFormForSpeeches.ftl | 28 ++++++++++ .../templates/showAllSpeechesList.ftl | 2 +- 4 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 src/main/resources/templates/filterFormForSpeeches.ftl 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 3bc5cae..52b20ef 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 @@ -245,6 +245,61 @@ public class MongoPprUtils { } + /** + * Hole alle Reden gefiltert nach den Form-Parameter + * @param ctx Session Context, aus dem man alle Parameter abfragen kann + * @return + */ + public static List getFilteredSpeechesOverview(Context ctx) { + + String name = ctx.queryParam("name"); + + String party = (!Objects.equals(ctx.queryParam("party"), "")) ? ctx.queryParam("party") : null; + String topic = (!Objects.equals(ctx.queryParam("topic"), "")) ? ctx.queryParam("topic") : null; + + + List filters = new ArrayList<>(); + if (name != null) filters.add(Filters.regex("speakerName", ".*" + name + ".*", "i")); + if (party != null) filters.add(Filters.regex("fraction", ".*" + party + ".*", "i")); + + Bson filter; + if (filters.isEmpty()) { + filter = Filters.empty(); + } else { + filter = Filters.and(filters); + } + + List result = new ArrayList<>(); + + MongoCollection collection = getSpeechCollection(); + + Document projection = new Document("speechKey", 1) + .append("speakerId", 1) + .append("dateTimeString", 1) + .append("speakerName", 1) + .append("fraction", 1) + .append("agendaTitel", 1); + + List docs = collection.find(filter) + .projection(projection) + .sort(Sorts.descending("dateTime")) + .into(new ArrayList<>()); + + for (Document doc : docs) { + result.add(new SpeechOverview( + doc.getString("speechKey"), + doc.getInteger("speakerId"), + doc.getString("dateTimeString"), + doc.getString("speakerName"), + doc.getString("fraction"), + doc.getString("agendaTitel") + )); + } + + return result; + } + + /** * Liest einen Parlamentarier von der MongoDB * @param doc - MongoDB Dokument eines Parlamentariers 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 cb0d25f..e759050 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 @@ -241,21 +241,16 @@ public class SpeechController { @OpenApiResponse(status = "200", content = {@OpenApiContent(from = Speech[].class)}) }) public static void listAllSpeeches(Context ctx) { - String filter = ctx.queryParam("filter"); - Logger.info("Filter: '" + filter + "'"); - - List speechOverviews = MongoPprUtils.getSpeechOverview(); + List speechOverviews = MongoPprUtils.getFilteredSpeechesOverview(ctx); Map attributes = new HashMap<>(); attributes.put("speechesMetaDataList", speechOverviews); - // Filtern nach Text - attributes.put("filter", filter == null || filter.isBlank() ? null : filter); + String name = ctx.queryParam("name"); + if ((name != null) && ( ! name.isBlank())) attributes.put("name", name); - // Filtern nach Partei/Fraktion attributes.put("parties", MongoPprUtils.getAllPartiesFromSpeeches()); - // Filtern nach Topics List topics = MongoPprUtils.getAllTopics(); attributes.put("topics", topics); diff --git a/src/main/resources/templates/filterFormForSpeeches.ftl b/src/main/resources/templates/filterFormForSpeeches.ftl new file mode 100644 index 0000000..d576cec --- /dev/null +++ b/src/main/resources/templates/filterFormForSpeeches.ftl @@ -0,0 +1,28 @@ +
+
+ + + + <#if parties??> + + + + <#if topics??> + + + + +
+
diff --git a/src/main/resources/templates/showAllSpeechesList.ftl b/src/main/resources/templates/showAllSpeechesList.ftl index e5e811e..78b9662 100644 --- a/src/main/resources/templates/showAllSpeechesList.ftl +++ b/src/main/resources/templates/showAllSpeechesList.ftl @@ -13,7 +13,7 @@
<#assign formAction = "/reden"> - <#include "filterForm.ftl"> + <#include "filterFormForSpeeches.ftl">