• Aucun résultat trouvé

Exemple d’une condition exprimée sous forme d’arbre binaire

Outre les opérateurs de comparaison et opérateurs booléens & et | habituels, la règle 7 introduit le symbole « ; », correspondant à l’opérateur de séquence, ou opérateur puis. L’expression booléenne corres- pondant à notre exemple,(C1 & C2) ; (C3 | C4), s’interprète alors comme :

C1 et C2 sont remplies, puis C3 ou C4 est remplie.

Par définition, l’opérateur « ; » n’est pas symétrique, A; B n’est donc pas équivalent à B; A, contrai- rement aux opérateurs booléens classiques. Il convient alors de faire la distinction entre partie gauche et partie droite de l’expression, ou les sous-arbres gauche et droit de l’arbre binaire associé.

Ainsi, à considérer que les conditions C{1..4} s’appliquent sur le type Prise, il sera alors possible, pour la sélection introduite en sous-section 5.2.2, de filtrer les prises selon ces quatre conditions des deux manières suivantes :

D1/Prise{(C1 & C2) ; (C3 | C4)}/Wattmetre D1/Prise{(C2 & C1) ; (C4 | C3)}/Wattmetre

Enfin cette dernière sélection est bel et bien différente, puisque l’opérateur puis n’est pas symétrique :

D1/Prise{(C3 | C4) ; (C1 & C2)}/Wattmetre

Conditions temporelles

Le troisième développement de la règle 4 introduit l’établissement d’un lien entre une condition et une durée. L’idée est ici de permettre la vérification d’une condition, quelle que soit la complexité de son expression, sur toute la durée indiquée.

Prenons par exemple la condition temporelle Ct ≡ (C, 10min), où 10min désigne une durée de dix minutes et où C est la sous-condition à vérifier sur cette durée. En pratique, le fait que C soit vérifiée ne permet pas à Ct de l’être immédiatement.

Supposons un moment t0 où C est fausse. Si, à tn, C devient vraie, Ct sera considérée vraie si et

seulement si C ne cesse d’être vraie jusqu’à tn+10min. Au contraire, si à tout instant entre tnet tn+10min,

C est invalidée, alors Ct pourra être immédiatement considérée comme fausse.

Ainsi, dans notre exemple, si l’on souhaite que C1 et C2 soient vérifiées pendant dix minutes avant de vérifier C3 ou C4, l’on écrira alors :

D1/Prise{(C1 & C2, 10min) ; (C3 | C4)}/Wattmetre

5.2.4 Accès

Cette sous-section porte sur les accès aux attributs et méthodes sur les nœuds d’une sélection. La gram- maire 5.1 nous montre qu’un accès peut être effectué dans deux contextes :

• soit il spécifie le résultat d’une requête, auquel cas il apparaît en suffixe d’une sélection comme le montre la règle 1 ;

• soit il intervient dans les deux membres des comparaisons.

On distingue trois types d’accès, et un cas particulier concernant l’accès aux méthodes dites d’agréga- tion.

Attributs

L’accès aux attributs consiste simplement a trouver la valeur de l’attribut spécifié pour chacun des nœuds de la sélection concernée. Pour les accès comme résultats de requêtes, les nœuds considérés seront ceux de la sélection finale. Pour les accès intervenant dans une comparaison, les nœuds considérés seront ceux de la sélection sur laquelle s’applique la condition. Dans tous les cas, l’accès est effectué après pré-fitrage de la sélection par ses super-sélections. La spécification d’un attribut est rendue possible par l’allocation d’un identifiant unique pour chaque attribut.

Par exemple, pour accéder à la consommation de puissance électrique des wattmètres précédemment sélectionnés, on écrira alors :

D1/Prise{(C1 & C2, 10min) ; (C3 | C4)}/Wattmetre.puissance

Constantes

