Notre première tentative a été le classement, mais il semble qu’il privilégie le volume pur (pensez à « Est-ce que c’est réparé ? Est-ce que c’est réparé ? Est-ce que c’est réparé ? Bonjour ? ») par rapport à la qualité. D’accord, oui, la « qualité » est difficile à algorithmer, bien qu’il y ait quelques ajustements évidents à faire.
Ce que nous avons commencé à faire pour identifier les utilisateurs vraiment utiles est de
rechercher des fils où un autre utilisateur est le premier à répondre
-- Objectif : Trouver des sujets où la première réponse non-OP est un non-SonarSourcer
WITH
SonarSourcers AS (
SELECT u.id AS user_id
FROM groups g
INNER JOIN group_users gu ON g.id=gu.group_id
INNER JOIN users u ON u.id = gu.user_id
WHERE g.name='sonarsourcers'
),
tagged_topics AS (
SELECT tt.topic_id
FROM topic_tags tt
JOIN tags t on t.id=tt.tag_id
WHERE name = 'me-too'
),
-- trouver des sujets 'réguliers' créés par des utilisateurs normaux
topic_user AS (
SELECT id as topic_id, user_id, created_at
FROM topics
LEFT JOIN SonarSourcers ss USING(user_id)
LEFT JOIN tagged_topics tt on topics.id = tt.topic_id
WHERE ss.user_id IS NULL -- omettre les sujets commencés par SonarSourcers
AND tt.topic_id IS NULL -- omettre les sujets tagués avec me-too
AND user_id > 0 -- omettre les fils de discussion/tutoriels de bienvenue de DiscoBot
AND visible = TRUE
AND archived = FALSE
AND archetype='regular'
AND created_at::DATE > '2023-07-01'
),
-- trouver la première réponse non-OP aux sujets des utilisateurs
min_response AS (
SELECT p.topic_id, tu.created_at, MIN(post_number) as post_number
FROM posts p
JOIN topic_user tu USING(topic_id)
WHERE p.post_type = 1
AND p.user_id != tu.user_id
AND p.post_number > 1
AND p.hidden = false
AND p.deleted_at IS NULL
GROUP BY topic_id, tu.created_at
)
SELECT p.topic_id, p.user_id, mr.created_at::DATE as thread_date
FROM posts p
JOIN min_response mr ON p.topic_id = mr.topic_id AND p.post_number=mr.post_number
LEFT JOIN SonarSourcers ss ON p.user_id=ss.user_id
LEFT JOIN user_badges ub on p.id = ub.post_id and ub.badge_id=110
WHERE ss.user_id IS NULL -- éliminer les sujets où SonarSourcer est le premier à répondre
AND ub.user_id IS NULL -- éliminer les sujets où un badge a déjà été attribué
ORDER BY mr.created_at DESC
Une fois que nous avons identifié ces fils, nous évaluons la réponse de l’utilisateur et attribuons ensuite à l’utilisateur répondant un badge « Utilisateurs aidant les utilisateurs » ou taguons le fil avec un tag « me-too » (invisible pour le personnel). (D’ailleurs, ce rapport de réponse utilisateur a l’effet secondaire heureux de repérer rapidement les incidents dans notre service cloud.
)
À partir de là, il devient facile de récompenser davantage les utilisateurs utiles et de les identifier pour un suivi plus approfondi.