SELECT l.dttm AS action_datetime, -- Date et heure de l'action -- Classification des actions pour les regrouper par type fonctionnel CASE -- Requête SQL depuis SQL Lab WHEN lower(l.action) = 'queries' THEN 'query from sqllab' -- Données chargées via un graphique WHEN lower(l.action) = 'chartrestapi.data' THEN 'query from charts' -- Consultation d'un dashboard WHEN lower(l.action) = 'dashboardrestapi.get' THEN 'dashboard view' -- Action liée aux annotations WHEN lower(l.action) LIKE 'annotation%' THEN 'annotations' -- Modification ou chargement de CSS WHEN lower(l.action) LIKE 'css%' THEN 'css' -- Autres actions laissées telles quelles ELSE lower(l.action) END AS action, -- Informations sur l'utilisateur ayant réalisé l'action l.user_id, u.username, u.created_on AS user_registration_date, -- Informations sur le dashboard concerné par l'action l.dashboard_id, d.dashboard_title, -- Statut du dashboard : publié ou brouillon (draft) CASE WHEN l.dashboard_id IS NOT NULL AND d.published = TRUE THEN 'published' WHEN l.dashboard_id IS NOT NULL AND d.published = FALSE THEN 'draft' ELSE NULL END AS dashboard_status, -- Informations sur le graphique (slice)concerné l.slice_id, s.slice_name, s.datasource_type, s.datasource_name, s.datasource_id, -- Type de dataset : physique ou virtuel, basé sur la présence d'une requête SQL CASE WHEN t.sql IS NULL OR t.sql = '' THEN 'physical' -- Dataset relié directement à une table ELSE 'virtual' -- Dataset défini via une requête SQL (virtuel) END AS dataset_type -- Jointures avec les tables utilisateurs, dashboards, slices, et tables (datasets) FROM logs AS l LEFT JOIN ab_user AS u ON u.id = l.user_id LEFT JOIN dashboards AS d ON d.id = l.dashboard_id LEFT JOIN slices AS s ON s.id = l.slice_id LEFT JOIN tables AS t ON t.id = s.datasource_id AND s.datasource_type = 'table' -- Filtrage : pour le moment, on exclut les événements 'log' qui sont de type JSON WHERE l.action != 'log'