mangusta 0.4.6 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|