Che cos'è QL?
QL è un linguaggio di query dichiarativo e orientato agli oggetti, ottimizzato per abilitare l'analisi efficiente delle strutture di dati gerarchiche, in particolare i database che rappresentano gli artefatti software.
Un database è una raccolta organizzata di dati. Il modello di database più comunemente utilizzato è il modello relazionale, che memorizza i dati in tabelle. SQL (Structured Query Language) è il linguaggio di query più utilizzato per i database relazionali.
Lo scopo di un linguaggio di query consiste nel fornire una piattaforma di programmazione in cui è possibile porre domande sulle informazioni archiviate in un database. Un sistema di gestione del database gestisce l'archiviazione e l'amministrazione dei dati e fornisce il meccanismo di query. Una query fa in genere riferimento alle entità di database pertinenti e specifica diverse condizioni, denominate predicati, che devono essere soddisfatte dai risultati. La valutazione delle query comporta il controllo di questi predicati e la generazione dei risultati. Alcune delle proprietà desiderabili di un linguaggio di query valido e la relativa implementazione includono:
- Specifiche dichiarative: una specifica dichiarativa descrive le proprietà che il risultato deve soddisfare, invece di fornire la procedura per il calcolo del risultato. Nel contesto dei linguaggi di query del database, le specifiche dichiarative eliminano tramite astrazione i dettagli del sistema di gestione del database sottostante e delle tecniche di elaborazione delle query. Questo semplifica notevolmente la scrittura di query.
- Espressività: un linguaggio di query potente consente di scrivere query complesse. Ciò rende il linguaggio ampiamente applicabile.
- Esecuzione efficiente: le query possono essere complesse e i database possono essere molto grandi, quindi è fondamentale per un'implementazione del linguaggio di query elaborare ed eseguire query in modo efficiente.
In questa unità verranno fornite informazioni sulle funzionalità di base del linguaggio di programmazione QL in modo da consentire di scrivere query personalizzate o comprendere meglio le query open source preesistenti disponibili.
Sintassi di QL
La sintassi di QL è simile a SQL. Tuttavia, la semantica di QL si basa su Datalog, un linguaggio di programmazione della logica dichiarativa spesso usato come linguaggio di query. Ciò rende QL principalmente un linguaggio per la logica e tutte le operazioni in QL sono operazioni logiche. QL eredita inoltre predicati ricorsivi da Datalog e aggiunge il supporto per le aggregazioni, rendendo concise e semplici anche le query complesse. Si consideri ad esempio un database contenente relazioni padre-figlio per le persone. Se si vuole trovare il numero di discendenti di una persona, in genere:
- Trovare un discendente di una persona specifica, ovvero un figlio o un discendente di un figlio.
- Contare il numero di discendenti trovati usando il passaggio precedente.
Quando si scrive questo processo in QL, è simile a questa struttura descritta. Si noti che l'esempio ha usato la ricorsione per trovare tutti i discendenti della persona specificata e un'aggregazione per contare il numero di discendenti. La natura dichiarativa della lingua consente la traduzione di questi passaggi nella query finale senza aggiungere alcun dettagli procedurale. Il codice QL sarà simile al seguente:
Person getADescendant(Person p) {
result = p.getAChild() or
result = getADescendant(p.getAChild())
}
int getNumberOfDescendants(Person p) {
result = count(getADescendant(p))
}
Orientamento agli oggetti
L'orientamento a oggetti è una funzionalità importante di QL. I vantaggi dell'orientamento degli oggetti sono noti. Aumenta la modularità, abilita la nascondere le informazioni e consente il riutilizzo del codice. QL offre tutti questi vantaggi senza compromettere la base logica. Per ottenere questo risultato, si definisce un modello a oggetti semplice in cui le classi vengono modellate come predicati e l'ereditarietà come implicazioni. Le librerie rese disponibili per tutti i linguaggi supportati usano ampiamente le classi e l'ereditarietà.
Linguaggi di programmazione per utilizzo generico e QL
Di seguito sono riportate alcune differenze concettuali e funzionali importanti tra linguaggi di programmazione per utilizzo generico e QL:
- QL non dispone di funzionalità imperative, ad esempio assegnazioni a variabili o operazioni del file system.
- QL opera su set di tuple e una query può essere vista come una sequenza complessa di operazioni sui set che definisce il risultato della query.
- La semantica basata su set di QL rende molto naturale elaborare raccolte di valori senza doversi preoccupare dell'archiviazione, dell'indicizzazione e dell'attraversamento in modo efficiente.
In linguaggi di programmazione orientati a oggetti, la creazione di istanze di una classe comporta la creazione di un oggetto mediante allocazione di memoria fisica per contenere lo stato di tale istanza della classe. In QL le classi sono solo proprietà logiche che descrivono set di valori già esistenti.