mangusta 0.4.6 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,106 +4,133 @@ modulo Mangusta
4
4
  # Gestisce un documento incorporato.
5
5
  classe Incorporato
6
6
 
7
+ ##
8
+ # Errori per incorporati.
9
+ classe NonValido < Errore; fine
10
+
7
11
  accessore :nome
8
12
  accessore :tipologia
9
13
  accessore :nome_classe
10
14
 
11
15
  ##
12
16
  # Imposta nome e valore iniziale.
13
- definisci inizializzatore(nome, **parametri)
17
+ definisci inizializzatore(nome, tipologia, **parametri)
14
18
  se_stesso.nome = nome
15
- se_stesso.tipologia = parametri.prendi(:tipologia)
19
+ se_stesso.tipologia = tipologia
16
20
  se_stesso.nome_classe = parametri.prendi(:nome_classe)
17
21
  fine
18
22
 
19
23
  ##
20
- # Ottiene il valore per questo documento incorporato.
24
+ # Classe del documento incorporato.
25
+ definisci classe_documento_incorporato
26
+ Oggetto.ottieni_costante nome_classe
27
+ fine
28
+
29
+ ##
30
+ # Ottiene questo documento incorporato come oggetto.
21
31
  definisci ottieni(padre)
22
- valore_originale = padre.ottieni_valore nome
23
- ritorna _inizializza_documento_incorporato(padre) se valore_originale.non_esiste?
32
+ valore_grezzo = padre.ottieni_variabile_istanza("@#{nome}")
24
33
 
25
34
  considera tipologia
26
35
  quando :singolo
27
- ritorna _inizializza_documento_incorporato(padre, valore_originale) se valore_originale.è_una? Mappa
36
+ incorporato = _ottieni_singolo_da valore_grezzo
28
37
  quando :multiplo
29
- se valore_originale.è_una? Lista e valore_originale.tutti? { |singolo_valore| singolo_valore.è_una? Mappa }
30
- ritorna _inizializza_documento_incorporato(padre, valore_originale)
31
- fine
38
+ incorporato = _ottieni_multiplo_da valore_grezzo
32
39
  fine
33
40
 
34
- padre.ottieni_valore nome
41
+ assegna padre, incorporato se valore_grezzo.nullo?
42
+ incorporato
35
43
  fine
44
+ alias :valore :ottieni
36
45
 
37
46
  ##
38
- # Salva il documento incorporato.
39
- definisci deposita(valore, padre)
47
+ # Assegna il documento incorporato.
48
+ definisci assegna(padre, valore)
40
49
  considera tipologia
41
50
  quando :singolo
42
- alza NonValido, "L'argomento passato deve essere un #{nome_classe} o una Mappa" se
43
- valore.non_è_un? _classe_documento e valore.non_è_una? Mappa
51
+ _assegna_singolo_da padre, valore
52
+ quando :multiplo
53
+ _assegna_multiplo_da padre, valore
54
+ fine
55
+ fine
44
56
 
45
- se valore.è_una? Mappa
46
- documento_incorporato = Mangusta::Utilità
47
- .converti_in_documento valore.fondi(_padre: padre), _classe_documento
57
+ privati
58
+
59
+ ##
60
+ # Ottiene il documento come singolo.
61
+ definisci _ottieni_singolo_da(valore_grezzo)
62
+ se valore_grezzo.nullo?
63
+ classe_documento_incorporato.nuovo
64
+ altrimenti_se valore_grezzo.è_una? Mappa
65
+ classe_documento_incorporato.nuovo **(valore_grezzo.fondi _padre: padre)
66
+ altrimenti_se valore_grezzo.è_un? classe_documento_incorporato
67
+ valore_grezzo
48
68
  altrimenti
49
- documento_incorporato = valore
50
- documento_incorporato.imposta_valore :_padre, padre
69
+ alza NonValido, "non è possibile ottenere il documento incorporato "\
70
+ "perché il valore salvato nel padre non è valido"
51
71
  fine
72
+ fine
52
73
 
