Qu’est-ce que QL ?

Effectué

QL est un langage de requête déclaratif orienté objet qui est optimisé pour permettre une analyse efficace des structures de données hiérarchiques, en particulier les bases de données représentant des artefacts de logiciels.

Une base de données est une collection organisée de données. Le modèle de base de données le plus couramment utilisé est un modèle relationnel, qui stocke les données dans des tables. SQL (Structured Query Language) est le langage de requête le plus couramment utilisé pour les bases de données relationnelles.

L’objectif d’un langage de requête est de fournir une plateforme de programmation dans laquelle vous pouvez poser des questions sur les informations stockées dans une base de données. Un système de gestion de base de données gère le stockage et l’administration des données, et fournit aussi le mécanisme d’interrogation. Une requête fait généralement référence aux entités de base de données pertinentes et spécifie diverses conditions (appelées prédicats) qui doivent être satisfaites par les résultats. L’évaluation de requête consiste à vérifier ces prédicats et à générer les résultats. Voici quelques-unes des propriétés souhaitables d’un bon langage de requête et de son implémentation :

  • Spécifications déclaratives : une spécification déclarative décrit les propriétés que le résultat doit satisfaire, au lieu de fournir la procédure pour calculer le résultat. Dans le contexte des langages de requête de base de données, les spécifications déclaratives font abstraction des détails du système de gestion de base de données sous-jacent et des techniques de traitement des requêtes. Cela simplifie grandement l’écriture de requêtes.
  • Expressivité : un langage de requête puissant vous permet d’écrire des requêtes complexes. Cela rend le langage largement applicable.
  • Exécution efficace : les requêtes peuvent être complexes et les bases de données très grandes : il est donc crucial pour l’implémentation d’un langage de requête de traiter et d’exécuter les requêtes de façon efficace.

Dans cette unité, vous allez découvrir les fonctionnalités de base du langage de programmation QL afin de pouvoir écrire vos propres requêtes personnalisées ou mieux comprendre les requêtes open source préexistantes disponibles.

Syntaxe de QL

La syntaxe de QL est similaire à SQL. Toutefois, la sémantique de QL est basée sur Datalog, un langage de programmation logique déclaratif souvent utilisé comme langage de requête. De ce fait, QL est principalement un langage logique, et toutes les opérations dans QL sont des opérations logiques. En outre, QL hérite des prédicats récursifs de Datalog et ajoute la prise en charge des agrégats, ce qui rend les requêtes, même complexes, concises et simples. Prenons l’exemple d’une base de données contenant des relations parent-enfant pour des personnes. Si vous souhaitez trouver le nombre de descendants d’une personne, vous devez généralement :

  1. Rechercher un descendant de la personne donnée, c’est-à-dire un enfant ou un descendant d’un enfant.
  2. Compter le nombre de descendants trouvés à l’aide de l’étape précédente.

Lorsque vous écrivez ce processus dans QL, il ressemble étroitement à cette structure décrite. Notez que l’exemple utilise la récursivité pour rechercher tous les descendants de la personne donnée et un agrégat pour compter le nombre de descendants. La traduction de ces étapes dans la dernière requête sans ajouter de détails procéduraux est possible en raison de la nature déclarative du langage. Le code QL se présenterait comme ceci :

Person getADescendant(Person p) {
  result = p.getAChild() or
  result = getADescendant(p.getAChild())
}

int getNumberOfDescendants(Person p) {
  result = count(getADescendant(p))
}

Orientation objet

L’orientation objet est une caractéristique importante de QL. Les avantages de l’orientation de l’objet sont bien connus. Elle augmente la modularité, active le masquage des informations et permet la réutilisation du code. QL offre tous ces avantages sans compromettre son fondement logique. Cela est possible en définissant un modèle d’objet simple dans lequel les classes sont modélisées en tant que prédicats et l’héritage comme implication. Les bibliothèques mises à la disposition de tous les langages pris en charge font un usage intensif des classes et de l’héritage.

Langages de programmation QL et à usage général

Voici quelques différences conceptuelles et fonctionnelles importantes entre les langages de programmation à usage général et QL :

  • QL n’a pas de fonctionnalités impératives telles que des affectations à des variables ou des opérations de système de fichiers.
  • QL fonctionne sur des ensembles de tuples, et une requête peut être vue comme une séquence complexe d'opérations d'ensemble qui définit le résultat de la requête.
  • La sémantique basée sur les ensembles de QL rend très naturelle le traitement des collections de valeurs sans avoir à vous soucier du stockage efficace, de l’indexation et de leur traversée.

Dans les langages de programmation orientés objet, l’instanciation d’une classe implique la création d’un objet en allouant de la mémoire physique pour conserver l’état de cette instance de la classe. Dans QL, les classes sont simplement des propriétés logiques qui décrivent des ensembles de valeurs déjà existantes.