Algoritmo di riconoscimento
/* Input:
- cluster che da' origine alla classe globale GC
- assiomi estensionali definiti sulle classi del cluster dal progettista
- Mapping Table
*/
begin procedure
- crea tutte le possibili coppie di classi locali
- seleziona solo le coppie non legate da legami gerarchici
- inserisci le coppie in una lista ordinata
for each coppia (Ch,Cj) in lista do begin
- seleziona le chiavi di Ch
- ricava dalla Mapping Table gli attributi globali corrispondenti e inseriscili nel vettore Kh
- seleziona le chiavi di Cj
- ricava dalla Mapping Table gli attributi globali corrispondenti e inseriscili nel vettore Kj
- ricava le rule estensionali che interessano (Ch,Cj) e inseriscile in un vettore Ehj
if Ehj vuoto then ricava eventuali rule estensionali implicite e inseriscile in Ihjend.
switch Ehj contiene (ASSIOMA ESTENSIONALE){
case DISGIUNZIONE:"non c'e' necessita' di join"
case EQUIVALENZA:if Kh non vuoto and Kj non vuoto then confronta le "chiavi globali" e inserisci quelle uguali in Riscase INCLUSIONE: /*(Ch isa Cj)*/
if Ris non vuoto then Ris contiene gli attributi di join
else /*siamo nel caso di chiavi disomogenee o di assenza di chiavi*/
if Kh vuoto and Kj non vuoto then
- ricava gli attributi globali di Ch e mettili nel vettore Ah
- confronta Ah con Kj
- inserisci eventuali corrispondenze in Ris1
- if Ris1 non vuoto then Ris1 contiene gli attributi di join
else intervento del progettista
else if Kh non vuoto and Kj vuoto then
- ricava gli attributi globali di Cj e mettili nel vettore Aj
- confronta Aj con Kh
- inserisci eventuali corrispondenze in Ris2
- if Ris2 non vuoto then Ris2 contiene gli attributi di join
else intervento del progettista
else if Kh non vuoto and Kj non vuoto then
- ricava gli attributi globali di Cj e mettili nel vettore Aj
- confronta Aj con Kh
- inserisci eventuali corrispondenze in Ris1
- ricava gli attributi globali di Ch e mettili nel vettore Ah
- confronta Ah con Kj
- inserisci eventuali corrispondenze in Ris2
- if Ris1 non vuoto or Ris2 non vuoto then Ris1 o Ris 2 contiene gli attributi di join
else intervento del progettista
if Kh non vuoto and Kj non vuoto then confronta le "chiavi globali" e inserisci quelle uguali in Riscase NULL:
if Ris non vuoto then Ris contiene gli attributi di join
else /*siamo nel caso di chiavi disomogenee o di assenza di chiavi*/
if Kh vuoto and Kj non vuoto then
- ricava gli attributi globali di Ch e mettili nel vettore Ah
- confronta Ah con Kj
- inserisci eventuali corrispondenze in Ris1
- if Ris1 non vuoto then Ris1 contiene gli attributi di join
else intervento del progettista
else if Kh non vuoto and Kj non vuoto then
- ricava gli attributi globali di Ch e mettili nel vettore Ah
- confronta Ah con Kj
- inserisci eventuali corrispondenze in Ris2
- if Ris2 non vuoto then Ris 2 contiene gli attributi di join
else intervento del progettista
switch Ihj contiene (ASSIOMA ESTENSIONALE){
case DISGIUNZIONE:"non c'e' necessita' di join"
case EQUIVALENZA: ripeti analisi precedenti
case INCLUSIONE: ripeti analisi precedenti
case NULL:
- caso di SOVRAPPOSIZIONE
- necessario l'intervento del progettista
}
}