From e927dfc46d76e575bbdef26e73d23c5e0b6ee502 Mon Sep 17 00:00:00 2001 From: dre0059 <eliska.dreveniakova@vsb.cz> Date: Fri, 25 Apr 2025 23:40:24 +0200 Subject: [PATCH] =?UTF-8?q?Zmena=20stylovania=20grafov=20-=20pr=C3=ADprava?= =?UTF-8?q?=20na=20tret=C3=AD,=20kompletn=C3=BD=20graf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/demo.mv.db | Bin 14921728 -> 14921728 bytes .../controller/StatisticsController.java | 47 +++++++++++++++--- .../repository/DocumentRepository.java | 17 +------ .../repository/ReferenceRepository.java | 13 +++++ src/main/resources/templates/statistics.html | 2 +- 5 files changed, 56 insertions(+), 23 deletions(-) diff --git a/data/demo.mv.db b/data/demo.mv.db index 7454a2b717bca086ba694b4c3425baa4d43f456b..4776c8ec4a71454d5ff7b0224e7905e703e36cf4 100644 GIT binary patch delta 13761 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 V_yu?a`~x@#-pq}h{zv-l{{d)z$jtx% delta 8510 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 MetvMz2kg=R2F<@<c>n+a diff --git a/src/main/java/com/dre0059/articleprocessor/controller/StatisticsController.java b/src/main/java/com/dre0059/articleprocessor/controller/StatisticsController.java index 6bf4eae..8a8348b 100644 --- a/src/main/java/com/dre0059/articleprocessor/controller/StatisticsController.java +++ b/src/main/java/com/dre0059/articleprocessor/controller/StatisticsController.java @@ -2,9 +2,11 @@ package com.dre0059.articleprocessor.controller; import com.dre0059.articleprocessor.model.Dokument; import com.dre0059.articleprocessor.repository.DocumentRepository; +import com.dre0059.articleprocessor.repository.ReferenceRepository; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.util.*; import java.util.stream.Collectors; @@ -13,29 +15,62 @@ import java.util.stream.Collectors; public class StatisticsController { private final DocumentRepository documentRepository; + private final ReferenceRepository referenceRepository; - public StatisticsController(DocumentRepository documentRepository) { + public StatisticsController(DocumentRepository documentRepository, + ReferenceRepository referenceRepository) { this.documentRepository = documentRepository; + this.referenceRepository = referenceRepository; } @GetMapping("/statistics") - public String statistics(Model model) { + public String statistics( + @RequestParam(value = "category", required = false, defaultValue = "") String category, + Model model + ) { + // 1) VÅ¡etky dokumenty List<Dokument> documents = documentRepository.findAll(); - // Status count + // 2) Status count Map<String, Long> statusCount = documents.stream() .collect(Collectors.groupingBy(Dokument::getStatus, Collectors.counting())); - // odfiltruj PDF ktoré nemajú kategoriu + // 3) Category count (len tie, ktoré majú kategóriu) Map<String, Long> categoryCount = documents.stream() - .filter(doc -> doc.getCategory() != null) // 💡 Tu je fix + .filter(d -> d.getCategory() != null) .collect(Collectors.groupingBy( - doc -> doc.getCategory().getName(), + d -> d.getCategory().getName(), Collectors.counting() )); + // 4) Zoznam vÅ¡etkých kategórià (poradie podľa vstupu do mapy) + List<String> categories = new ArrayList<>(categoryCount.keySet()); + + // 5) Vyberieme "selectedCategory": + // - ak priÅ¡lo z parametra, použijeme ho + // - inak vezmeme prvú kategóriu zo zoznamu (ak existuje) + String selectedCategory = category.trim().isEmpty() + ? (categories.isEmpty() ? "" : categories.get(0)) + : category.trim(); + + // 6) SpoÄÃtame referencie podľa rokov pre vybranú kategóriu + Map<Integer, Long> referenceCounts = new LinkedHashMap<>(); + if (!selectedCategory.isEmpty()) { + List<Object[]> raw = referenceRepository + .countReferencesByYearForCategory(selectedCategory); + // raw: [ [year, count], [year, count], ... ] už zoradené podľa roku v JPQL + raw.forEach(record -> { + Integer year = (Integer) record[0]; + Long count = (Long) record[1]; + referenceCounts.put(year, count); + }); + } + + // 7) Pridáme vÅ¡etko do modelu model.addAttribute("statusCount", statusCount); model.addAttribute("categoryCount", categoryCount); + model.addAttribute("referenceCounts", referenceCounts); + model.addAttribute("selectedCategory", selectedCategory); return "statistics"; } diff --git a/src/main/java/com/dre0059/articleprocessor/repository/DocumentRepository.java b/src/main/java/com/dre0059/articleprocessor/repository/DocumentRepository.java index fb94ac6..7d5c73e 100644 --- a/src/main/java/com/dre0059/articleprocessor/repository/DocumentRepository.java +++ b/src/main/java/com/dre0059/articleprocessor/repository/DocumentRepository.java @@ -46,20 +46,5 @@ public interface DocumentRepository extends JpaRepository<Dokument, Long> { ) List<Dokument> getReferencedDocumentsById(@Param("id") Long fromDocumentId); -} - -/* - // save only if all authors are the same - @Query(""" - SELECT COUNT(d) > 0 - FROM Dokument d - WHERE d.title = :title - AND SIZE(d.authors) = :authorCount - AND EXISTS ( - SELECT 1 FROM Dokument d2 JOIN d2.authors a2 - WHERE d2.id = d.id AND a2 IN :authors - ) - """) - boolean existsByTitleAndAuthors(@Param("title") String title, @Param("authors") List<Author> authors, @Param("authorCount") int authorCount); - */ \ No newline at end of file +} diff --git a/src/main/java/com/dre0059/articleprocessor/repository/ReferenceRepository.java b/src/main/java/com/dre0059/articleprocessor/repository/ReferenceRepository.java index f5cee29..2551ed8 100644 --- a/src/main/java/com/dre0059/articleprocessor/repository/ReferenceRepository.java +++ b/src/main/java/com/dre0059/articleprocessor/repository/ReferenceRepository.java @@ -2,8 +2,21 @@ package com.dre0059.articleprocessor.repository; import com.dre0059.articleprocessor.model.Reference; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; public interface ReferenceRepository extends JpaRepository<Reference, Long> { + + @Query(""" + SELECT r.toDocument.publicationYear, COUNT(r) + FROM Reference r + WHERE r.fromDocument.category.name = :category + GROUP BY r.toDocument.publicationYear + ORDER BY r.toDocument.publicationYear + """) + List<Object[]> countReferencesByYearForCategory(@Param("category") String category); + + } diff --git a/src/main/resources/templates/statistics.html b/src/main/resources/templates/statistics.html index 18fa6da..bdae897 100644 --- a/src/main/resources/templates/statistics.html +++ b/src/main/resources/templates/statistics.html @@ -3,7 +3,7 @@ <head> <meta charset="UTF-8"> <title>Document Statistics</title> - <script src="https://cdn.plot.ly/plotly-2.24.1.min.js"></script> + <script src="https://cdn.plot.ly/plotly-latest.min.js"></script> <link rel="stylesheet" th:href="@{/webjars/bootstrap/5.1.3/css/bootstrap.min.css}"> <link rel="icon" type="image/x-icon" href="assets/favicon.ico" /> -- GitLab