Le operazioni di ricerca possono essere considerate semplici e composite.
Questo principale distinguo intende differenziare le ricerche che combinano dati di diverse tabelle e ricerche che si basano esclusivamente su una tabella. Le seconde, considerate semplici, sono quelle direttamente eseguibili da eXtraWay dopo un'interpretazione dello statement SQL espresso e la sua trasformazione in un linguaggio noto ed uniforme. Il risultato di questo tipo di ricerche può ricondursi senza problemi all'esito delle comuni selezioni in linguaggio proprietario eXtraWay.
Le altre ricerche, considerate composite, richiedono una lavorazione a più passi. L'esito di quanto rilevato richiede, salvo eccezioni, di essere rappresentato (renderizzato) in forma di tabella temporanea distribuita in righe e colonne come si confà ai classici motori relazionali.
Ciò mette in evidenza come le due diverse tipologie di operazioni si debbano esprimere in modo differente e conducano a risultati altrettanto differenti.
Vediamo quale percorso operativo viene compiuto dal programma nell'elaborazione degli statement SQL di ricerca ricordando che il concetto di tabella proprio dei DataBase relazionali coincide al concetto eXtraWay di unità informativa ed il concetto di colonna coincide al concetto di canale di ricerca:
In primo luogo si deve identificare il punto di partenza. Esso è rappresentato dalla funzione Sql2Mgr_SqlAnalyzer(). Questa funzione può essere evocata tanto dalla funzione standard di ricerca (Ele_Ricerca()) quanto da un'apposita funzione destinata ad elaborare un comando XML. Il primo approccio si presta esclusivamente alle ricerche più semplici in quanto richiede espressamente che il risultato dell'operazione sia rappresentato da un file di selezione standard eXtraWay rappresentato quindi da un elenco più o meno ordinato di identificatori fisici ci unità informative. Il secondo approccio si presta, per contro, a tornare una tabella di righe e colonne che rappresentano la renderizzazione del risultato. Questo secondo caso apre le porta anche al trattamento di altri tipi di statement SQL, come ad esempio inserimenti e modifiche.
Rimaniamo comunque in tema: la funzione Sql2Mgr_SqlAnalyzer(). Questa stabilisce la natura dell'operazione da compiere ed evoca la fuzione più adeguata al suo trattamento, ovvero la Sql2Mgr_Select(). Per le operazioni di ricerca la funzione Sql2Mgr_SqlAnalyzer() verifica inoltre preventivamente le condizioni di ordinamento. Al termine dell'operazione di selezione e prima della produzione dell'output si provvede a compiere l'eventuale ordinamento richiesto.
La funzione Sql2Mgr_Select() è quella che effettivamente svolge tutto il lavoro significativo comportandosi come segue:
- Evoca la funzione Sql2Mgr_LoadSelectColumns(). Questa carica in memoria, in due distinti gruppi, le informazioni inerenti le colonne che si intende selezionare e le colonne che concorrono alla risoluzione dei diversi tipi di Join, sia che siano espressi nella clausola FROM sia che siano espressi in quella WHERE. Alle colonne selezionate vengono aggiunte, indicando che esse sono escluse dal rendering finale, anche le colonne che verranno utilizzate per l'ordinamento e che ancora non fossero presenti tra quelle selezionate.
- Compiuta l'inizializzazione di cui al punto precedente, la funzione entra in un ciclo che interessa tutte le tabelle indicate nella clausola FROM. Per ognuna di esse viene evocata la funzione Sql2Mgr_ExecuteSelect().
- La funzione Sql2Mgr_ExecuteSelect() traduce lo statement SQL di ricerca in una forma consona all'esecuzione di ricerche nel formato eXtraWay e produce un file di selezione per ogni tabella indicata come parametro. Le condizioni di ricerche che interessano canali non appartenenti a tale tabella vengono considerate sempre vere e verranno convalidate o meno in successive operazioni di Join. L'esito della funzione Sql2Mgr_ExecuteSelect() viene messo da parte come una delle componenti del risultato definitivo. Una volta elaborate tute le singole ricerche, una per ogni tabella, si passa alla fase di combinazione e rappresentazione.
- Se si richiede di tornare una selezione eXtraWay e la clausola FROM prevedeva una sola tabella, l'operazione appena svolta dalla funzione Sql2Mgr_ExecuteSelect() è pienamente sufficiente ed il suo risultato viene utilizzato come risultato dell'intera operazione. In ogni altro caso si procede oltre e si entra in un ulteriore ciclo che consta di tra tipi di operazioni:
- Scelta della prossima tabella da caricare in memoria. Questo avviene per mezzo della funzione Sql2Mgr_ChooseBestCol() che ha lo scopo di stabilire quale sia la colonna ottimale (che rappresenta la ricerca appena effettuata su una specifica tabella) da caricare in memoria. La scelta viene effettuata sulla base della dimensione del file di selezione che rappresenta i documenti selezionati ma anche sulla base dei legami di join che legano i campi di questa tabella a campi di altre tabelle.
- Caricamento dei dati corrispondenti alla tabella scelta per mezzo della funzione Sql2Mgr_LoadSelectStep(). Il caricamento interessa solo i dati utilizzati per compiere dei join. Si ritiene, infatti, che il caricamento di questi dati possa avvalersi con successo della cache rappresentata dai titoli delle unità informative evitando il caricamento delle stesse. Combinazione (merge) del semilavorato presente in memoria (corrispondente al risultato di tutti i merge precedenti) con il materiale appena caricato. Tale combinazione tiene conto del tipo di join richiesto.
- Raffinamento delle ricerche già effettuate ma in attesa di essere ancora caricate per mezzo della funzione Sql2Mgr_ReduceSelectStep(). Se le condizioni di join lo consentono è infatti possibile scremare ulteriormente le selezioni ancora da caricare sulla base dei valori di join presenti nel semilavorato in memoria. Ciò consente, alle successive operazioni di merge, di ridurre il numero di operazioni da compiere scartando a priori dati non necessari. La funzione pone le basi e passa i dati raccolti ad altra funzione.
- La funzione Sql2Mgr_ReduceSelection() viene evocata dalla precedente Sql2Mgr_ReduceSelectStep() con un elenco di termini da usare per il raffinamento. La funzione compie il raffinamento per tutti i termini disponibili in base alla memoria disponibile e provvede, se necessario, a richiamarsi recursivamente se il raffinamento non riesce ad aver luogo in un solo ciclo di ricerca.
- A questo punto siamo quasi pronti a tornare l'esito del nostro lavoro. Se si richiede di tornare comunque un file di selezione eXtraWay e siamo giunti sino a qui vuol dire che:
- le colonne che si intendeva selezionare appartengono tutte ad una sola tabella ma esistevano condizioni di join che hanno imposto la lavorazione di cui ai punti precedenti. In questo caso non viene prodotto alcun file e si torna al chiamante perché sia lui ad operare la composizione dell'output in rispetto degli eventuali ordinamento.
- le colonne che si intendeva selezionare appartengono tutte ad una sola tabella ed esiste una sola selezione, senza condizioni di join. In questo caso la selezione effettuata viene tornata come risultato dell'operazione (senza quindi compiere caricamento dei dati dai documenti ecc. ecc) e l'ordinamento che il chiamante (eventualmente) applicherà sarà direttamente mirato al file di selezione prodotto e non ai dati caricati dai documenti. Se per contro si richiede di renderizzare l'esito dell'operazione in righe e colonne si provvede al caricamento delle unità informative ed all'estrazione da esse dei valori delle colonne richieste nella clausola SELECT producendo in memoria una tabella completa per mezzo della funzione Sql2Mgr_LoadSelectResult().
Una volta completata l'operazione si torna alla Sq2Mgr_SqlAnalyzer() la quale procede nel definire li da farsi. Nella fattispecie è quindi possibile compiere unioni o intersezioni di ricerche ed in generale compiere l'ordinamento dell'esito dell'operazione svolta.
Al termine di questa ulteriore fase si compie il rendering vero e proprio dell'output richiesto. Nel caso della selezione il risultato (una tabella temporanea di un certo numero di righe e colonne) viene quindi rappresentato in forma XML per mezzo della funzione Sql2Mgr_SelectXmlOutput(). In caso si debba tornare semplicemente un file di selezione eXtraWay ed esso non sia già stato generato dalla funzione precedentemente evocata, esso viene prodotto per mezzo della funzione Sql2Mgr_SelectSeleOutput().
- A partire da:
- 13.0.2.*
- Date
- 2007/03/01 09:13:17
Torna a Introduzione all'uso di SQL in eXtraWay