Ipotesi di Sviluppo
Per la fase di esecuzione delle query si e' pensato all'utilizzazione di un DBMS con cui creare le tabelle contenenti i dati temporanei da elaborare.
La classe QueryManagerServant implementa il metodo runQuery() che riceve come parametro la query posta dall'utente, sotto forma di stringa. Il metodo apre una connessione al database, crea una GlobalQuery passando come parametri la connessione,il testo della query e il GlobalSchemaProxy che pemette di risalire allo schema globale su cui e' posta la query. Ottenuto il risultato, che e' un oggetto di tipo MomisResultset, il QueryManagerServant chiude la connessione.
- A livello LocalQuery:
all' interno di questa classe il metodo executeQuery() deve implementare i seguenti passi:
- richiama, utilizzando il GlobalSchemaProxy, il wrapper che corrisponte alla sorgente considerata;
- richiama il metodo runQuery del Wrapper passandogli come parametro il testo della query tradotta;
- ricevuti i risultati dalla fonte locale, deve fornirne una rappresentazione globale seguento le istruzioni contenute negli elementi di UQPlan. Per ogni attributo globale vengono recuperati i valori locali sotto forma di stringhe che vengono passate come parametri al metodo toResult() specializzato all'interno dei diversi elementi di mapping.Il metodo restituisce una stringa che rappresenta la versione globale dei risultati;
- utilizza la connessione a DB2 per creare la tabella in cui inserire i dati elaborati al passo precedente;
- comunicare alla basic query corrispondente la fine del proprio lavoro, aggiungendo un elemento al suo vettore data;
- la LocalQuery confronta del numero di elementi dei vettori subqueries e data, rappresentanti rispettivamente il numero di local query generate e il numero di esecuzioni locali terminate.Se il confronto ha esito positivo viene richiamato il metodo executeQuery() della basic query.
- A livello BasicQuery:
anche all'interno di questa classe viene implementato il metodo executeQuery():
- individua le base extension da ricostruire;
- per ogni base extension, sfruttando le informazioni contenute negli elementi PEClassJoin dell' attributo plan, viene generata un'interrogazione sql contenente nella clausola FROM le classi locali da fondere (e quindi i nomi delle tabelle create nella fase precedente), e nella clausola WHERE i predicati di join.
Lo statement sql viene eseguito sul database, dal ResultSet restituito viene creata una tabella che rappresenta la ricostruzione della base extension;- a questo punto si devono fondere le base extension e, utilizzando gli elementi PEBaseExtJoin contenuti sempre all'interno del vettore plan ,vengono individuate le base extension su cui effettuare gli outerjoin e quelle su cui effettuare la semplice unione, costruendo ed eseguendo i rispettivi statement sql;
- il risultato dell'interrogazione deve essere nuovamente riportato su una tabella su cui eseguire la queryAssembler generata in fase di definizione del Query_Plan;
- i dati ottenuti rappresentano l'esecuzione della basic query.
Driver JDBC e package java.sql
Le classi del package java.sql e i driver JDBC forniscono gli strumenti necessari per aprire una connessione col database, eseguire istruzioni sql e lavorare con gli insiemi ottenuti come risultato.
La classe DriverManager consente ad esempio di effettuare una connessione utilizzando il metodo getConnection(), ottenendo un oggetto in grado di implementare i metodi per interagire col database utilizzando la connessione stabilita.
L'interfaccia Statement() definisce i metodi per l'esecuzione degli statement sql, tra cui executeQuery(), executeUpdate() ed execute().
I risultati di una query eseguita sul database sono restituiti come una tabella di dati, a cui e' possibile accedere attraverso l'interfaccia ResultSet.
All'interno del package queryman sono state create le seguenti classi che utilizzano le classi e i metodi visti in precedenza:
- ConnectionJDBC
Quando viene creato un oggetto appartenente a questa classe, viene aperta una connessione inizializzando i driver. I metodi messi a disposizione da questa classe consentono di eseguire generici statement sql e di visualizzare i risultati; l'esecuzione di una query puo' essere richiamata nel modo consueto oppure utilizzando un metodo particolare che costruisce direttamente, a partire dal ResultSet ottenuto, una tabella sul database.- Create
Implementa la creazione di una tabella.- Insert
Implementa gli statement di inserimento all'interno di una tabella.- DropTable
Implementa la distruzione di una tabella