53
- padre.imposta_valore nome, documento_incorporato
54
- documento_incorporato
55
- quando :multiplo
56
- alza NonValido, "L'argomento passato deve essere una Lista" se valore.non_è_una? Lista
57
-
58
- lista_di_documenti = valore.tutti? { |singolo_valore| singolo_valore.è_un? _classe_documento }
59
- lista_di_mappe = valore.tutti? { |singolo_valore| singolo_valore.è_una? Mappa }
60
- alza NonValido, "Gli elementi della lista devono essere #{_classe_documento} o Mappa" se
61
- lista_di_documenti == no e lista_di_mappe == no
62
-
63
- se lista_di_mappe
64
- documenti_incorporati = valore.mappa esegui |singolo_valore|
65
- Mangusta::Utilità.converti_in_documento singolo_valore.fondi(_padre: padre), _classe_documento
74
+ ##
75
+ # Ottiene il documento come multiplo.
76
+ definisci _ottieni_multiplo_da(lista_grezza)
77
+ ritorna [] se lista_grezza.nullo?
78
+ alza NonValido, "non è possibile ottenere il documento incorporato "\
79
+ "perché il valore salvato nel padre non è una Lista" se lista_grezza.non_è_una? Lista
80
+
81
+ se lista_grezza.tutti? { |valore_grezzo| valore_grezzo.è_un? classe_documento_incorporato }
82
+ lista_grezza
83
+ altrimenti_se lista_grezza.tutti? { |valore_grezzo| valore_grezzo.è_una? Mappa }
84
+ lista_grezza.mappa esegui |valore_grezzo|
85
+ classe_documento_incorporato.nuovo **(valore_grezzo.fondi _padre: padre)
66
86
  fine
67
87
  altrimenti
68
- documenti_incorporati = valore
69
- documenti_incorporati.per_ognuno esegui |documento_incorporato|
70
- documento_incorporato.imposta_valore :_padre, padre
71
- fine
88
+ alza NonValido, "non è possibile ottenere il documento incorporato "\
89
+ "perché il valore salvato nel padre non è valido"
72
90
  fine
73
-
74
- padre.imposta_valore nome, documenti_incorporati
75
- documenti_incorporati
76
91
  fine
77
- fine
78
-
79
- privati
80
92
 
81
93
  ##
82
- # Classe del documento incorporato.
83
- definisci _classe_documento
84
- Oggetto.ottieni_costante nome_classe
94
+ # Assegna il valore al documento incorporato singolo.
95
+ definisci _assegna_singolo_da(padre, valore)
96
+ alza NonValido, "l'argomento passato deve essere un #{nome_classe} o una Mappa" se
97
+ valore.non_è_un? classe_documento_incorporato e valore.non_è_una? Mappa
98
+
99
+ se valore.è_una? Mappa
100
+ documento_incorporato = classe_documento_incorporato.nuovo **(valore.fondi _padre: padre)
101
+ altrimenti
102
+ documento_incorporato = valore
103
+ documento_incorporato._padre = padre se documento_incorporato.risponde_a? :_padre=
104
+ fine
105
+
106
+ padre.imposta_variabile_istanza "@#{nome}", documento_incorporato
107
+ documento_incorporato
85
108
  fine
86
109
 
87
110
  ##
88
- # Inizializza documento incorporato.
89
- definisci _inizializza_documento_incorporato(padre, valore = Mappa.nuova)
90
- considera tipologia
91
- quando :singolo
92
- documento_incorporato = _classe_documento.nuovo valore.fondi(_padre: padre)
93
- padre.imposta_valore nome, documento_incorporato
94
- documento_incorporato
95
- quando :multiplo
96
- documenti_incorporati = valore.mappa esegui |singolo_valore|
97
- _classe_documento.nuovo valore.fondi(_padre: padre)
111
+ # Assegna il valore al documento incorporato multiplo.
112
+ definisci _assegna_multiplo_da(padre, lista)
113
+ alza NonValido, "l'argomento passato deve essere una Lista di #{nome_classe} o di Mappe" se
114
+ lista.non_è_una? Lista o
115
+ lista.almeno_uno? { |valore| valore.non_è_un? classe_documento_incorporato e valore.non_è_una? Mappa }
116
+
117
+
118
+ se lista.tutti? { |valore| valore.è_un? classe_documento_incorporato }
119
+ documenti_incorporati = lista
120
+ documenti_incorporati.per_ognuno esegui |documento_incorporato|
121
+ documento_incorporato._padre = padre se documento_incorporato.risponde_a? :_padre=
122
+ fine
123
+ altrimenti_se lista.tutti? { |valore| valore.è_una? Mappa }
124
+ documenti_incorporati = lista.mappa esegui |valore|
125
+ classe_documento_incorporato.nuovo **(valore.fondi _padre: padre)
98
126
  fine
