Présentation du langage MQL

La commande find() de l'API TADDM accepte une chaîne de requête spécifiée à l'aide du langage MQL (Model Query Language). Le MQL agit comme un filtre pour limiter les objets sélectionnés.

Le langage MQL utilise une syntaxe semblable à celle du langage SQL qui permet de spécifier la classe d'objet du modèle ou d'autres sources de données, leurs attributs, ainsi qu'une expression de filtrage.

La syntaxe d'une requête MQL se présente comme suit :

SELECT attribute-list FROM data-sources [ WHERE expression ]

Le tableau 1 décrit les éléments d'une requête MQL. Le MQL n'est pas sensible à la casse.

Tableau 1. Eléments d'une requête MQL
Elément Description

liste d'attributs

La valeur * ou une liste séparée par des virgules d'attributs de la classe ModelObject source. Il est également possible de spécifier des attributs intégrés.

Un nom d'attribut commence toujours par une lettre minuscule, sauf si la première et la deuxième lettres sont toutes deux des majuscules. Les lettres suivantes du nom d'attribut peuvent correspondre à des majuscules ou des minuscules. Voici quelques exemples de noms d'attribut :
  • displayName
  • fqdn
  • OSRunning

sources de données

Liste séparée par des virgules de noms de classe d'objets modèles. Ces classes doivent être permanentes puisque vous ne pouvez pas lancer de requête sur des objets non permanents.

expression

Expression de filtrage, exprimée à l'aide du format suivant :

member-name OP expression [ ... ]

où :

  • Member-name est un attribut de la source de données sélectionnée et peut inclure des membres séparés par des points (les classes de membre spécifiées dans l'expression de requête doivent être permanentes. Vous pouvez interroger les attributs de membre pour obtenir les valeurs correspondant à l'expression de requête).
  • OP est un opérateur.
  • Expression est une instruction qui renvoie une valeur.

Par exemple :

SELECT * 
   FROM   ComputerSystem 
   WHERE  OSRunning.OSName == 'Linux'

Dans ce cas, OSRunning est un objet de système d'exploitation référencé par un système informatique (ComputerSystem), et OSName est un membre primitif.

Pour une description des opérateurs et de la priorité associée, voir Tableau 2 .

Le tableau 2 décrit la priorité de l'opérateur MQL, les valeurs les plus élevées représentant la priorité la plus élevée.

Tableau 2. Priorité de l'opérateur MQL
Jeton Opérateur Priorité
ou opération OU 1
et opération ET 2
instance-de est une instance de 3
== est égal à 3
!= n'est pas égal à 3
> supérieur à 3
>= supérieur ou égal à 3
< inférieur à 3
<= inférieur ou égal à 3
starts-with starts-with 4
ends-with ends-with 4
est égal à est égal à 4
not-equals est différent de 4
est-vide est NULL 4
n'est-pas-vide n'est pas NULL 4
dans dans 5
() parenthèses 5
existe contenu de grappe 5
supérieur() fonction 5
inférieur() fonction 5
! non unaire 5
. sélection par point 6
contient contient 3
a pour résultat a pour résultat 3
Le MQL ne prend pas en charge les fonctions ou opérateurs SELECT SQL suivants:
  • GROUP BY
  • HAVING
  • DISTINCT
  • nested SELECTs
  • BETWEEN
  • Aggregates
Vous pouvez spécifier l'opérateur logique AND en tant que et, AND, ou & &, et l'opérateur logique OR en tant que or, OR, ou | |. En outre, vous devez fermer toutes les chaînes à l'aide de guillemets simples, par exemple,'IBM'.

Jointures

Le langage MQL prend en charge les jointures internes gauches des objets de modèle, comme illustré par l'exemple suivant :

SELECT Db2Server.* FROM Db2Server, OracleInstance WHERE Db2Server.port == OracleInstance.port 

Cette jointure renvoie tous les objets de modèle Db2Server dans les cas où les numéros de port de Db2Server et d'OracleInstance sont identiques. Le MQL ne prend pas en charge les combinaisons de jointures extérieures droites, extérieures gauches, complètes ou croisées.

