mangusta 0.4.2 → 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/.gitignore +1 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +10 -17
- data/lib/mangusta.ir +6 -5
- data/lib/mangusta/core_ext/mongo.rb +1 -0
- data/lib/mangusta/documento.ir +55 -132
- data/lib/mangusta/documento/campo.ir +37 -3
- data/lib/mangusta/documento/espositore.ir +116 -40
- data/lib/mangusta/documento/incorporato.ir +89 -62
- 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 +87 -60
- data/lib/mangusta/ricerca.ir +75 -0
- data/lib/mangusta/ripostiglio.ir +221 -147
- 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
@@ -0,0 +1,75 @@
|
|
1
|
+
modulo Mangusta
|
2
|
+
classe Ricerca
|
3
|
+
|
4
|
+
##
|
5
|
+
# Inizializza una nuova ricerca.
|
6
|
+
definisci inizializzatore(ripostiglio, parametri, ordinamento = Mappa.nuova)
|
7
|
+
@ripostiglio = ripostiglio
|
8
|
+
@parametri_ricerca = parametri
|
9
|
+
@ordinamento_ricerca = Mappa[sort: ordinamento]
|
10
|
+
@relazioni_incluse = []
|
11
|
+
fine
|
12
|
+
|
13
|
+
##
|
14
|
+
# Prende il primo elemento trovato.
|
15
|
+
definisci primo
|
16
|
+
primo_documento = _esegui_ricerca.primo
|
17
|
+
ritorna nullo se primo_documento.nullo?
|
18
|
+
@ripostiglio.classe_documento.nuovo **primo_documento
|
19
|
+
fine
|
20
|
+
alias :prima :primo
|
21
|
+
|
22
|
+
##
|
23
|
+
# Ritorna l'oggetto ricerca come Lista documenti.
|
24
|
+
definisci lista
|
25
|
+
_esegui_ricerca.lista.mappa esegui |documento_in_json|
|
26
|
+
@ripostiglio.classe_documento.nuovo **documento_in_json
|
27
|
+
fine
|
28
|
+
fine
|
29
|
+
|
30
|
+
##
|
31
|
+
# Conta i risultati.
|
32
|
+
definisci conteggio
|
33
|
+
_esegui_ricerca.conteggio
|
34
|
+
fine
|
35
|
+
alias :conteggia :conteggio
|
36
|
+
|
37
|
+
##
|
38
|
+
# Aggiunge parametri alla ricerca.
|
39
|
+
definisci cerca(**nuovi_parametri_ricerca)
|
40
|
+
@parametri_ricerca.fondi! nuovi_parametri_ricerca
|
41
|
+
se_stessa
|
42
|
+
fine
|
43
|
+
|
44
|
+
##
|
45
|
+
# Include relazioni del documento.
|
46
|
+
definisci includi_relazioni(*relazioni_da_includere)
|
47
|
+
relazioni_da_includere.per_ognuna esegui |nome_relazione_da_includere|
|
48
|
+
relazione = @ripostiglio.classe_documento.relazioni.trova esegui |relazione|
|
49
|
+
relazione.nome == nome_relazione_da_includere
|
50
|
+
fine
|
51
|
+
prossima se relazione.nulla?
|
52
|
+
@relazioni_incluse << relazione
|
53
|
+
fine
|
54
|
+
se_stessa
|
55
|
+
fine
|
56
|
+
|
57
|
+
privati
|
58
|
+
|
59
|
+
##
|
60
|
+
# Esegue la ricerca nella collezione.
|
61
|
+
definisci _esegui_ricerca
|
62
|
+
_carica_relazioni_incluse
|
63
|
+
@ripostiglio.collezione.cerca @parametri_ricerca, @ordinamento_ricerca
|
64
|
+
fine
|
65
|
+
|
66
|
+
##
|
67
|
+
# Carica relazioni incluse in memoria, se presenti.
|
68
|
+
definisci _carica_relazioni_incluse
|
69
|
+
@relazioni_incluse.per_ognuna esegui |relazione_inclusa|
|
70
|
+
relazione_inclusa.carica_in_memoria
|
71
|
+
fine
|
72
|
+
fine
|
73
|
+
|
74
|
+
fine
|
75
|
+
fine
|
data/lib/mangusta/ripostiglio.ir
CHANGED
@@ -20,8 +20,13 @@ modulo Mangusta
|
|
20
20
|
#
|
21
21
|
# Nella base dati Mongo verrà utilizzata la collezione `libri`.
|
22
22
|
# Verranno aggiunti i seguenti metodi alla classe RipostiglioLibri:
|
23
|
-
# - `
|
23
|
+
# - `cerca` -> accetta una Mappa come argomento, che rappresenta
|
24
24
|
# i parametri di ricerca di un documento nella collezione.
|
25
|
+
# - `cerca_per_id` -> accetta una stringa o un id oggetto come argomento
|
26
|
+
# e ritorna il documento che ha come id l'argomento passato, se esiste.
|
27
|
+
# - `primo` -> accetta una Mappa come argomento, che rappresenta
|
28
|
+
# i parametri di ricerca di un documento nella collezione. Viene ritornato
|
29
|
+
# il primo documento corrispondente ai parametri di ricerca, se esiste.
|
25
30
|
# - `tutti` -> esegue una ricerca senza filtri (su tutti i documenti
|
26
31
|
# della collezione).
|
27
32
|
#
|
@@ -29,188 +34,257 @@ modulo Mangusta
|
|
29
34
|
|
30
35
|
##
|
31
36
|
# Codice da eseguire quando questo modulo verrà incluso.
|
32
|
-
definisci se_stesso.
|
37
|
+
definisci se_stesso.quando_incluso(classe_documento)
|
33
38
|
classe_documento.apri_classe esegui
|
39
|
+
estendi Mangusta::Ripostiglio::MetodiDiClasse
|
40
|
+
estendi Mangusta::Ripostiglio::MetodiDiClasse::Ricerca
|
41
|
+
estendi Mangusta::Ripostiglio::MetodiDiClasse::Persistenza
|
42
|
+
|
34
43
|
classe << se_stesso
|
44
|
+
accessore :nome_collezione
|
45
|
+
accessore :nome_classe_documento
|
46
|
+
accessore :classe_documento
|
47
|
+
fine
|
48
|
+
fine
|
49
|
+
fine
|
35
50
|
|
36
|
-
|
37
|
-
|
38
|
-
|
51
|
+
##
|
52
|
+
# Metodi di classe aggiunti al ripostiglio.
|
53
|
+
modulo MetodiDiClasse
|
39
54
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
55
|
+
##
|
56
|
+
# Ritorna l'oggetto collezione agganciato a questo ripostiglio.
|
57
|
+
# Se chiamato con argomento, imposta la collezione all'argomento passato.
|
58
|
+
definisci collezione(nome_collezione_da_impostare = nullo)
|
59
|
+
se nome_collezione_da_impostare.esiste?
|
60
|
+
se_stesso.nome_collezione = nome_collezione_da_impostare
|
61
|
+
ritorna nome_collezione
|
62
|
+
fine
|
45
63
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
se_stesso._nome_classe_documento = nome_classe
|
50
|
-
se_stesso._classe_documento = Oggetto.ottieni_costante nome_classe
|
51
|
-
fine
|
64
|
+
alza "Mangusta non è ancora stato connesso ad una base dati" se Mangusta.connessione.nulla?
|
65
|
+
Mangusta.connessione[se_stesso.nome_collezione]
|
66
|
+
fine
|
52
67
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
68
|
+
##
|
69
|
+
# Imposta la classe documento agganciata a questo ripostiglio.
|
70
|
+
definisci documento(nome_classe_documento_da_impostare)
|
71
|
+
se_stesso.nome_classe_documento = nome_classe_documento_da_impostare
|
72
|
+
se_stesso.classe_documento = Oggetto.ottieni_costante nome_classe_documento_da_impostare
|
73
|
+
fine
|
58
74
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
_risultato_ricerca(_id: IdOggetto.converti(id)).primo
|
63
|
-
fine
|
75
|
+
##
|
76
|
+
# Metodi di classe concernenti la ricerca.
|
77
|
+
modulo Ricerca
|
64
78
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
alias :prima :primo
|
71
|
-
alias :primo_per :primo
|
72
|
-
alias :prima_per :primo
|
79
|
+
##
|
80
|
+
# Cerca documenti in base a dei parametri di ricerca.
|
81
|
+
definisci cerca(parametri = Mappa.nuova, ordinamento = Mappa.nuova)
|
82
|
+
_nuova_ricerca_per parametri, ordinamento
|
83
|
+
fine
|
73
84
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
85
|
+
##
|
86
|
+
# Imposta un ordinamento.
|
87
|
+
definisci ordina(ordinamento = Mappa.nuova)
|
88
|
+
ordinamento_trasformato = ordinamento.trasforma_valori esegui |valore|
|
89
|
+
considera valore
|
90
|
+
quando :crescente allora 1
|
91
|
+
quando :decrescente allora -1
|
92
|
+
altrimenti valore fine
|
78
93
|
fine
|
79
|
-
|
80
|
-
|
81
|
-
|
94
|
+
_nuova_ricerca_per Mappa.nuova, ordinamento_trasformato
|
95
|
+
fine
|
96
|
+
alias :ordina_per :ordina
|
97
|
+
alias :ordinati_per :ordina
|
98
|
+
alias :ordinate_per :ordina
|
82
99
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
100
|
+
##
|
101
|
+
# Cerca documento per id.
|
102
|
+
definisci cerca_per_id(id)
|
103
|
+
alza "l'id deve essere una Stringa o un IdOggetto" se id.non_è_una? Stringa e id.non_è_un? IdOggetto
|
104
|
+
primo_per _id: IdOggetto.converti(id)
|
105
|
+
fine
|
89
106
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
_propaga_relazioni documento, documento_in_json
|
101
|
-
documento
|
102
|
-
fine
|
107
|
+
##
|
108
|
+
# Ottiene il primo documento in base ai parametri di ricerca.
|
109
|
+
# Il primo documento viene preso con ordinamento sul campo `_id`.
|
110
|
+
definisci primo(parametri = Mappa.nuova)
|
111
|
+
risultato_ricerca = _nuova_ricerca_per parametri, _id: 1
|
112
|
+
risultato_ricerca.primo
|
113
|
+
fine
|
114
|
+
alias :prima :primo
|
115
|
+
alias :primo_per :primo
|
116
|
+
alias :prima_per :primo
|
103
117
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
118
|
+
##
|
119
|
+
# Ottiene l'ultimo documento in base ai parametri di ricerca.
|
120
|
+
# L'ultimo documento viene preso con ordinamento sul campo `_id`.
|
121
|
+
definisci ultimo(parametri = Mappa.nuova)
|
122
|
+
risultato_ricerca = _nuova_ricerca_per parametri, _id: -1
|
123
|
+
risultato_ricerca.primo
|
124
|
+
fine
|
125
|
+
alias :ultima :ultimo
|
126
|
+
alias :ultimo_per :ultimo
|
127
|
+
alias :ultima_per :ultimo
|
113
128
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
129
|
+
##
|
130
|
+
# Cerca senza filtri, su tutti i documenti della collezione.
|
131
|
+
definisci tutti(ordinamento = Mappa.nuova)
|
132
|
+
_nuova_ricerca_per Mappa.nuova, ordinamento
|
133
|
+
fine
|
134
|
+
alias :tutte :tutti
|
135
|
+
alias :prendi_tutti :tutti
|
136
|
+
alias :prendi_tutte :tutti
|
137
|
+
|
138
|
+
##
|
139
|
+
# Conteggia tutti i documenti del ripostiglio.
|
140
|
+
definisci conteggio
|
141
|
+
_nuova_ricerca_per(Mappa.nuova).conteggio
|
142
|
+
fine
|
143
|
+
alias :conteggia :conteggio
|
144
|
+
|
145
|
+
##
|
146
|
+
# Include le relazioni.
|
147
|
+
definisci includi_relazioni(*relazioni_da_includere)
|
148
|
+
_nuova_ricerca_per(Mappa.nuova).includi_relazioni *relazioni_da_includere
|
149
|
+
fine
|
150
|
+
|
151
|
+
privati
|
125
152
|
|
126
153
|
##
|
127
|
-
#
|
128
|
-
definisci
|
129
|
-
|
130
|
-
risultato_aggiornamento = _collezione.aggiorna_molti documenti, Mappa["$set": valori_da_aggiornare]
|
131
|
-
risultato_aggiornamento.modified_count
|
154
|
+
# Effettua una nuova ricerca.
|
155
|
+
definisci _nuova_ricerca_per(parametri = Mappa.nuova, ordinamento = Mappa.nuova)
|
156
|
+
Mangusta::Ricerca.nuova se_stesso, parametri, ordinamento
|
132
157
|
fine
|
133
|
-
alias :aggiorna_molte :aggiorna_molti
|
134
158
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
159
|
+
fine
|
160
|
+
|
161
|
+
##
|
162
|
+
# Metodi di classe concernenti la persistenza.
|
163
|
+
modulo Persistenza
|
164
|
+
|
165
|
+
##
|
166
|
+
# Inserisce un documento nella collezione.
|
167
|
+
definisci inserisci(documento)
|
168
|
+
se documento.è_un? classe_documento
|
169
|
+
collezione.inserisci_uno documento.esponi
|
170
|
+
documento_da_ritornare = documento
|
171
|
+
altrimenti_se documento.è_una? Mappa
|
172
|
+
collezione.inserisci_uno documento
|
173
|
+
documento_da_ritornare = classe_documento.nuovo **documento
|
174
|
+
altrimenti
|
175
|
+
alza "il documento da inserire deve essere un #{nome_classe_documento} o una Mappa"
|
140
176
|
fine
|
141
|
-
alias :aggiorna_tutte :aggiorna_tutti
|
142
177
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
178
|
+
_propaga_relazioni_su documento_da_ritornare
|
179
|
+
documento_da_ritornare
|
180
|
+
fine
|
181
|
+
|
182
|
+
##
|
183
|
+
# Inserisce molti documenti nella collezione.
|
184
|
+
definisci inserisci_molti(documenti)
|
185
|
+
alza "i documenti da inserire devono essere una Lista" se documenti.non_è_una? Lista
|
186
|
+
|
187
|
+
se documenti.tutti? { |documento| documento.è_un? classe_documento }
|
188
|
+
collezione.inserisci_molti documenti.mappa(&:esponi)
|
189
|
+
altrimenti_se documenti.tutti? { |documento| documento.è_una? Mappa }
|
190
|
+
collezione.inserisci_molti documenti
|
191
|
+
altrimenti
|
192
|
+
alza "i documenti da inserire devono essere una Lista di #{nome_classe_documento} o di Mappe"
|
153
193
|
fine
|
154
194
|
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
195
|
+
documenti
|
196
|
+
fine
|
197
|
+
alias :inserisci_molte :inserisci_molti
|
198
|
+
|
199
|
+
##
|
200
|
+
# Aggiorna un documento.
|
201
|
+
definisci aggiorna(documento, **valori_da_aggiornare)
|
202
|
+
se documento.è_un? IdOggetto
|
203
|
+
documento_da_aggiornare = cerca_per_id documento
|
204
|
+
altrimenti_se documento.è_un? classe_documento
|
205
|
+
documento_da_aggiornare = documento
|
206
|
+
altrimenti
|
207
|
+
alza "il primo argomento deve essere un IdOggetto o un #{nome_classe_documento}"
|
161
208
|
fine
|
162
|
-
alias :cancella_molte :cancella_molti
|
163
209
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
210
|
+
ritorna documento_da_aggiornare se valori_da_aggiornare.nessuno?
|
211
|
+
collezione.aggiorna_uno Mappa[_id: documento_da_aggiornare._id], Mappa["$set" => valori_da_aggiornare]
|
212
|
+
documento_da_ritornare = cerca_per_id documento_da_aggiornare._id
|
213
|
+
|
214
|
+
_propaga_relazioni_su documento_da_ritornare
|
215
|
+
documento_da_ritornare
|
216
|
+
fine
|
217
|
+
|
218
|
+
##
|
219
|
+
# Aggiorna molti documenti.
|
220
|
+
definisci aggiorna_molti(ricerca = Mappa.nuova, **valori_da_aggiornare)
|
221
|
+
ritorna 0 se ricerca.nulla? o ricerca.vuota?
|
222
|
+
se ricerca.è_una? Lista e ricerca.tutti? { |elemento| elemento.risponde_a? :_id }
|
223
|
+
ricerca = Mappa(_id: Mappa("$in": ricerca.pizzica(:_id)))
|
169
224
|
fine
|
170
|
-
alias :cancella_tutte :cancella_tutti
|
171
225
|
|
172
|
-
|
226
|
+
risultato_aggiornamento = collezione.aggiorna_molti ricerca, Mappa["$set": valori_da_aggiornare]
|
227
|
+
risultato_aggiornamento.modified_count
|
228
|
+
fine
|
229
|
+
alias :aggiorna_molte :aggiorna_molti
|
173
230
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
231
|
+
##
|
232
|
+
# Aggiorna tutti i documenti.
|
233
|
+
definisci aggiorna_tutti(**valori_da_aggiornare)
|
234
|
+
risultato_aggiornamento = collezione.aggiorna_molti Mappa.nuova, Mappa["$set": valori_da_aggiornare]
|
235
|
+
risultato_aggiornamento.modified_count
|
236
|
+
fine
|
237
|
+
alias :aggiorna_tutte :aggiorna_tutti
|
180
238
|
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
239
|
+
##
|
240
|
+
# Cancella un documento.
|
241
|
+
definisci cancella(documento)
|
242
|
+
se documento.è_un? IdOggetto
|
243
|
+
documento_da_cancellare = cerca_per_id documento
|
244
|
+
altrimenti_se documento.è_un? classe_documento
|
245
|
+
documento_da_cancellare = documento
|
246
|
+
altrimenti
|
247
|
+
alza "il primo argomento deve essere un IdOggetto o un #{nome_classe_documento}"
|
248
|
+
fine
|
186
249
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
se documento_in_json.ha_chiave? relazione.nome_campo
|
192
|
-
relazione.propaga documento, documento_in_json.ottieni(relazione.nome_campo)
|
193
|
-
fine
|
194
|
-
fine
|
195
|
-
fine
|
250
|
+
ritorna 0 se documento_da_cancellare.nullo?
|
251
|
+
risultato_cancellazione = collezione.cancella_uno Mappa[_id: documento._id]
|
252
|
+
risultato_cancellazione.deleted_count
|
253
|
+
fine
|
196
254
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
255
|
+
##
|
256
|
+
# Cancella molti documenti.
|
257
|
+
definisci cancella_molti(ricerca = Mappa.nuova)
|
258
|
+
ritorna 0 se ricerca.nulla? o ricerca.vuota?
|
259
|
+
se ricerca.è_una? Lista e ricerca.tutti? { |elemento| elemento.risponde_a? :_id }
|
260
|
+
ricerca = Mappa(_id: Mappa("$in": ricerca.pizzica(:_id)))
|
261
|
+
fine
|
262
|
+
|
263
|
+
risultato_cancellazione = collezione.cancella_molti ricerca
|
264
|
+
risultato_cancellazione.deleted_count
|
265
|
+
fine
|
266
|
+
alias :cancella_molte :cancella_molti
|
202
267
|
|
203
|
-
|
268
|
+
##
|
269
|
+
# Cancella tutti i documenti.
|
270
|
+
definisci cancella_tutti
|
271
|
+
risultato_cancellazione = collezione.cancella_molti
|
272
|
+
risultato_cancellazione.deleted_count
|
273
|
+
fine
|
274
|
+
alias :cancella_tutte :cancella_tutti
|
204
275
|
|
205
|
-
|
206
|
-
ricerca.tutti? { |documento| documento.risponde_a? :_id }
|
276
|
+
privati
|
207
277
|
|
208
|
-
|
209
|
-
|
278
|
+
##
|
279
|
+
# Propaga le relazioni del documento.
|
280
|
+
definisci _propaga_relazioni_su(documento)
|
281
|
+
classe_documento.relazioni.per_ognuna esegui |relazione|
|
282
|
+
relazione.propaga documento
|
210
283
|
fine
|
284
|
+
fine
|
211
285
|
|
212
|
-
fine
|
213
286
|
fine
|
287
|
+
|
214
288
|
fine
|
215
289
|
|
216
290
|
fine
|