Afin de permettre la comparaison d’un attribut non seulement avec un autre attribut, mais également avec des valeurs fixes, la grammaire introduit la notion d’accès à une constante. Naturellement dans le cadre du résultat d’une requête, un tel accès, bien que possible, ne présente que peu d’intérêt : cela permettra de lister la même valeur constante autant de fois qu’il y a de nœuds dans la sélection finale. L’intérêt de l’accès à une constante porte donc avant tout sur les comparaisons.

Pour illustrer cela, on va dorénavant proposer une expression concrète pour chacune des quatre condi- tions introduite précédemment. Supposons que l’on souhaite détecter les veilles des appareils branchés que mesurent les wattmètres durant au moins dix minutes, au moment où la dite veille prend fin. On définit la veille d’un appareil comme un profil énergétique où il présente une consommation non-nulle mais négli- geable (inférieure à un seuil donné, qu’on considérera ici de 30 W) et la fin de cette veille comme soit une reprise d’activité, donc un dépassement du seuil, soit l’extinction de l’appareil. La requête devient :

D1/Prise{(puissance > 0 & puissance <= 30, 10min) ;

(puissance = 0 | puissance > 30)}/Wattmetre.puissance

Elle permet alors, lorsque ces conditions sont remplies, de connaître la puissance alors mesurée, et donc d’identifier le type de sortie de veille : extinction ou reprise d’activité.

Méthodes

Outre les attributs, il est également possible d’accéder à des méthodes sur les nœuds. La spécification des méthodes se fait également par le truchement d’un identifiant unique. On distingue deux types de méthodes : • les méthodes dites simples, qui renvoient une valeur associée à chacun des nœuds de la sélection

5.2. LANGAGE DÉDIÉ 65 • les méthodes d’agrégation, qui renvoient une seule valeur pour l’ensemble des nœuds de la sélection ; il s’agit ici de permettre la somme des valeurs d’un même attribut pour tous les nœuds de la sélection par exemple.

Notons qu’il est rendu possible aux développeurs de spécifier de nouvelles méthodes pour un type de nœud par héritage objet. Le principal intérêt de ces méthodes est alors de permettre l’interaction avec l’environnement par l’intermédiaire des actuateurs, voire de permettre d’agir directement sur l’organisation de l’instance du multiarbre. Considérant que les wattmètres permettent la coupure du courant pour les appareils dont ils mesurent la consommation électrique, il est alors possible de modifier notre requête pour couper l’alimentation des appareils lors de leur extinction :

D1/Prise{(puissance > 0 & puissance < 30=, 10min) ; (puissance = 0)/Wattmetre.eteindre()

Concernant l’évolution de l’instance même du multiarbre, considérons l’organisation logique du centre de données, notamment sa partie virtualisée. Lors d’une migration d’une machine virtuelle V M1 d’un serveur S1 à un serveur S2, pouvoir détacher le nœud d’identifiant S1 du nœud V M 1 puis rattacher ce dernier au nœud S2 prend alors tout son sens.

Il est dès lors plus pertinent d’envisager ce type d’accès sur la sélection finale d’une requête que dans les conditions. C’est la raison pour laquelle la spécification de ces nouvelles méthodes peut se faire sans type de retour.

Foreach

Le troisième développement de la règle 1 nous montre un cas particulier concernant l’appel aux mé- thodes d’agrégation. Cet appel introduit l’opérateur « : », ou opérateur foreach (pour chaque). L’opéra- teur foreach vise à permettre le partitionnement d’un ensemble de nœuds N en plusieurs sous-ensembles {N1, N2, . . . , Nn} avant l’appel à la méthode d’agrégation. La méthode est alors appelé séparément pour

chacun des sous-ensembles N{1..n}, de telle sorte que l’ensemble des résultats consiste en une valeur pour

chaque sous-ensemble.

Ainsi que le montre la règle 1, le partitionnement de la sélection finale se fait en fonction de la sélec- tion filtre. Considérons la requête S1:S2.mtd()où S1 et S2 sont des sous-sélections, mtd une méthode

d’agrégation. Le partitionnement de S2 se fera alors de telle sorte que chaque partition sera liée à un nœud spécifique de S1. Il y aura donc autant de partitions de S2 qu’il y a de nœuds dans S1.