goa/doc/devmanual_fr/chap_rql.txt
changeset 0 b97547f5f1fa
equal deleted inserted replaced
-1:000000000000 0:b97547f5f1fa
       
     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'