Limitations

Sur DB2 version 9.5, les opérateurs equals et not-equals échouent lorsqu'ils sont exécutés sur des attributs du type de données CLOB dans la base de données. L'exception suivante est affichée :
com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-418, SQLSTATE=42610

Grammaire de l'instruction SELECT

L'exemple suivant montre la grammaire de l'instruction SELECT. Consultez le Javadoc pour plus de détails et les dernières mises à jour.

statement := SELECT attribute-list [EXCLUDING attribute-list]
   FROM [ONLY] class_list { WHERE [expression | 
   exists_expr] }
[ FETCH FIRST n { ROW | ROWS } [ ONLY ]] [ ORDER BY order_list ]
attribute_list := attrib {, attrib}* | * 
class_list := domain_class {, domain_class }*  
class := <a model object class> 
exists_expr := exists( array_attrib op value {logical_op array_attrib op value}* ) 
expression := [ attrib op value | attrib post-op | pre-op ( attrib )
   |[ NOT ] IN ( expression [, ...] ){logical_op expression}* 
value := <data value> 
in_expr := [ NOT ] IN ( expression [, expression ... ])
array_attrib := <series of attributes where at least the second to last 
   attribute is an array > 
op := != | == | > | < | >= | <= | contains | starts-with | ends-with | 
   equals | not-equals | instanceof | eval
logical_op := AND | OR | && | || 
post_op := is-null | is-not-null 
pre_op := lower | upper 
attrib := {class .} [<an attribute of a class>{.embedded_attribute} | * ] 
embedded_attribute := [<embedded attribute>{.embedded_attribute} | *] 
domain_class := {domain_list} class
domain_list := domain {, domain}* : 
domain := <the server from which to pull data from, default: local database> 
order_list := attrib [ ASC | ASCENDING | DESC | DESCENDING ] [ , order_list ]

Les attributs peuvent contenir des caractères génériques. De même, tous les mots clé, tels que SELECT, FROM et WHERE sont insensibles à la casse.

Remarque: value peut être de type attrib , lorsque l'opérateur de base op (! = | == | > | < | > = | < =) est utilisé.

Exemples

L'exemple suivant illustre une requête MQL qui filtre les systèmes informatiques exécutant le système d'exploitation Linux® :

SELECT *
   FROM ComputerSystem
   WHERE OSRunning.OSName == 'Linux'

La requête suivante se sert de l'opérateur EXISTS pour demander une appartenance à une grappe, correspondant à tous les systèmes informatiques qui ont une interface en mode écoute sur ibm.com ou leur masque de réseau défini sur 255.255.255.0 :

SELECT * 
	FROM ComputerSystem 
	WHERE EXISTS (ipInterfaces.ipNetwork.name ends-with '.ibm.com' 
		OR ipInterfaces.ipNetwork.netmask == '255.255.255.0')
La requête suivante sélectionne tous les systèmes informatiques dont l'attribut virtuel est défini sur true :
SELECT * 
   FROM ComputerSystem
   WHERE virtual

La requête suivante sélectionne tous les systèmes informatiques dont l'attribut virtuel est défini sur false :

SELECT * 
   FROM ComputerSystem
   WHERE not virtual
La requête suivante sélectionne tous les systèmes d'exploitation bénéficiant de l'attribut de service dont le nom contient "Sans fil". Comme l'attribut de service installé est disponible uniquement sur le système d'exploitation Windows, vous devez utiliser la fonction de jointure.
SELECT OSInstalled 
	FROM ComputerSystem,WindowsOperatingSystem 
	WHERE ComputerSystem.guid==WindowsOperatingSystem.parent.guid 
	AND 
	EXISTS(WindowsOperatingSystem.installedServices.displayName contains 'Wireless')
La requête suivante sélectionne tous les serveurs d'application (AppServers) avec l'attribut primarySAP qui a pour valeur un port spécifié :
SELECT primarySAP.portNumber,displayName 
    FROM AppServer 
    WHERE primarySAP.portNumber==9084
La requête suivante sélectionne tous les processus d'exécution (RuntimeProcesses) qui parmi leurs ports ont le port 1415. La requête doit utiliser l'opérateur EXISTS car l'attribut ports pour le processus d'exécution (RuntimeProcess) est un attribut de tableau.
SELECT ports.portNumber,displayName 
   FROM RuntimeProcess 
   WHERE EXISTS (ports.portNumber==1415)

Requêtes MQL avec l'opérateur NOT EQUAL TO (!=)

Les requêtes avec l'opérateur NOT EQUAL TO ne renvoient pas de résultats contenant un attribut défini sur NULL car un tel résultat est considéré comme "inconnu".
Exemple
On considère souvent que le nombre de résultats qui sont renvoyés depuis la commande de recherche d'interface de programme d'application suivante :
./api.sh -u <admin> -p <pass> find --count "select * from ComputerSystem"
est égal à la somme des résultats qui sont renvoyés depuis les deux commandes de recherche d'interface de programme d'application suivantes :
./api.sh -u <admin> -p <pass> find --count "select * from ComputerSystem where manufacturer == 'IBM'"
./api.sh -u <admin> -p <pass> find --count "select * from ComputerSystem where manufacturer != 'IBM'"
Cependant, l'attribut Fabricant est défini sur NULL, il est donc exclu des résultats renvoyés depuis la requête qui contient l'opérateur NOT EQUAL TO.
Les requêtes qui contiennent l'opérateur NOT EQUAL TO peuvent se présenter sous les formes suivantes :
select * from ComputerSystem where manufacturer != 'IBM'
select * from ComputerSystem where not(manufacturer == 'IBM')
Si vous souhaitez sélectionner tous les systèmes informatiques avec un fabricant différent d'IBM, utilisez la requête suivante :
select * from ComputerSystem where manufacturer != 'IBM' or manufacturer is-null

Requêtes MQL avec opérateur EVAL (attributs XA et XD uniquement)

Beaucoup d'attributs CDM sont déplacés dans le contenu XML des attributs XA ou XD. Par conséquent, la syntaxe MQL prend en charge un nouvel opérateur eval, qui peut être ajouté à la clause where. L'opérateur eval permet d'interroger les éléments de configuration par les valeurs des attributs étendus ou des instances étendues.

Remarque: tous les exemples de requêtes MQL contiennent des guillemets (\"value\") car il est supposé que les requêtes sont exécutées de la manière suivante:
./api.sh -u username -p password find "MQL query"
Par exemple, la requête suivante a été exécutée pour trouver un système informatique avec l'attribut productID défini sur 'prod1' :
SELECT * FROM ComputerSystem WHERE productID == 'prod1'
La requête équivalente suivante utilise l'opérateur eval :
SELECT * FROM ComputerSystem WHERE XA eval '/xml[attribute[@category=\"taddm_global\" and @name=\"productID\"]=\"prod1\"]'
L'opérateur eval peut être suivi par une expression XPath valide qui renvoie une valeur booléenne true ou false afin de permettre l'exécution d'un filtrage SQL correct par la couche de persistance.
Plus d'exemples
  • Rechercher tous les systèmes informatiques ayant un attribut étendu défini sur la valeur val :
    • MQL :
      SELECT * FROM ComputerSystem WHERE XA eval '/xml[attribute=\"val\"]' 
    • SQL :
      SELECT * FROM compsys WHERE xmlexists('$c/xml[attribute="val1"]' passing compsys.xa_x as "c")
  • Recherchez un système informatique avec l'attribut étendu attr2 , dont la catégorie est définie sur Other et la valeur sur two:
    • MQL :
      SELECT * FROM ComputerSystem WHERE XA eval '/xml/attribute[@name=\"attr2\" and @category=\"Other\" and text()=\"two\"]'
    • SQL :
      SELECT * FROM compsys WHERE xmlexists('$c/xml/attribute[@name="attr2" and and @category="Other" and text()="two"]' passing compsys.xa_x as "c")