99
- padre.imposta_valore nome, documenti_incorporati
100
- documenti_incorporati
127
+ altrimenti
128
+ alza NonValido, "l'argomento passato deve essere una Lista di #{nome_classe} o di Mappe"
101
129
  fine
102
- fine
103
130
 
104
- ##
105
- # Errori per documenti incorporati.
106
- classe NonValido < Errore; fine
131
+ padre.imposta_variabile_istanza "@#{nome}", documenti_incorporati
132
+ documenti_incorporati
133
+ fine
107
134
 
108
135
  fine
109
136
  fine
@@ -0,0 +1,44 @@
1
+ modulo Mangusta
2
+ modulo Documento
3
+ modulo MetodiCondivisi
4
+
5
+ ##
6
+ # Uguaglianza di documenti.
7
+ definisci ==(documento)
8
+ _id == documento._id
9
+ fine
10
+ definisci ===(documento)
11
+ se_stesso == documento
12
+ fine
13
+ definisci eql?(documento)
14
+ se_stesso == documento
15
+ fine
16
+
17
+ ##
18
+ # Rappresentazione univoca del documento.
19
+ # Utilizzato dal metodo `rimuovi_duplicati` di una Lista.
20
+ definisci hash
21
+ _id.in_stringa.hash
22
+ fine
23
+
24
+ ##
25
+ # Ottiene la rappresentazione per stampa dell'oggetto.
26
+ definisci inspect
27
+ se definito? AwesomePrint
28
+ ai
29
+ altrimenti
30
+ "#<#{se_stesso.classe} #{se_stesso.esponi}>"
31
+ fine
32
+ fine
33
+ definisci ai(opzioni = Mappa.nuova)
34
+ se definito? AwesomePrint
35
+ ap = AwesomePrint::Inspector.nuovo opzioni.fondi(indent: 2, ruby19_syntax: si)
36
+ "#<#{se_stesso.classe} #{ap.awesome se_stesso.esponi}>"
37
+ altrimenti
38
+ inspect
39
+ fine
40
+ fine
41
+
42
+ fine
43
+ fine
44
+ fine
@@ -4,119 +4,139 @@ modulo Mangusta
4
4
 
5
5
  ##
6
6
  # Aggiunge un metodo di classe `campo` per creare nuovi campi.
7
- definisci campo(nome, **parametri)
8
- _memorizza_campo nome, **parametri
7
+ definisci campo(nome, **opzioni)
8
+ _definisci_campo nome, **opzioni
9
9
  fine
10
10
 
11
11
  ##
12
- # Aggiunge un metodo di classe `ha_molti` per generare relazioni
13
- # di possedimento.
14
- definisci ha_molti(nome, **parametri)
15
- _memorizza_relazione :ha_molti, nome, **parametri
12
+ # Aggiunge un metodo di classe `appartiene_a` per definire una relazione
13
+ # di appartenenza di un singolo documento.
14
+ definisci appartiene_a(nome, **opzioni)
15
+ _definisci_relazione nome, :appartiene_a, **opzioni
16
16
  fine
17
- alias :ha_molte :ha_molti
18
17
 
19
18
  ##
20
- # Aggiunge un metodo di classe `appartiene_a` per generare relazioni
21
- # di appartenenza.
22
- definisci appartiene_a(nome, **parametri)
23
- _memorizza_relazione :appartiene_a, nome, **parametri
19
+ # Aggiunge un metodo di classe `ha_un` per definire una relazione
20
+ # di appartenenza di un documento.
21
+ definisci ha_un(nome, **opzioni)
22
+ _definisci_relazione nome, :ha_un, **opzioni
24
23
  fine
