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.
| 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 :
|
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 :
où :
Par exemple :
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.
| 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 |
- GROUP BY
- HAVING
- DISTINCT
- nested SELECTs
- BETWEEN
- Aggregates
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
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=42610Grammaire 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.
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')SELECT *
FROM ComputerSystem
WHERE virtualLa requête suivante sélectionne tous les systèmes informatiques dont l'attribut virtuel est défini sur false :
SELECT *
FROM ComputerSystem
WHERE not virtualSELECT OSInstalled
FROM ComputerSystem,WindowsOperatingSystem
WHERE ComputerSystem.guid==WindowsOperatingSystem.parent.guid
AND
EXISTS(WindowsOperatingSystem.installedServices.displayName contains 'Wireless')primarySAP qui a pour
valeur un
port spécifié :SELECT primarySAP.portNumber,displayName
FROM AppServer
WHERE primarySAP.portNumber==90841415. 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 :
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"./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../api.sh -u <admin> -p <pass> find --count "select * from ComputerSystem where manufacturer != 'IBM'"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.
\"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"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")
- MQL :
- Recherchez un système informatique avec l'attribut étendu
attr2, dont la catégorie est définie surOtheret la valeur surtwo:- 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")
- MQL :
- Rechercher tous les systèmes informatiques ayant un attribut étendu défini sur la valeur