mangusta 0.4.6 → 0.5.0

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,33 @@
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
+ # Ottiene la rappresentazione per stampa dell'oggetto.
19
+ definisci inspect
20
+ "#<#{se_stesso.classe} #{se_stesso.esponi}>"
21
+ fine
22
+ definisci ai(opzioni = Mappa.nuova)
23
+ se definito? AwesomePrint
24
+ ap = AwesomePrint::Inspector.nuovo opzioni.fondi(indent: 2, ruby19_syntax: si)
25
+ "#<#{se_stesso.classe} #{ap.awesome se_stesso.esponi}>"
26
+ altrimenti
27
+ inspect
28
+ fine
29
+ fine
30
+
31
+ fine
32
+ fine
33
+ fine
@@ -4,119 +4,130 @@ 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_molti` per definire una relazione
20
+ # di appartenenza di molti documenti.
21
+ definisci ha_molti(nome, **opzioni)
22
+ _definisci_relazione nome, :ha_molti, **opzioni
24
23
  fine
24
+ alias :ha_molte :ha_molti
25
25
 
26
26
  ##
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
27
+ # Aggiunge un metodo di classe `ha_e_appartiene_a_molti` per definire una relazione
28
+ # di appartenenza di molti documenti con molti documenti.
29
+ definisci ha_e_appartiene_a_molti(nome, **opzioni)
30
+ _definisci_relazione nome, :ha_e_appartiene_a_molti, **opzioni
31
31
  fine
32
- alias :ha_e_appartiene_a_molte :ha_e_appartiene_a_molti
32
+ alias :ha_e_appartiene_a_molte :ha_e_appartiene_a_molti
33
33
 
34
34
  ##
35
35
  # Aggiunge un metodo di classe `incorpora_un` per creare documenti
36
36
  # incorporati.
37
- definisci incorpora_un(nome_documento_incorporato, **parametri)
38
- _memorizza_documento_incorporato nome_documento_incorporato, **parametri.fondi(tipologia: :singolo)
37
+ definisci incorpora_un(nome, **opzioni)
38
+ _definisci_incorporato nome, :singolo, **opzioni
39
39
  fine
40
40
  alias :incorpora_una :incorpora_un
41
41
 
42
42
  ##
43
43
  # Aggiunge un metodo di classe `incorpora_molti` per creare documenti
44
44
  # incorporati.
45
- definisci incorpora_molti(nome_documento_incorporato, **parametri)
46
- _memorizza_documento_incorporato nome_documento_incorporato, **parametri.fondi(tipologia: :multiplo)
45
+ definisci incorpora_molti(nome, **opzioni)
46
+ _definisci_incorporato nome, :multiplo, **opzioni
47
47
  fine
48
48
  alias :incorpora_molte :incorpora_molti
49
49
 
50
50
  ##
51
51
  # Aggiunge un metodo di classe `incorporato_in` per ottenere
52
52
  # il documento padre di un documento incorporato.
53
- definisci incorporato_in(nome_documento_padre, **parametri)
54
-
53
+ definisci incorporato_in(nome, **opzioni)
54
+ _definisci_campo :_padre, per_incorporato: si
55
+
56
+ definisci_metodo nome esegui
57
+ _padre
58
+ fine
59
+ definisci_metodo "#{nome}=" esegui |valore|
60
+ _padre = valore
61
+ fine
55
62
  fine
56
63
 
57
64
  privati
58
65
 
59
66
  ##
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
67
+ # Inizializza il documento. Questo metodo viene eseguito
68
+ # una volta sola, quando il modulo Mangusta::Documento
69
+ # è incluso in una classe.
70
+ definisci _inizializza_documento
71
+ classe << se_stesso
72
+ accessore :campi
73
+ accessore :relazioni
74
+ accessore :incorporati
66
75
  fine
67
76
 
68
- definisci_metodo "#{nome}?" esegui
69
- ottieni_valore(nome) == vero
70
- fine
77
+ se_stesso.campi = []
78
+ se_stesso.relazioni = []
79
+ se_stesso.incorporati = []
80
+
81
+ campo :_id
82
+ fine
71
83
 
72
- definisci_metodo "#{nome}=" esegui |valore|
73
- imposta_valore nome, valore
84
+ ##
85
+ # Definisce un nuovo campo sul documento.
86
+ definisci _definisci_campo(nome_campo, **opzioni)
87
+ campo = Mangusta::Documento::Campo.nuovo nome_campo, **opzioni
88
+ se_stesso.campi << campo
89
+
90
+ definisci_metodo campo.nome esegui
91
+ campo.valore se_stesso
92
+ fine
93
+ definisci_metodo "#{campo.nome}?" esegui
94
+ campo.valore(se_stesso) == vero
95
+ fine
96
+ definisci_metodo "#{campo.nome}=" esegui |valore|
97
+ campo.assegna se_stesso, valore
74
98
  fine
75
99
  fine
76
100
 
77
101
  ##
78
- # Memorizza una nuova relazione.
79
- definisci _memorizza_relazione(tipologia, nome, **parametri)
80
- relazione = Mangusta::Documento::Relazione.nuova(tipologia, nome, **parametri)
102
+ # Definisce una nuova relazione sul documento.
103
+ definisci _definisci_relazione(nome_relazione, tipologia, **opzioni)
104
+ relazione = Mangusta::Documento::Relazione.nuovo nome_relazione, tipologia, **opzioni
81
105
  se_stesso.relazioni << relazione
82
106
 
83
107
  considera tipologia
84
108
  quando :appartiene_a, :ha_e_appartiene_a_molti
85
- _memorizza_campo relazione.nome_campo
109
+ _definisci_campo relazione.nome_campo, per_relazione: si
86
110
  fine
87
111
 
88
- definisci_metodo nome esegui
89
- valore_relazione = ottieni_valore relazione.nome
90
- ritorna valore_relazione se valore_relazione.esiste?
112
+ definisci_metodo relazione.nome esegui
91
113
  relazione.risolvi se_stesso
92
114
  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
115
+ definisci_metodo "#{relazione.nome}=" esegui |valore|
116
+ relazione.assegna se_stesso, valore
105
117
  fine
106
118
  fine
107
119
 
108
120
  ##
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
121
+ # Definisce un nuovo documento incorporato sul documento.
122
+ definisci _definisci_incorporato(nome_campo, tipologia, **opzioni)
123
+ incorporato = Mangusta::Documento::Incorporato.nuovo nome_campo, tipologia, **opzioni
124
+ se_stesso.incorporati << incorporato
113
125
 
114
- definisci_metodo nome esegui
115
- documento_incorporato.ottieni se_stesso
126
+ definisci_metodo incorporato.nome esegui
127
+ incorporato.ottieni se_stesso
116
128
  fine
117
-
118
- definisci_metodo "#{nome}=" esegui |valore|
119
- documento_incorporato.deposita valore, se_stesso
129
+ definisci_metodo "#{incorporato.nome}=" esegui |valore|
130
+ incorporato.assegna se_stesso, valore
120
131
  fine
121
132
  fine
122
133
 
@@ -1,137 +1,163 @@
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_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
34
+ alza NonValida, "è necessario specificare una chiave :nome_campo_relazionato per la relazione" se
24
35
  nome_campo_relazionato.nullo? e tipologia.in? [ :ha_molti, :ha_e_appartiene_a_molti ]
25
36
  fine
26
37
 
27
38
  ##
28
- # Risolve il documento o i documenti relazionati.
39
+ # Ripostiglio della relazione.
40
+ definisci ripostiglio
41
+ Oggetto.ottieni_costante nome_ripostiglio
42
+ fine
43
+
44
+ ##
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_molti allora _risolvi_ha_molti documento
61
+ quando :appartiene_a allora _risolvi_appartiene_a documento
62
+ quando :ha_e_appartiene_a_molti allora _risolvi_ha_e_appartiene_a_molti documento
36
63
  fine
37
64
  fine
65
+ alias :valore :risolvi
38
66
 
39
67
  ##
40
- # Propaga la relazione con il valore passato.
41
- definisci propaga(documento, valore)
68
+ # Assegna una relazione.
69
+ definisci assegna(documento, valore)
42
70
  considera tipologia
43
71
  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"
72
+ quando :appartiene_a allora _assegna_appartiene_a documento, valore
73
+ quando :ha_e_appartiene_a_molti allora _assegna_ha_e_appartiene_a_molti documento, valore
48
74
  fine
49
75
  fine
50
76
 
51
77
  ##
52
- # Carica tutti i documenti in memoria.
53
- definisci carica_documenti
54
- @documenti_in_memoria = _ripostiglio.prendi_tutti.lista
78
+ # Propaga la relazione con il valore passato.
79
+ definisci propaga(documento)
80
+ considera tipologia
81
+ quando :ha_molti allora ritorna
82
+ quando :appartiene_a allora ritorna
83
+ quando :ha_e_appartiene_a_molti allora _propaga_ha_e_appartiene_a_molti documento
84
+ fine
55
85
  fine
56
86
 
57
87
  privati
58
88
 
59
- ##
60
- # Puntatore al ripostiglio dove risolvere o propagare la relazione.
61
- definisci _ripostiglio
62
- Oggetto.ottieni_costante nome_ripostiglio
63
- fine
64
-
65
89
  ##
66
90
  # Risolve la relazione di `ha molti`.
67
91
  definisci _risolvi_ha_molti(documento)
68
92
  se @documenti_in_memoria.esiste?
69
93
  @documenti_in_memoria.seleziona esegui |documento_relazionato|
70
- documento_relazionato.ottieni_valore(nome_campo_relazionato) == documento._id
94
+ documento_relazionato.manda(nome_campo_relazionato) == documento._id
71
95
  fine
72
96
  altrimenti
73
- _ripostiglio.cerca(nome_campo_relazionato => documento._id).lista
97
+ ripostiglio.cerca(nome_campo_relazionato => documento._id).lista
74
98
  fine
75
99
  fine
76
100
 
77
101
  ##
78
102
  # Risolve la relazione di `appartiene a`.
79
103
  definisci _risolvi_appartiene_a(documento)
80
- id_documento_relazionato = documento.manda nome_campo
81
- ritorna nullo se id_documento_relazionato.nullo?
104
+ id_documento_appartenente = documento.manda nome_campo
105
+ ritorna nullo se id_documento_appartenente.nullo?
82
106
 
83
107
  se @documenti_in_memoria.esiste?
84
- @documenti_in_memoria.trova esegui |documento_relazionato|
85
- documento_relazionato._id == id_documento_relazionato
108
+ @documenti_in_memoria.trova esegui |documento_appartenuto|
109
+ documento_appartenuto._id == id_documento_appartenente
86
110
  fine
87
111
  altrimenti
88
- _ripostiglio.cerca_per_id id_documento_relazionato
112
+ ripostiglio.cerca_per_id id_documento_appartenente
89
113
  fine
90
114
  fine
91
115
 
92
116
  ##
93
117
  # Risolve la relazione di `ha e appartiene a molti`.
94
118
  definisci _risolvi_ha_e_appartiene_a_molti(documento)
95
- id_documenti_relazionati = documento.manda(nome_campo) || []
119
+ id_documenti_relazionati = documento.manda nome_campo
120
+ id_documenti_relazionati ||= []
121
+ ritorna [] se id_documenti_relazionati.vuoto?
96
122
 
97
- se @lista_documento.esiste?
98
- ritorna [] se id_documenti_relazionati.vuoto?
123
+ se @documenti_in_memoria.esiste?
99
124
  @documenti_in_memoria.seleziona esegui |documento_relazionato|
100
125
  documento_relazionato._id.in? id_documenti_relazionati
101
126
  fine
102
127
  altrimenti
103
- _ripostiglio.cerca(_id: Mappa["$in": id_documenti_relazionati]).lista
128
+ ripostiglio.cerca(_id: Mappa("$in": id_documenti_relazionati)).lista
104
129
  fine
105
130
  fine
106
131
 
107
132
  ##
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
133
+ # Assegna la relazione di `appartiene a`.
134
+ definisci _assegna_appartiene_a(documento, documento_appartenuto)
135
+ documento.manda "#{nome_campo}=", documento_appartenuto._id
136
+ fine
115
137
 
116
- collezione_relazionata = Mangusta.connessione[_ripostiglio._nome_collezione]
138
+ ##
139
+ # Assegna la relazione di `ha e appartiene a molti`.
140
+ definisci _assegna_ha_e_appartiene_a_molti(documento, documenti_appartenuti)
141
+ documento.manda "#{nome_campo}=", documenti_appartenuti.mappa(&:_id)
142
+ fine
117
143
 
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]
144
+ ##
145
+ # Aggiorna la relazione `ha e appartiene a molti`.
146
+ definisci _propaga_ha_e_appartiene_a_molti(documento)
147
+ id_documenti_relazionati = documento.manda nome_campo
148
+ ritorna se id_documenti_relazionati.nullo?
149
+
150
+ se id_documenti_relazionati.almeno_uno?
151
+ ricerca_documenti_relazionati = Mappa(_id: Mappa("$in": id_documenti_relazionati))
152
+ ripostiglio.collezione.aggiorna_molti ricerca_documenti_relazionati,
153
+ "$addToSet" => Mappa(nome_campo_relazionato => documento._id)
122
154
  altrimenti
123
155
  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 ]]
156
+ ripostiglio.collezione.aggiorna_molti ricerca_documenti_relazionati,
157
+ "$pullAll" => Mappa(nome_campo_relazionato => [ documento._id ])
126
158
  fine
127
159
  fine
128
160
 
129
- ##
130
- # Errori per relazioni.
131
- classe NonValida < Errore; fine
132
- classe NonInclusa < Errore; fine
133
- classe ErrorePropagazione < Errore; fine
134
-
135
161
  fine
136
162
  fine
137
163
  fine