goa/doc/devmanual_fr/chap_rql.txt
author Julien Jehannet <Julien Jehannet <julien.jehannet@logilab.fr>>
Tue, 02 Mar 2010 21:48:36 +0100
branchstable
changeset 4783 6dc34d4cf892
parent 0 b97547f5f1fa
permissions -rw-r--r--
[F] views: fix 2 unicode errors 1. You can now use valid unicode strings in ValidationError exception. Previously, if 'err' contains unicode, UnicodeDecodeError was raised by format_errors() >>> templstr = '<li>%s</li>\n' >>> e = ValidationError(None, {None: u'oué, une exception en unicode!'}) >>> templstr % e '<li>None (None): ou\xc3\xa9, une exception en unicode!</li>\n' >>> templstr = u'<li>%s</li>\n' >>> templstr % e u'<li>None (None): ou\xe9, une exception en unicode!</li>\n' 2. The message of an Exception can contains unicode. But it now properly managed by “informal” string representation. We can easily fix the problem by using the Exception.message attribute that still contains the original message. >>> a = AssertionError(u'séfdsdf') >>> a.message u's\xe9fdsdf' >>> str(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 1: ordinal not in range(128) >>> a = ValueError(u'fsdfsdéfsdfs') >>> str(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 6: ordinal not in range(128) >>> a ValueError(u'fsdfsd\xe9fsdfs',) >>> unicode(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 6: ordinal not in range(128) >>> a.message u'fsdfsd\xe9fsdfs'

Le langage RQL (Relation Query Language)
========================================

Prsentation
------------
* langage mettant l'accent sur le parcours de relations.
* Les attributs sont considrs comme des cas particuliers de relations.
* RQL s'inspire de SQL mais se veut plus haut niveau.
* Une connaissance du schma CubicWeb dfinissant l'application est ncessaire.


Les diffrents types de requtes
--------------------------------
Recherche (`Any`)
  interroger l'entrept afin d'extraire des entits et/ou des attributs
  d'entits.

Insertion (`INSERT`)
  insrer de nouvelles entits dans la base.

Mise  jour d'entits, cration de relations (`SET`)
  mettre  jours des entits existantes dans la base, ou de crer des
  relations entres des entits existantes.

Suppression d'entits ou de relation (`DELETE`)
  supprimer des entits et relations existantes dans la base.


Variables et typage
-------------------
Les entits et valeurs  parcourir et / ou slctionner sont reprsentes dans
la requte par des *variables* qui doivent tre crites en majuscule.

Les types possibles pour chaque variable sont dduits  partir du schma en
fonction des contraintes prsentes dans la requte.

On peut contraindre les types possibles pour une variable  l'aide de la
relation spciale `is`.

Types de bases
--------------
* `String` (litral: entre doubles ou simples quotes).
* `Int`, `Float` (le sparateur tant le '.').
* `Date`, `Datetime`, `Time` (litral: chane YYYY/MM/DD[ hh:mm] ou mots-cls
  `TODAY` et `NOW`).
* `Boolean` (mots-cls `TRUE` et `FALSE`).
* mot-cl `NULL`.

Oprateurs
----------
* Oprateurs logiques : `AND`, `OR`, `,`.
* Oprateurs mathmatiques: `+`, `-`, `*`, `/`.
* Operateur de comparaisons: `=`, `<`, `<=`, `>=`, `>`, `~=`, `LIKE`, `IN`.

  * L'oprateur `=` est l'oprateur par dfaut.

  * L'oprateur `LIKE` / `~=` permet d'utiliser le caractre `%` dans une chaine
    de caractre pour indiquer que la chane doit commencer ou terminer par un
    prfix/suffixe::
    
      Any X WHERE X nom ~= 'Th%'
      Any X WHERE X nom LIKE '%lt'

  * L'oprateur `IN` permet de donner une liste de valeurs possibles::

      Any X WHERE X nom IN ('chauvat', 'fayolle', 'di mascio', 'thenault')

Requte de recherche
--------------------

  [`DISTINCT`] <type d'entit> V1(, V2)\*
  [`GROUPBY` V1(, V2)\*]  [`ORDERBY` <orderterms>]
  [`WHERE` <restriction>] 
  [`LIMIT` <value>] [`OFFSET` <value>]

:type d'entit:
  Type de la ou des variables slctionnes. 
  Le type spcial `Any`, revient  ne pas spcifier de type.
:restriction:
  liste des relations  parcourir sous la forme 
    `V1 relation V2|<valeur constante>`
:orderterms:
  Dfinition de l'ordre de selection : variable ou n de colonne suivie de la
  mthode de tri (`ASC`, `DESC`), ASC tant la valeur par dfaut.
:note pour les requtes groupes:
  Pour les requtes groupes (i.e. avec une clause `GROUPBY`), toutes les
  variables slectionne doivent tre soit groupe soit aggrge.

Exemples - recherche
`````````````````````
::

      Any X WHERE X eid 53
      Personne X
      Personne X WHERE X travaille_pour S, S nom "logilab"
      Any E,COUNT(X) GROUPBY E ORDERBY EN WHERE X is E, E name EN 
      Any E,COUNT(X) GROUPBY E ORDERBY 2 WHERE X is E 


Fonctionnalits avances
````````````````````````
* Fonctions d'aggrgat : `COUNT`, `MIN`, `MAX`, `SUM`.
* Fonctions sur les chaines :`UPPER`, `LOWER`.
* Relations optionnelles :

  * Elles permettent de slectionner des entits lies ou non  une autre.

  * Il faut utiliser le `?` derrire la variable pour spcifier que la relation
    vers celle-ci est optionnelle :

    - Anomalies d'un projet attaches ou non  une version ::

        Any X,V WHERE X concerns P, P eid 42, X corrected_in V?

    - Toutes les fiches et le projet qu'elles documentent le cas chant ::

        Any C,P WHERE C is Card, P? documented_by C

Ngation
````````
* Une requte du type `Document X WHERE NOT X owned_by U` revient  dire "les
  documents n'ayant pas de relation `owned_by`". 
* En revanche la requte `Document X WHERE NOT X owned_by U, U login "syt"`
  revient  dire "les  documents n'ayant pas de relation `owned_by` avec
  l'utilisateur syt". Ils peuvent avoir une relation "owned_by" avec un autre
  utilisateur.


Requte d'insertion
-------------------
   `INSERT` <type d'entit> V1(, <type d'entit> V2)\* `:` <assignements>
   [`WHERE` <restriction>] 

:assignements:
  liste des relations  assigner sous la forme `V1 relation V2|<valeur constante>`

La restriction permet de dfinir des variables utilises dans les assignements.

Attention, si une restriction est spcifie, l'insertion est effectue *pour
chaque ligne de rsultat renvoye par la restriction*.

Exemples - insertion
`````````````````````
* Insertion d'une nouvelle personne nomme 'bidule'::

       INSERT Personne X: X nom 'bidule'

* Insertion d'une nouvelle personne nomme 'bidule', d'une autre nomme
  'chouette' et d'une relation 'ami' entre eux::

       INSERT Personne X, Personne Y: X nom 'bidule', Y nom 'chouette', X ami Y

* Insertion d'une nouvelle personne nomme 'bidule' et d'une relation 'ami' avec
  une personne existante nomme 'chouette'::

       INSERT Personne X: X nom 'bidule', X ami Y WHERE Y nom 'chouette'


Requte de mise  jour
----------------------
   `SET` <assignements>
   [`WHERE` <restriction>] 

Attention, si une restriction est spcifie, la mise  jour est effectue *pour
chaque ligne de rsultat renvoye par la restriction*.

Exemples - mise  jour 
````````````````````````
* Renommage de la personne nomme 'bidule' en 'toto', avec modification du
  prnom::

       SET X nom 'toto', X prenom 'original' WHERE X is 'Person', X nom 'bidule'

* Insertion d'une relation de type 'connait' entre les objets relis par la
  relation de type 'ami'::

       SET X know Y WHERE X ami Y

Requte de suppression
----------------------
   `DELETE` (<type d''entit> V) | (V1 relation v2),...
   [`WHERE` <restriction>] 

Attention, si une restriction est spcifie, la suppression est effectue *pour
chaque ligne de rsultat renvoye par la restriction*.

Exemples
````````
* Suppression de la personne nomm 'toto'::

       DELETE Person X WHERE X nom 'toto'

* Suppression de toutes les relations de type 'ami' partant de la personne
  nomme 'toto'::

       DELETE X ami Y WHERE X is 'Person', X nom 'toto'