Rapport du tableau de bord - Indicateurs

Ceci est une version SQL du rapport de tableau de bord pour les drapeaux

Ce rapport fournit un décompte des publications signalées dans une catégorie spécifique facultative (et éventuellement ses sous-catégories) sur une période donnée. Ces informations peuvent être utiles aux gestionnaires de communauté et aux modérateurs pour comprendre le volume des signalements effectués dans certaines parties du forum, ce qui peut aider à identifier les tendances et les domaines qui peuvent nécessiter une attention ou une modération supplémentaires.

-- [params]
-- date :start_date = 2023-01-01
-- date :end_date = 2024-01-01
-- null int :category_id = 0
-- boolean :include_subcategories = false

WITH RECURSIVE subcategories AS (
    SELECT id FROM categories WHERE id = :category_id
    UNION ALL
    SELECT c.id FROM categories c
    INNER JOIN subcategories sc ON c.parent_category_id = sc.id
)

SELECT
    DATE(r.created_at) AS flag_date,
    COUNT(r.id) AS flags_count
FROM reviewables r
LEFT JOIN categories c ON r.category_id = c.id
WHERE r.type = 'ReviewableFlaggedPost'
    AND r.created_at::DATE BETWEEN :start_date AND :end_date
    AND (:category_id = 0 OR (
        :include_subcategories
        AND r.category_id IN (SELECT id FROM subcategories)
        OR NOT :include_subcategories
        AND r.category_id = :category_id
    ))
GROUP BY flag_date
ORDER BY flag_date

Explication de la requête SQL

La requête SQL est conçue pour compter le nombre de signalements (représentés par des enregistrements ReviewableFlaggedPost dans la table reviewables) créés chaque jour dans la plage de dates et la catégorie spécifiées. Elle utilise une expression de table commune (CTE) récursive pour inclure éventuellement les sous-catégories de la catégorie choisie.

Paramètres

  • :start_date : Le début de la plage de dates pour laquelle compter les signalements.
  • :end_date : La fin de la plage de dates pour laquelle compter les signalements.
  • :category_id : L’ID de la catégorie pour laquelle compter les signalements. S’il est défini sur 0, le filtre sur la catégorie n’est pas appliqué.
  • :include_subcategories : Une valeur booléenne qui détermine s’il faut inclure les sous-catégories de la catégorie spécifiée dans le décompte.

Répartition de la requête

  1. CTE récursive (subcategories) :
    • Cette CTE commence par sélectionner la catégorie dont l’ID est fourni par le paramètre :category_id.
    • Elle sélectionne ensuite récursivement toutes les sous-catégories de cette catégorie en joignant la table categories avec la CTE subcategories sur le champ parent_category_id.
    • Le résultat est une liste de toutes les sous-catégories (y compris la catégorie initiale) qui sera utilisée pour le filtrage.
  2. Requête principale :
    • La requête sélectionne deux colonnes : la date de création du signalement (flag_date) et le nombre de signalements (flags_count) pour cette date.
    • Elle joint la table reviewables avec la table categories pour associer chaque signalement à sa catégorie.
  3. Filtres :
    • La requête filtre les enregistrements reviewables pour n’inclure que ceux de type ReviewableFlaggedPost, qui représente les publications signalées.
    • Elle garantit que la date created_at des signalements se situe dans la plage de dates spécifiée (:start_date à :end_date).
    • Elle applique un filtre conditionnel basé sur les paramètres :category_id et :include_subcategories :
      • Si :category_id est 0, aucun filtre de catégorie n’est appliqué.
      • Si :include_subcategories est true, la requête inclut les signalements de la catégorie initiale et de toutes ses sous-catégories.
      • Si :include_subcategories est false, la requête inclut les signalements uniquement de la catégorie initiale.
  4. Regroupement et tri :
    • Les résultats sont regroupés par la date de création du signalement pour fournir un décompte par jour.
    • Les résultats sont triés par date pour présenter les données dans une séquence chronologique.

Résultats d’exemple

flag_date flags_count
2023-11-19 2
2023-11-22 1
2023-11-23 1
2023-11-24 2
2023-11-26 1
1 « J'aime »