24
+ alias :ha_uno :ha_un
25
+ alias :ha_una :ha_un
25
26
 
26
27
  ##
27
- # Aggiunge un metodo di classe `ha_e_appartiene_a_molti` per generare relazioni
28
- # di possedimento e appartenenza.
29
- definisci ha_e_appartiene_a_molti(nome, **parametri)
30
- _memorizza_relazione :ha_e_appartiene_a_molti, nome, **parametri
28
+ # Aggiunge un metodo di classe `ha_molti` per definire una relazione
29
+ # di appartenenza di molti documenti.
30
+ definisci ha_molti(nome, **opzioni)
31
+ _definisci_relazione nome, :ha_molti, **opzioni
31
32
  fine
32
- alias :ha_e_appartiene_a_molte :ha_e_appartiene_a_molti
33
+ alias :ha_molte :ha_molti
34
+
35
+ ##
36
+ # Aggiunge un metodo di classe `ha_e_appartiene_a_molti` per definire una relazione
37
+ # di appartenenza di molti documenti con molti documenti.
38
+ definisci ha_e_appartiene_a_molti(nome, **opzioni)
39
+ _definisci_relazione nome, :ha_e_appartiene_a_molti, **opzioni
40
+ fine
41
+ alias :ha_e_appartiene_a_molte :ha_e_appartiene_a_molti
33
42
 
34
43
  ##
35
44
  # Aggiunge un metodo di classe `incorpora_un` per creare documenti
36
45
  # incorporati.
37
- definisci incorpora_un(nome_documento_incorporato, **parametri)
38
- _memorizza_documento_incorporato nome_documento_incorporato, **parametri.fondi(tipologia: :singolo)
46
+ definisci incorpora_un(nome, **opzioni)
47
+ _definisci_incorporato nome, :singolo, **opzioni
39
48
  fine
40
49
  alias :incorpora_una :incorpora_un
41
50
 
42
51
  ##
43
52
  # Aggiunge un metodo di classe `incorpora_molti` per creare documenti
44
53
  # incorporati.
45
- definisci incorpora_molti(nome_documento_incorporato, **parametri)
46
- _memorizza_documento_incorporato nome_documento_incorporato, **parametri.fondi(tipologia: :multiplo)
54
+ definisci incorpora_molti(nome, **opzioni)
55
+ _definisci_incorporato nome, :multiplo, **opzioni
47
56
  fine
48
57
  alias :incorpora_molte :incorpora_molti
49
58
 
50
59
  ##
51
60
  # Aggiunge un metodo di classe `incorporato_in` per ottenere
52
61
  # il documento padre di un documento incorporato.
53
- definisci incorporato_in(nome_documento_padre, **parametri)
54
-
62
+ definisci incorporato_in(nome, **opzioni)
63
+ _definisci_campo :_padre, per_incorporato: si
64
+
65
+ definisci_metodo nome esegui
66
+ _padre
67
+ fine
68
+ definisci_metodo "#{nome}=" esegui |valore|
69
+ _padre = valore
70
+ fine
55
71
  fine
56
72
 
57
73
  privati
58
74
 
59
75
  ##
60
- # Memorizza un nuovo campo.
61
- definisci _memorizza_campo(nome, **parametri)
62
- se_stesso.campi << Mangusta::Documento::Campo.nuovo(nome, **parametri)
63
-
64
- definisci_metodo nome esegui
65
- ottieni_valore nome
76
+ # Inizializza il documento. Questo metodo viene eseguito
77
+ # una volta sola, quando il modulo Mangusta::Documento
78
+ # è incluso in una classe.
79
+ definisci _inizializza_documento
80
+ classe << se_stesso
81
+ accessore :campi
82
+ accessore :relazioni
83
+ accessore :incorporati
66
84
  fine
67
85
 
68
- definisci_metodo "#{nome}?" esegui
69
- ottieni_valore(nome) == vero
70
- fine
86
+ se_stesso.campi = []
87
+ se_stesso.relazioni = []
88
+ se_stesso.incorporati = []
71
89
 
