mangusta 0.4.6 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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