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
@@ -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,192 +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
|
54
|
+
|
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
|
39
63
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
se_stesso._nome_collezione = nome
|
44
|
-
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
|
45
67
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
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
|
52
74
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
_risultato_ricerca parametri, ordinamento
|
57
|
-
fine
|
75
|
+
##
|
76
|
+
# Metodi di classe concernenti la ricerca.
|
77
|
+
modulo Ricerca
|
58
78
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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
|
64
84
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
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
|
69
93
|
fine
|
70
|
-
|
71
|
-
|
72
|
-
|
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
|
99
|
+
|
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
|
73
106
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
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
|
117
|
+
|
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
|
128
|
+
|
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
|
82
144
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
alias :prendi_tutte :prendi_tutti
|
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
|
89
150
|
|
90
|
-
|
91
|
-
# Deposita un documento.
|
92
|
-
definisci inserisci(documento)
|
93
|
-
alza "L'argomento passato deve essere un #{_nome_classe_documento} o una Mappa" se
|
94
|
-
documento.non_è_un? _classe_documento e documento.non_è_una? Mappa
|
95
|
-
|
96
|
-
documento_in_json = Mangusta::Utilità.converti_in_json documento
|
97
|
-
documento_in_json.deposita :_id, IdOggetto.nuovo se documento_in_json.non_ha_chiave? :_id
|
98
|
-
_collezione.inserisci_uno documento_in_json
|
99
|
-
|
100
|
-
documento = Mangusta::Utilità.converti_in_documento documento, _classe_documento
|
101
|
-
_propaga_relazioni documento, documento_in_json
|
102
|
-
documento
|
103
|
-
fine
|
151
|
+
privati
|
104
152
|
|
105
153
|
##
|
106
|
-
#
|
107
|
-
definisci
|
108
|
-
|
109
|
-
documenti_in_json = documenti.mappa { |documento| Mangusta::Utilità.converti_in_json(documento) }
|
110
|
-
_collezione.inserisci_molti documenti_in_json
|
111
|
-
documenti
|
154
|
+
# Effettua una nuova ricerca.
|
155
|
+
definisci _nuova_ricerca_per(parametri = Mappa.nuova, ordinamento = Mappa.nuova)
|
156
|
+
Mangusta::Ricerca.nuova se_stesso, parametri, ordinamento
|
112
157
|
fine
|
113
|
-
alias :inserisci_molte :inserisci_molti
|
114
158
|
|
115
|
-
|
116
|
-
# Aggiorna un documento.
|
117
|
-
definisci aggiorna(documento, **valori_da_aggiornare)
|
118
|
-
alza "Il primo argomento deve essere una Stringa o un documento" a_meno_che
|
119
|
-
documento.è_una? Stringa o documento.risponde_a? :_id
|
120
|
-
|
121
|
-
documento = cerca_per_id id_documento.in_id se documento.è_una? Stringa
|
122
|
-
_collezione.aggiorna_uno Mappa[_id: documento._id], Mappa["$set" => valori_da_aggiornare]
|
123
|
-
|
124
|
-
documento = cerca_per_id documento._id
|
125
|
-
documento_in_json = Mangusta::Utilità.converti_in_json documento
|
126
|
-
_propaga_relazioni documento, documento_in_json
|
127
|
-
documento
|
128
|
-
fine
|
159
|
+
fine
|
129
160
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
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"
|
136
176
|
fine
|
137
|
-
alias :aggiorna_molte :aggiorna_molti
|
138
177
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
risultato_aggiornamento = _collezione.aggiorna_molti Mappa.nuova, Mappa["$set": valori_da_aggiornare]
|
143
|
-
risultato_aggiornamento.modified_count
|
144
|
-
fine
|
145
|
-
alias :aggiorna_tutte :aggiorna_tutti
|
178
|
+
_propaga_relazioni_su documento_da_ritornare
|
179
|
+
documento_da_ritornare
|
180
|
+
fine
|
146
181
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
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"
|
157
193
|
fine
|
158
194
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
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}"
|
165
208
|
fine
|
166
|
-
alias :cancella_molte :cancella_molti
|
167
209
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
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)))
|
173
224
|
fine
|
174
|
-
alias :cancella_tutte :cancella_tutti
|
175
225
|
|
176
|
-
|
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
|
177
230
|
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
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
|
238
|
+
|
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
|
184
249
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
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
|
190
254
|
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
fine
|
199
|
-
fine
|
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
|
200
262
|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
ricerca.non_è_una? Mappa e ricerca.non_è_una? Lista
|
263
|
+
risultato_cancellazione = collezione.cancella_molti ricerca
|
264
|
+
risultato_cancellazione.deleted_count
|
265
|
+
fine
|
266
|
+
alias :cancella_molte :cancella_molti
|
206
267
|
|
207
|
-
|
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
|
208
275
|
|
209
|
-
|
210
|
-
ricerca.tutti? { |documento| documento.risponde_a? :_id }
|
276
|
+
privati
|
211
277
|
|
212
|
-
|
213
|
-
|
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
|
214
283
|
fine
|
284
|
+
fine
|
215
285
|
|
216
|
-
fine
|
217
286
|
fine
|
287
|
+
|
218
288
|
fine
|
219
289
|
|
220
290
|
fine
|