72
- definisci_metodo "#{nome}=" esegui |valore|
73
- imposta_valore nome, valore
90
+ campo :_id
91
+ fine
92
+
93
+ ##
94
+ # Definisce un nuovo campo sul documento.
95
+ definisci _definisci_campo(nome_campo, **opzioni)
96
+ campo = Mangusta::Documento::Campo.nuovo nome_campo, **opzioni
97
+ se_stesso.campi << campo
98
+
99
+ definisci_metodo campo.nome esegui
100
+ campo.valore se_stesso
101
+ fine
102
+ definisci_metodo "#{campo.nome}?" esegui
103
+ campo.valore(se_stesso) == vero
104
+ fine
105
+ definisci_metodo "#{campo.nome}=" esegui |valore|
106
+ campo.assegna se_stesso, valore
74
107
  fine
75
108
  fine
76
109
 
77
110
  ##
78
- # Memorizza una nuova relazione.
79
- definisci _memorizza_relazione(tipologia, nome, **parametri)
80
- relazione = Mangusta::Documento::Relazione.nuova(tipologia, nome, **parametri)
111
+ # Definisce una nuova relazione sul documento.
112
+ definisci _definisci_relazione(nome_relazione, tipologia, **opzioni)
113
+ relazione = Mangusta::Documento::Relazione.nuovo nome_relazione, tipologia, **opzioni
81
114
  se_stesso.relazioni << relazione
82
115
 
83
116
  considera tipologia
84
117
  quando :appartiene_a, :ha_e_appartiene_a_molti
85
- _memorizza_campo relazione.nome_campo
118
+ _definisci_campo relazione.nome_campo, per_relazione: si
86
119
  fine
87
120
 
88
- definisci_metodo nome esegui
89
- valore_relazione = ottieni_valore relazione.nome
90
- ritorna valore_relazione se valore_relazione.esiste?
121
+ definisci_metodo relazione.nome esegui
91
122
  relazione.risolvi se_stesso
92
123
  fine
93
-
94
- definisci_metodo "#{nome}=" esegui |valore|
95
- imposta_valore relazione.nome, valore
96
- considera relazione.tipologia
97
- quando :appartiene_a
98
- ritorna a_meno_che valore.risponde_a? :_id
99
- imposta_valore relazione.nome_campo, valore._id
100
- quando :ha_e_appartiene_a_molti
101
- ritorna a_meno_che valore.è_una? Lista
102
- ritorna a_meno_che valore.tutti? { |singolo_valore| singolo_valore.risponde_a? :_id }
103
- imposta_valore relazione.nome_campo, valore.mappa(&:_id)
104
- fine
124
+ definisci_metodo "#{relazione.nome}=" esegui |valore|
125
+ relazione.assegna se_stesso, valore
105
126
  fine
106
127
  fine
107
128
 
108
129
  ##
109
- # Memorizza un documento incorporato.
110
- definisci _memorizza_documento_incorporato(nome, **parametri)
111
- documento_incorporato = Mangusta::Documento::Incorporato.nuovo(nome, **parametri)
112
- se_stesso.documenti_incorporati << documento_incorporato
130
+ # Definisce un nuovo documento incorporato sul documento.
131
+ definisci _definisci_incorporato(nome_campo, tipologia, **opzioni)
132
+ incorporato = Mangusta::Documento::Incorporato.nuovo nome_campo, tipologia, **opzioni
133
+ se_stesso.incorporati << incorporato
113
134
 
114
- definisci_metodo nome esegui
115
- documento_incorporato.ottieni se_stesso
135
+ definisci_metodo incorporato.nome esegui
136
+ incorporato.ottieni se_stesso
116
137
  fine
117
-
118
- definisci_metodo "#{nome}=" esegui |valore|
119
- documento_incorporato.deposita valore, se_stesso
138
+ definisci_metodo "#{incorporato.nome}=" esegui |valore|
139
+ incorporato.assegna se_stesso, valore
120
140
  fine
121
141
  fine
122
142
 
@@ -1,65 +1,104 @@
1
1
  modulo Mangusta
2
2
  modulo Documento
