Project

General

Profile

Revision cf3c2494

IDcf3c2494ece15ab1296aad363b0e84c7bd2a0da0
Parent 832d63c3
Child 699bd24c

Added by Vincent QUEMENER over 13 years ago

Chaque plugin adresse désormais une seule requête à la base de données pour tous les évènements de la page, plutôt qu'une requête par évènement.

git-svn-id: https://vigilo-dev.si.c-s.fr/svn@6291 b22e2e97-25c9-44ff-b637-2e5ceca36478

View differences:

vigiboard/controllers/plugins/hls.py
25 25

  
26 26
from vigiboard.controllers.plugins import VigiboardRequestPlugin
27 27
from vigilo.models.session import DBSession
28
from vigilo.models.tables import HighLevelService, CorrEvent, Event, SupItem
28
from vigilo.models.tables import HighLevelService, CorrEvent, Event, SupItem, \
29
    ImpactedHLS, ImpactedPath
30
from sqlalchemy.orm import aliased
31
from sqlalchemy.sql import functions
29 32

  
30 33
class PluginHLS(VigiboardRequestPlugin):
31 34
    """
32 35
    Plugin qui permet de voir les services de haut niveau impactés par
33
    un événement.
36
    les événements affichés sur la page principale de VigiBoard.
34 37
    """
35
    def get_value(self, idcorrevent):
38

  
39
    def get_bulk_data(self, events_ids):
36 40
        """
37
        Renvoie le nom des services de haut niveau impactés par l'événement.
41
        Renvoie le nom des services de haut niveau impactés
42
        par chacun des événements du tableau de VigiBoard.
38 43

  
39
        @param idcorrevent: Identifiant de l'événement corrélé.
40
        @type idcorrevent: C{int}
41
        @return: Un dictionnaire dont la clé "services" contient une liste
42
            des noms des services de haut niveau impactés par l'événement
43
            corrélé dont l'identifiant est L{idcorrevent}.
44
        @param events_ids: Liste des identifiants des événements corrélés
45
            à afficher.
46
        @type  events_ids: C{int}
47
        @return: Un dictionnaire associant à chaque identifiant d'évènement
48
            la liste des noms des HLS de plus haut niveau qu'il impacte.
49
        @rtype:  C{dict}
44 50
        """
45
        supitem = self.get_correvent_supitem(idcorrevent)
46 51

  
47
        if not supitem:
48
            return []
52
        imp_hls1 = aliased(ImpactedHLS)
53
        imp_hls2 = aliased(ImpactedHLS)
54

  
55
        # Sous-requête récupérant les identifiants des supitems
56
        # impactés par les évènements passés en paramètre.
57
        subquery = DBSession.query(
58
                SupItem.idsupitem,
59
                CorrEvent.idcorrevent
60
            ).join(
61
                (Event, Event.idsupitem == SupItem.idsupitem),
62
                (CorrEvent, CorrEvent.idcause == Event.idevent),
63
            ).filter(CorrEvent.idcorrevent.in_(events_ids)
64
            ).subquery()
65

  
66
        # Sous-requête récupérant les identifiants des SHN de plus
67
        # haut niveau impactés par les évènements passés en paramètre.
68
        # Fait appel à la sous-requête précédente (subquery).
69
        subquery2 = DBSession.query(
70
            functions.max(imp_hls1.distance).label('distance'),
71
            imp_hls1.idpath,
72
            subquery.c.idcorrevent
73
        ).join(
74
            (ImpactedPath, ImpactedPath.idpath == imp_hls1.idpath)
75
        ).join(
76
            (subquery, ImpactedPath.idsupitem == subquery.c.idsupitem)
77
        ).group_by(imp_hls1.idpath, subquery.c.idcorrevent
78
        ).subquery()
49 79

  
50
        services = supitem.impacted_hls(
51
            HighLevelService.servicename
52
        ).distinct().order_by(
80
        # Requête récupérant les noms des SHN de plus haut niveau
81
        # impactés par chacun des évènements passés en paramètre.
82
        # Fait appel à la sous-requête précédente (subquery2).
83
        services = DBSession.query(
84
            HighLevelService.servicename,
85
            subquery2.c.idcorrevent
86
        ).join(
87
            (imp_hls2, HighLevelService.idservice == imp_hls2.idhls),
88
            (subquery2, subquery2.c.idpath == imp_hls2.idpath),
89
        ).filter(imp_hls2.distance == subquery2.c.distance
90
        ).order_by(
53 91
            HighLevelService.servicename.asc()
54 92
        ).all()
55 93

  
56
        return {'services': [service.servicename for service in services]}
94
        # Construction d'un dictionnaire associant à chaque évènement
95
        # le nom des SHN de plus haut niveau qu'il impacte.
96
        hls = {}
97
        for event_id in events_ids:
98
            hls[event_id] = []
99
        for service in services:
100
            hls[service.idcorrevent].append(service.servicename)
101

  
102
        return hls
57 103

  
58
    def get_correvent_supitem(self, idcorrevent):
59
        """
60
        Retourne le supitem ayant causé l'évènement
61
        corrélé dont l'identifiant est passé en paramètre.
62
        """
63
        # On récupère l'item recherché dans la BDD
64
        supitem = DBSession.query(SupItem
65
            ).join(
66
                (Event, Event.idsupitem == SupItem.idsupitem),
67
                (CorrEvent, CorrEvent.idcause == Event.idevent),
68
            ).filter(CorrEvent.idcorrevent == idcorrevent).first()
69
        return supitem

Also available in: Unified diff