Eseguito il passo precedente abbiamo ottenuto delle base extension popolate.
Se la base extension selezionata e' unica, sugli oggetti ottenuti viene
posta la query assemblatrice ed il risultato costituisce il risultato
della basic query, in caso contrario deve essere effettuata la
fusione dei singoli risultati seguendo le indicazioni del
plan.
Gli elementi
PEBaseExtJoin contengono le indicazioni necessarie,
stabilendo per ogni coppia di base extension il tipo di operazione da
effettuare:
unione o
outer join.
- Outer join
I problemi di possibili ridondanze sono dovuti a sovrapposizioni fra base
extension che si verificano quando due base extension ne dominano una terza.
L'esempio seguente mostra un caso di questo tipo:
Le base extension iniziali sono 4, 5, 6.Durante la fase di definizione
del query plan la base extension 5 viene scartata in quanto e' dominata
sia dalla 4 che dalla 5, ma questo non e' sufficiente per eliminare
completamente le duplicazioni. La ricostruzione delle base extension 4 e 6
genera infatti insiemi di entita' parzialmente sovrapposti e la
sovrapposizione e' rappresentata proprio dall'estensione della base
extension eliminata.In questo caso quindi e' necessario un outer join fra i
risultati delle due base extension, ma per fare cio' bisogna riuscire ad
identificare all'interno dei due risultati restituiti dalla ricostruzione
delle
base extension gli elementi comuni, cioe' quegli elementi appartenenti alla
base extension 5.
Una proposta per risolvere il problema e' basata sull'uso delle istanze appartenenti alla classe
JoinMap che stabilisce per ogni coppia di classi locali l'insieme di
attributi su cui effettuare il join. Questi attributi identificano in modo
univoco gli elementi all'interno di entrambe le classi e costituiscono quindi una
chiave comune utilizzabile per fondere le classi locali in modo da
rappresentare una sola volta le istanze comuni.
Per quanto riguarda la fusione di base extension nel caso di
outer join, e' possibile individuare un identificatore unico
all'interno dei due risultati utilizzando gli elementi della classe
JoinMap contenenti una classe locale di una base extension e una
classe locale dell'altra.
Nell'esempio precedente il risultato della base extension 4 e' fornito dal
join tra le classi A e C, mentre la base extension 6 dal join fra B e C.
In questo caso quindi le chiavi utilizzabili per l' outer join fra le
due sono:
- k1 (classe A, classe B)
- k2 (classe A,classe C)
- k3 (classe C, classe B)
Avendo a disposizione l'informazione della chiave identificativa di una
singola classe locale, sarebbe possibile, nel caso di presenza di una stessa
classe in entrambe le base extension, utilizzare l'identificatore della
classe per effettuare il join.
- Union
In tutti i casi in cui non si ha dominazione di due base extension su una
terza, si puo' procedere all'unione dei risultati senza rischi di
ridondanze, avendo eliminato le base extension dominate.