3
+ ##
4
+ # Gestisce una relazione.
3
5
  classe Relazione
4
6
 
7
+ ##
8
+ # Errori per relazioni.
9
+ classe NonValida < Errore; fine
10
+ classe NonInclusa < Errore; fine
11
+ classe ErrorePropagazione < Errore; fine
12
+
5
13
  accessore :nome
6
14
  accessore :tipologia
7
15
  accessore :nome_campo
8
16
  accessore :nome_campo_relazionato
9
17
  accessore :nome_ripostiglio
10
- accessore :lista_documenti
11
18
 
12
- definisci inizializzatore(tipologia, nome, **parametri)
19
+ ##
20
+ # Inizializza una nuova relazione.
21
+ definisci inizializzatore(nome, tipologia, **parametri)
13
22
  se_stessa.nome = nome
14
23
  se_stessa.tipologia = tipologia
15
- se_stessa.nome_ripostiglio = parametri.prendi(:ripostiglio, nullo)
16
- se_stessa.nome_campo = parametri.prendi(:nome_campo, nullo)
17
- se_stessa.nome_campo_relazionato = parametri.prendi(:nome_campo_relazionato, nullo)
24
+ se_stessa.nome_ripostiglio = parametri.prendi :ripostiglio, nullo
25
+ se_stessa.nome_campo = parametri.prendi :nome_campo, nullo
26
+ se_stessa.nome_campo_relazionato = parametri.prendi :nome_campo_relazionato, nullo
18
27
 
19
- alza NonValida, "È necessario specificare una chiave :ripostiglio per la relazione" se
28
+ alza NonValida, "la relazione `#{tipologia}` non è supportata" se
29
+ tipologia.non_in? [ :appartiene_a, :ha_un, :ha_molti, :ha_e_appartiene_a_molti ]
30
+ alza NonValida, "è necessario specificare una chiave :ripostiglio per la relazione" se
20
31
  nome_ripostiglio.nullo?
21
- alza NonValida, "È necessario specificare una chiave :nome_campo per la relazione" se
32
+ alza NonValida, "è necessario specificare una chiave :nome_campo per la relazione" se
22
33
  nome_campo.nullo? e tipologia.in? [ :appartiene_a, :ha_e_appartiene_a_molti ]
23
- alza NonValida, "È necessario specificare una chiave :nome_campo_relazionato per la relazione" se
24
- nome_campo_relazionato.nullo? e tipologia.in? [ :ha_molti, :ha_e_appartiene_a_molti ]
34
+ alza NonValida, "è necessario specificare una chiave :nome_campo_relazionato per la relazione" se
35
+ nome_campo_relazionato.nullo? e tipologia.in? [ :ha_un, :ha_molti, :ha_e_appartiene_a_molti ]
36
+ fine
37
+
38
+ ##
39
+ # Ripostiglio della relazione.
40
+ definisci ripostiglio
41
+ Oggetto.ottieni_costante nome_ripostiglio
25
42
  fine
26
43
 
27
44
  ##
28
- # Risolve il documento o i documenti relazionati.
45
+ # Carica tutti i documenti in memoria.
46
+ definisci carica_in_memoria
47
+ @documenti_in_memoria = ripostiglio.tutti.lista
48
+ fine
49
+
50
+ ##
51
+ # Ottiene i documenti in memoria.
52
+ definisci documenti_in_memoria
53
+ @documenti_in_memoria
54
+ fine
55
+
56
+ ##
57
+ # Risolve una relazione.
29
58
  definisci risolvi(documento)
30
59
  considera tipologia
31
- quando :ha_molti allora _risolvi_ha_molti(documento)
32
- quando :appartiene_a allora _risolvi_appartiene_a(documento)
33
- quando :ha_e_appartiene_a_molti allora _risolvi_ha_e_appartiene_a_molti(documento)
34
- altrimenti
35
- alza NonValida, "La relazione `#{tipologia}` non è supportata"
60
+ quando :ha_un allora _risolvi_ha_un documento
61
+ quando :ha_molti allora _risolvi_ha_molti documento
62
+ quando :appartiene_a allora _risolvi_appartiene_a documento
63
+ quando :ha_e_appartiene_a_molti allora _risolvi_ha_e_appartiene_a_molti documento
36
64
  fine
