1 Le langage RQL (Relation Query Language) |
|
2 ======================================== |
|
3 |
|
4 Présentation |
|
5 ------------ |
|
6 * langage mettant l'accent sur le parcours de relations. |
|
7 * Les attributs sont considérés comme des cas particuliers de relations. |
|
8 * RQL s'inspire de SQL mais se veut plus haut niveau. |
|
9 * Une connaissance du schéma CubicWeb définissant l'application est nécessaire. |
|
10 |
|
11 |
|
12 Les différents types de requêtes |
|
13 -------------------------------- |
|
14 Recherche (`Any`) |
|
15 interroger l'entrepôt afin d'extraire des entités et/ou des attributs |
|
16 d'entités. |
|
17 |
|
18 Insertion (`INSERT`) |
|
19 insérer de nouvelles entités dans la base. |
|
20 |
|
21 Mise à jour d'entités, création de relations (`SET`) |
|
22 mettre à jours des entités existantes dans la base, ou de créer des |
|
23 relations entres des entités existantes. |
|
24 |
|
25 Suppression d'entités ou de relation (`DELETE`) |
|
26 supprimer des entités et relations existantes dans la base. |
|
27 |
|
28 |
|
29 Variables et typage |
|
30 ------------------- |
|
31 Les entités et valeurs à parcourir et / ou séléctionner sont représentées dans |
|
32 la requête par des *variables* qui doivent être écrites en majuscule. |
|
33 |
|
34 Les types possibles pour chaque variable sont déduits à partir du schéma en |
|
35 fonction des contraintes présentes dans la requête. |
|
36 |
|
37 On peut contraindre les types possibles pour une variable à l'aide de la |
|
38 relation spéciale `is`. |
|
39 |
|
40 Types de bases |
|
41 -------------- |
|
42 * `String` (litéral: entre doubles ou simples quotes). |
|
43 * `Int`, `Float` (le séparateur étant le '.'). |
|
44 * `Date`, `Datetime`, `Time` (litéral: chaîne YYYY/MM/DD[ hh:mm] ou mots-clés |
|
45 `TODAY` et `NOW`). |
|
46 * `Boolean` (mots-clés `TRUE` et `FALSE`). |
|
47 * mot-clé `NULL`. |
|
48 |
|
49 Opérateurs |
|
50 ---------- |
|
51 * Opérateurs logiques : `AND`, `OR`, `,`. |
|
52 * Opérateurs mathématiques: `+`, `-`, `*`, `/`. |
|
53 * Operateur de comparaisons: `=`, `<`, `<=`, `>=`, `>`, `~=`, `LIKE`, `IN`. |
|
54 |
|
55 * L'opérateur `=` est l'opérateur par défaut. |
|
56 |
|
57 * L'opérateur `LIKE` / `~=` permet d'utiliser le caractère `%` dans une chaine |
|
58 de caractère pour indiquer que la chaîne doit commencer ou terminer par un |
|
59 préfix/suffixe:: |
|
60 |
|
61 Any X WHERE X nom ~= 'Th%' |
|
62 Any X WHERE X nom LIKE '%lt' |
|
63 |
|
64 * L'opérateur `IN` permet de donner une liste de valeurs possibles:: |
|
65 |
|
66 Any X WHERE X nom IN ('chauvat', 'fayolle', 'di mascio', 'thenault') |
|
67 |
|
68 Requête de recherche |
|
69 -------------------- |
|
70 |
|
71 [`DISTINCT`] <type d'entité> V1(, V2)\* |
|
72 [`GROUPBY` V1(, V2)\*] [`ORDERBY` <orderterms>] |
|
73 [`WHERE` <restriction>] |
|
74 [`LIMIT` <value>] [`OFFSET` <value>] |
|
75 |
|
76 :type d'entité: |
|
77 Type de la ou des variables séléctionnées. |
|
78 Le type spécial `Any`, revient à ne pas spécifier de type. |
|
79 :restriction: |
|
80 liste des relations à parcourir sous la forme |
|
81 `V1 relation V2|<valeur constante>` |
|
82 :orderterms: |
|
83 Définition de l'ordre de selection : variable ou n° de colonne suivie de la |
|
84 méthode de tri (`ASC`, `DESC`), ASC étant la valeur par défaut. |
|
85 :note pour les requêtes groupées: |
|
86 Pour les requêtes groupées (i.e. avec une clause `GROUPBY`), toutes les |
|
87 variables sélectionnée doivent être soit groupée soit aggrégée. |
|
88 |
|
89 Exemples - recherche |
|
90 ````````````````````` |
|
91 :: |
|
92 |
|
93 Any X WHERE X eid 53 |
|
94 Personne X |
|
95 Personne X WHERE X travaille_pour S, S nom "logilab" |
|
96 Any E,COUNT(X) GROUPBY E ORDERBY EN WHERE X is E, E name EN |
|
97 Any E,COUNT(X) GROUPBY E ORDERBY 2 WHERE X is E |
|
98 |
|
99 |
|
100 Fonctionnalités avancées |
|
101 ```````````````````````` |
|
102 * Fonctions d'aggrégat : `COUNT`, `MIN`, `MAX`, `SUM`. |
|
103 * Fonctions sur les chaines :`UPPER`, `LOWER`. |
|
104 * Relations optionnelles : |
|
105 |
|
106 * Elles permettent de sélectionner des entités liées ou non à une autre. |
|
107 |
|
108 * Il faut utiliser le `?` derrière la variable pour spécifier que la relation |
|
109 vers celle-ci est optionnelle : |
|
110 |
|
111 - Anomalies d'un projet attachées ou non à une version :: |
|
112 |
|
113 Any X,V WHERE X concerns P, P eid 42, X corrected_in V? |
|
114 |
|
115 - Toutes les fiches et le projet qu'elles documentent le cas échéant :: |
|
116 |
|
117 Any C,P WHERE C is Card, P? documented_by C |
|
118 |
|
119 Négation |
|
120 ```````` |
|
121 * Une requête du type `Document X WHERE NOT X owned_by U` revient à dire "les |
|
122 documents n'ayant pas de relation `owned_by`". |
|
123 * En revanche la requête `Document X WHERE NOT X owned_by U, U login "syt"` |
|
124 revient à dire "les documents n'ayant pas de relation `owned_by` avec |
|
125 l'utilisateur syt". Ils peuvent avoir une relation "owned_by" avec un autre |
|
126 utilisateur. |
|
127 |
|
128 |
|
129 Requête d'insertion |
|
130 ------------------- |
|
131 `INSERT` <type d'entité> V1(, <type d'entité> V2)\* `:` <assignements> |
|
132 [`WHERE` <restriction>] |
|
133 |
|
134 :assignements: |
|
135 liste des relations à assigner sous la forme `V1 relation V2|<valeur constante>` |
|
136 |
|
137 La restriction permet de définir des variables utilisées dans les assignements. |
|
138 |
|
139 Attention, si une restriction est spécifiée, l'insertion est effectuée *pour |
|
140 chaque ligne de résultat renvoyée par la restriction*. |
|
141 |
|
142 Exemples - insertion |
|
143 ````````````````````` |
|
144 * Insertion d'une nouvelle personne nommée 'bidule':: |
|
145 |
|
146 INSERT Personne X: X nom 'bidule' |
|
147 |
|
148 * Insertion d'une nouvelle personne nommée 'bidule', d'une autre nommée |
|
149 'chouette' et d'une relation 'ami' entre eux:: |
|
150 |
|
151 INSERT Personne X, Personne Y: X nom 'bidule', Y nom 'chouette', X ami Y |
|
152 |
|
153 * Insertion d'une nouvelle personne nommée 'bidule' et d'une relation 'ami' avec |
|
154 une personne existante nommée 'chouette':: |
|
155 |
|
156 INSERT Personne X: X nom 'bidule', X ami Y WHERE Y nom 'chouette' |
|
157 |
|
158 |
|
159 Requête de mise à jour |
|
160 ---------------------- |
|
161 `SET` <assignements> |
|
162 [`WHERE` <restriction>] |
|
163 |
|
164 Attention, si une restriction est spécifiée, la mise à jour est effectuée *pour |
|
165 chaque ligne de résultat renvoyée par la restriction*. |
|
166 |
|
167 Exemples - mise à jour |
|
168 ```````````````````````` |
|
169 * Renommage de la personne nommée 'bidule' en 'toto', avec modification du |
|
170 prénom:: |
|
171 |
|
172 SET X nom 'toto', X prenom 'original' WHERE X is 'Person', X nom 'bidule' |
|
173 |
|
174 * Insertion d'une relation de type 'connait' entre les objets reliés par la |
|
175 relation de type 'ami':: |
|
176 |
|
177 SET X know Y WHERE X ami Y |
|
178 |
|
179 Requête de suppression |
|
180 ---------------------- |
|
181 `DELETE` (<type d''entité> V) | (V1 relation v2),... |
|
182 [`WHERE` <restriction>] |
|
183 |
|
184 Attention, si une restriction est spécifiée, la suppression est effectuée *pour |
|
185 chaque ligne de résultat renvoyée par la restriction*. |
|
186 |
|
187 Exemples |
|
188 ```````` |
|
189 * Suppression de la personne nommé 'toto':: |
|
190 |
|
191 DELETE Person X WHERE X nom 'toto' |
|
192 |
|
193 * Suppression de toutes les relations de type 'ami' partant de la personne |
|
194 nommée 'toto':: |
|
195 |
|
196 DELETE X ami Y WHERE X is 'Person', X nom 'toto' |
|