Skip to content

Commit

Permalink
Fix #169 : Fix bug in house.checkUsersPresence() when multiple users …
Browse files Browse the repository at this point in the history
…are at home
  • Loading branch information
Pierre-Gilles committed Sep 9, 2017
1 parent 7ea6fef commit 7071daf
Showing 1 changed file with 1 addition and 0 deletions.
1 change: 1 addition & 0 deletions api/core/house/house.queries.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ module.exports = {
AND house = ?
ORDER BY datetime DESC LIMIT 1 ) = 'back-at-home'
)
GROUP BY user.id
HAVING datetime < DATE_SUB(NOW(), INTERVAL ? MINUTE)
`
};

6 comments on commit 7071daf

@pjap93
Copy link
Contributor

@pjap93 pjap93 commented on 7071daf Sep 9, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bonsoir Pierre Gilles,
Après pas mal de tâtonnement je suis tomber sur une requête pas trop mal,

SELECT user.id,user.firstname,MAX(event.datetime) as datetime  
FROM user
JOIN event ON event.user = user.id
JOIN eventtype ON event.eventtype = eventtype.id
WHERE ( eventtype.code = 'back-at-home' OR eventtype.code = 'user-seen-at-home' )
AND event.house = ?
AND user.id IN (
    SELECT device.user
    FROM device
    WHERE ( 
        SELECT eventtype.code
        FROM event 
        JOIN eventtype ON event.eventtype = eventtype.id
        WHERE 
        ( eventtype.code = 'back-at-home' OR eventtype.code = 'left-home' )
        AND event.user = device.user
        AND event.house = ?
        ORDER BY datetime DESC LIMIT 1 ) = 'back-at-home'
    AND device.service = ?
    GROUP BY device.user
)
GROUP BY user.id 
HAVING datetime < DATE_SUB(NOW(), INTERVAL ? MINUTE)

tu en pense quoi ?

A+

@Pierre-Gilles
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'avais déjà corrigé le problème dans ce commit, non ? :)

Pourquoi mettre deux GROUP BY ? Celui là n'est pas très utile =>

SELECT device.user
    FROM device
    WHERE ( 
        SELECT eventtype.code
        FROM event 
        JOIN eventtype ON event.eventtype = eventtype.id
        WHERE 
        ( eventtype.code = 'back-at-home' OR eventtype.code = 'left-home' )
        AND event.user = device.user
        AND event.house = ?
        ORDER BY datetime DESC LIMIT 1 ) = 'back-at-home'
    AND device.service = ?
    GROUP BY device.user

@pjap93
Copy link
Contributor

@pjap93 pjap93 commented on 7071daf Sep 9, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

il y en a un pour sortir tous les users dans le SELECT device.user car sinon il y a qu'un seul résultat qui ressort et le deuxième pour le résultat final que l'on attend si plusieurs résultats doivent être retournés pour la fonction checkUsersPresence.
c'est en tout cas ce que j'ai constaté lors de mes essais.

@Pierre-Gilles
Copy link
Contributor Author

@Pierre-Gilles Pierre-Gilles commented on 7071daf Sep 9, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah attend, mais tu as beaucoup modifié la requête au fait! Je n'avais pas vu. T'embête pas, j'ai fais la modification cet aprem, il manquait juste un simple GROUP BY dans la requête originale :) ( testé, ça marche en multi-user )

D'ailleurs, ta requête n'est pas correcte, tu passes par la table device visiblement, or un user n'a pas forcément spécifié de device a lui pour être marqué comme présent dans la maison. Il peut très bien avoir codé lui même un module qui passer par une caméra avec reconnaissance de visage (type netatmo), qui déclenche un événement "user-seen-at-home" quand le user passe devant la caméra, sans forcément d'avoir déclaré de device. La détection par le device n'est qu'une façon de faire parmi tant d'autre :)

( Mais c'est sympa d'avoir proposé une solution ! :) )

@pjap93
Copy link
Contributor

@pjap93 pjap93 commented on 7071daf Sep 9, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

je suis resté sur le module NetworkScanner qui utilise les devices associés à l'utilisateur c'est pour ça lol, et où j'ai rencontré un problème quand un utilisateur n'est pas géré par le scan (le petit n'as pas encore de téléphone lol) et il passait automatiquement en mode sorti à chaque fois que la fonction checkUsersPresence était appelée car il n'y avait pas d’événement "user-seen-at-home" produit pour lui.

@Pierre-Gilles
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah oui, bon au moins grâce à lui on a trouvé ce bug :D

Please sign in to comment.