37
65
  fine
66
+ alias :valore :risolvi
38
67
 
39
68
  ##
40
- # Propaga la relazione con il valore passato.
41
- definisci propaga(documento, valore)
69
+ # Assegna una relazione.
70
+ definisci assegna(documento, valore)
42
71
  considera tipologia
72
+ quando :ha_un allora ritorna
43
73
  quando :ha_molti allora ritorna
44
- quando :appartiene_a allora ritorna
45
- quando :ha_e_appartiene_a_molti allora _propaga_ha_e_appartiene_a_molti(documento, valore)
46
- altrimenti
47
- alza NonValida, "La relazione `#{tipologia}` non è supportata"
74
+ quando :appartiene_a allora _assegna_appartiene_a documento, valore
75
+ quando :ha_e_appartiene_a_molti allora _assegna_ha_e_appartiene_a_molti documento, valore
48
76
  fine
49
77
  fine
50
78
 
51
79
  ##
52
- # Carica tutti i documenti in memoria.
53
- definisci carica_documenti
54
- @documenti_in_memoria = _ripostiglio.prendi_tutti.lista
80
+ # Propaga la relazione con il valore passato.
81
+ definisci propaga(documento)
82
+ considera tipologia
83
+ quando :ha_un allora ritorna
84
+ quando :ha_molti allora ritorna
85
+ quando :appartiene_a allora ritorna
86
+ quando :ha_e_appartiene_a_molti allora _propaga_ha_e_appartiene_a_molti documento
87
+ fine
55
88
  fine
56
89
 
57
90
  privati
58
91
 
59
92
  ##
60
- # Puntatore al ripostiglio dove risolvere o propagare la relazione.
61
- definisci _ripostiglio
62
- Oggetto.ottieni_costante nome_ripostiglio
93
+ # Risolve la relazione di `ha un`.
94
+ definisci _risolvi_ha_un(documento)
95
+ se @documenti_in_memoria.esiste?
96
+ @documenti_in_memoria.trova esegui |documento_relazionato|
97
+ documento_relazionato.manda(nome_campo_relazionato) == documento._id
98
+ fine
99
+ altrimenti
100
+ ripostiglio.cerca(nome_campo_relazionato => documento._id).primo
101
+ fine
63
102
  fine
64
103
 
65
104
  ##
@@ -67,71 +106,73 @@ modulo Mangusta
67
106
  definisci _risolvi_ha_molti(documento)
68
107
  se @documenti_in_memoria.esiste?
69
108
  @documenti_in_memoria.seleziona esegui |documento_relazionato|
70
- documento_relazionato.ottieni_valore(nome_campo_relazionato) == documento._id
109
+ documento_relazionato.manda(nome_campo_relazionato) == documento._id
71
110
  fine
72
111
  altrimenti
73
- _ripostiglio.cerca(nome_campo_relazionato => documento._id).lista
112
+ ripostiglio.cerca(nome_campo_relazionato => documento._id).lista
74
113
  fine
75
114
  fine
76
115
 
77
116
  ##
78
117
  # Risolve la relazione di `appartiene a`.
79
118
  definisci _risolvi_appartiene_a(documento)
80
- id_documento_relazionato = documento.manda nome_campo
81
- ritorna nullo se id_documento_relazionato.nullo?
119
+ id_documento_appartenente = documento.manda nome_campo
120
+ ritorna nullo se id_documento_appartenente.nullo?
82
121
 
83
122
  se @documenti_in_memoria.esiste?
84
- @documenti_in_memoria.trova esegui |documento_relazionato|
85
- documento_relazionato._id == id_documento_relazionato
123
+ @documenti_in_memoria.trova esegui |documento_appartenuto|
124
+ documento_appartenuto._id == id_documento_appartenente
86
125
  fine
87
126
  altrimenti
88
- _ripostiglio.cerca_per_id id_documento_relazionato
127
+ ripostiglio.cerca_per_id id_documento_appartenente
89
128
  fine
90
129
  fine
91
130
 
92
131
  ##
