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.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +10 -17
- data/lib/mangusta/core_ext/mongo.rb +1 -0
- data/lib/mangusta/documento.ir +52 -131
- data/lib/mangusta/documento/campo.ir +37 -3
- data/lib/mangusta/documento/espositore.ir +116 -40
- data/lib/mangusta/documento/incorporato.ir +88 -61
- data/lib/mangusta/documento/metodi_condivisi.ir +33 -0
- data/lib/mangusta/documento/metodi_di_classe.ir +72 -61
- data/lib/mangusta/documento/relazione.ir +86 -60
- data/lib/mangusta/ricerca.ir +75 -0
- data/lib/mangusta/ripostiglio.ir +221 -151
- data/lib/mangusta/versione.ir +1 -1
- metadata +4 -4
- data/lib/mangusta/ripostiglio/risultato_ricerca.ir +0 -95
- data/lib/mangusta/utilit/303/240/convertitori.ir +0 -91
@@ -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 =
|
19
|
+
se_stesso.tipologia = tipologia
|
16
20
|
se_stesso.nome_classe = parametri.prendi(:nome_classe)
|
17
21
|
fine
|
18
22
|
|
19
23
|
##
|
20
|
-
#
|
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
|
-
|
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
|
-
|
36
|
+
incorporato = _ottieni_singolo_da valore_grezzo
|
28
37
|
quando :multiplo
|
29
|
-
|
30
|
-
ritorna _inizializza_documento_incorporato(padre, valore_originale)
|
31
|
-
fine
|
38
|
+
incorporato = _ottieni_multiplo_da valore_grezzo
|
32
39
|
fine
|
33
40
|
|
34
|
-
padre.
|
41
|
+
assegna padre, incorporato se valore_grezzo.nullo?
|
42
|
+
incorporato
|
35
43
|
fine
|
44
|
+
alias :valore :ottieni
|
36
45
|
|
37
46
|
##
|
38
|
-
#
|
39
|
-
definisci
|
47
|
+
# Assegna il documento incorporato.
|
48
|
+
definisci assegna(padre, valore)
|
40
49
|
considera tipologia
|
41
50
|
quando :singolo
|
42
|
-
|
43
|
-
|
51
|
+
_assegna_singolo_da padre, valore
|
52
|
+
quando :multiplo
|
53
|
+
_assegna_multiplo_da padre, valore
|
54
|
+
fine
|
55
|
+
fine
|
44
56
|
|
45
|
-
|
46
|
-
|
47
|
-
|
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
|
-
|
50
|
-
|
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
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
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
|
-
|
69
|
-
|
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
|
-
#
|
83
|
-
definisci
|
84
|
-
|
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
|
-
#
|
89
|
-
definisci
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
documenti_incorporati =
|
97
|
-
|
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
|
-
|
100
|
-
|
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
|
-
|
106
|
-
|
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, **
|
8
|
-
|
7
|
+
definisci campo(nome, **opzioni)
|
8
|
+
_definisci_campo nome, **opzioni
|
9
9
|
fine
|
10
10
|
|
11
11
|
##
|
12
|
-
# Aggiunge un metodo di classe `
|
13
|
-
# di
|
14
|
-
definisci
|
15
|
-
|
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 `
|
21
|
-
# di appartenenza.
|
22
|
-
definisci
|
23
|
-
|
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
|
28
|
-
# di
|
29
|
-
definisci ha_e_appartiene_a_molti(nome, **
|
30
|
-
|
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
|
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(
|
38
|
-
|
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(
|
46
|
-
|
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(
|
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
|
-
#
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
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
|
-
|
69
|
-
|
70
|
-
|
77
|
+
se_stesso.campi = []
|
78
|
+
se_stesso.relazioni = []
|
79
|
+
se_stesso.incorporati = []
|
80
|
+
|
81
|
+
campo :_id
|
82
|
+
fine
|
71
83
|
|
72
|
-
|
73
|
-
|
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
|
-
#
|
79
|
-
definisci
|
80
|
-
relazione = Mangusta::Documento::Relazione.
|
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
|
-
|
109
|
+
_definisci_campo relazione.nome_campo, per_relazione: si
|
86
110
|
fine
|
87
111
|
|
88
|
-
definisci_metodo
|
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
|
-
|
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
|
-
#
|
110
|
-
definisci
|
111
|
-
|
112
|
-
se_stesso.
|
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
|
115
|
-
|
126
|
+
definisci_metodo incorporato.nome esegui
|
127
|
+
incorporato.ottieni se_stesso
|
116
128
|
fine
|
117
|
-
|
118
|
-
|
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
|
-
|
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
|
16
|
-
se_stessa.nome_campo = parametri.prendi
|
17
|
-
se_stessa.nome_campo_relazionato = parametri.prendi
|
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, "
|
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, "
|
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, "
|
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
|
-
#
|
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
|
32
|
-
quando :appartiene_a allora _risolvi_appartiene_a
|
33
|
-
quando :ha_e_appartiene_a_molti allora _risolvi_ha_e_appartiene_a_molti
|
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
|
-
#
|
41
|
-
definisci
|
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
|
45
|
-
quando :ha_e_appartiene_a_molti allora
|
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
|
-
#
|
53
|
-
definisci
|
54
|
-
|
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.
|
94
|
+
documento_relazionato.manda(nome_campo_relazionato) == documento._id
|
71
95
|
fine
|
72
96
|
altrimenti
|
73
|
-
|
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
|
-
|
81
|
-
ritorna nullo se
|
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 |
|
85
|
-
|
108
|
+
@documenti_in_memoria.trova esegui |documento_appartenuto|
|
109
|
+
documento_appartenuto._id == id_documento_appartenente
|
86
110
|
fine
|
87
111
|
altrimenti
|
88
|
-
|
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
|
119
|
+
id_documenti_relazionati = documento.manda nome_campo
|
120
|
+
id_documenti_relazionati ||= []
|
121
|
+
ritorna [] se id_documenti_relazionati.vuoto?
|
96
122
|
|
97
|
-
se @
|
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
|
-
|
128
|
+
ripostiglio.cerca(_id: Mappa("$in": id_documenti_relazionati)).lista
|
104
129
|
fine
|
105
130
|
fine
|
106
131
|
|
107
132
|
##
|
108
|
-
#
|
109
|
-
definisci
|
110
|
-
|
111
|
-
|
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
|
-
|
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
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
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
|
-
|
125
|
-
"$pullAll" => Mappa
|
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
|