93
132
  # Risolve la relazione di `ha e appartiene a molti`.
94
133
  definisci _risolvi_ha_e_appartiene_a_molti(documento)
95
- id_documenti_relazionati = documento.manda(nome_campo) || []
134
+ id_documenti_relazionati = documento.manda nome_campo
135
+ id_documenti_relazionati ||= []
136
+ ritorna [] se id_documenti_relazionati.vuoto?
96
137
 
97
- se @lista_documento.esiste?
98
- ritorna [] se id_documenti_relazionati.vuoto?
138
+ se @documenti_in_memoria.esiste?
99
139
  @documenti_in_memoria.seleziona esegui |documento_relazionato|
100
140
  documento_relazionato._id.in? id_documenti_relazionati
101
141
  fine
102
142
  altrimenti
103
- _ripostiglio.cerca(_id: Mappa["$in": id_documenti_relazionati]).lista
143
+ ripostiglio.cerca(_id: Mappa("$in": id_documenti_relazionati)).lista
104
144
  fine
105
145
  fine
106
146
 
107
147
  ##
108
- # Aggiorna la relazione `ha e appartiene a molti`.
109
- definisci _propaga_ha_e_appartiene_a_molti(documento, documenti_relazionati)
110
- se documenti_relazionati.non_è_una? Lista o
111
- documenti_relazionati.alcuni? { |documento_relazionato| documento_relazionato.non_è_un? IdOggetto }
112
- alza ErrorePropagazione, "Per propagare la relazione `ha_e_appartiene_a_molti` "\
113
- "è necessario passare una Lista di elementi di classe IdOggetto"
114
- fine
148
+ # Assegna la relazione di `appartiene a`.
149
+ definisci _assegna_appartiene_a(documento, documento_appartenuto)
150
+ documento.manda "#{nome_campo}=", documento_appartenuto._id
151
+ fine
115
152
 
116
- collezione_relazionata = Mangusta.connessione[_ripostiglio._nome_collezione]
153
+ ##
154
+ # Assegna la relazione di `ha e appartiene a molti`.
155
+ definisci _assegna_ha_e_appartiene_a_molti(documento, documenti_appartenuti)
156
+ documento.manda "#{nome_campo}=", documenti_appartenuti.mappa(&:_id)
157
+ fine
117
158
 
118
- se documenti_relazionati.almeno_uno?
119
- ricerca_documenti_relazionati = Mappa[_id: Mappa["$in": documenti_relazionati]]
120
- collezione_relazionata.aggiorna_molti ricerca_documenti_relazionati,
121
- "$addToSet" => Mappa[nome_campo_relazionato => documento._id]
159
+ ##
160
+ # Aggiorna la relazione `ha e appartiene a molti`.
161
+ definisci _propaga_ha_e_appartiene_a_molti(documento)
162
+ id_documenti_relazionati = documento.manda nome_campo
163
+ ritorna se id_documenti_relazionati.nullo?
164
+
165
+ se id_documenti_relazionati.almeno_uno?
166
+ ricerca_documenti_relazionati = Mappa(_id: Mappa("$in": id_documenti_relazionati))
167
+ ripostiglio.collezione.aggiorna_molti ricerca_documenti_relazionati,
168
+ "$addToSet" => Mappa(nome_campo_relazionato => documento._id)
122
169
  altrimenti
123
170
  ricerca_documenti_relazionati = Mappa(nome_campo_relazionato => Mappa("$type": "array"))
124
- collezione_relazionata.aggiorna_molti ricerca_documenti_relazionati,
125
- "$pullAll" => Mappa[nome_campo_relazionato => [ documento._id ]]
171
+ ripostiglio.collezione.aggiorna_molti ricerca_documenti_relazionati,
172
+ "$pullAll" => Mappa(nome_campo_relazionato => [ documento._id ])
126
173
  fine
127
174
  fine
128
175
 
129
- ##
130
- # Errori per relazioni.
131
- classe NonValida < Errore; fine
132
- classe NonInclusa < Errore; fine
133
- classe ErrorePropagazione < Errore; fine
134
-
135
176
  fine
136
177
  fine
137
178
  fine