mangusta 0.4.6 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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
- # - `trova` -> accetta una Mappa come argomento, che rappresenta
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,267 @@ modulo Mangusta
29
34
 
30
35
  ##
31
36
  # Codice da eseguire quando questo modulo verrà incluso.
32
- definisci se_stesso.included(classe_documento)
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_base_dati
45
+ accessore :nome_collezione
46
+ accessore :nome_classe_documento
47
+ accessore :classe_documento
48
+ fine
49
+ fine
50
+ fine
35
51
 
36
- accessore :_nome_collezione
37
- accessore :_nome_classe_documento
38
- accessore :_classe_documento
52
+ ##
53
+ # Metodi di classe aggiunti al ripostiglio.
54
+ modulo MetodiDiClasse
55
+
56
+ ##
57
+ # Ritorna l'oggetto collezione agganciato a questo ripostiglio.
58
+ # Se chiamato con argomento, imposta la collezione all'argomento passato.
59
+ definisci collezione(nome_collezione_da_impostare = nullo, base_dati: nullo)
60
+ se nome_collezione_da_impostare.specificato?
61
+ se_stesso.nome_collezione = nome_collezione_da_impostare
62
+ se_stesso.nome_base_dati = base_dati se base_dati.specificata?
63
+ ritorna nome_collezione
64
+ fine
39
65
 
40
- ##
41
- # Metodo per definire su che collezione agire.
42
- definisci collezione(nome)
43
- se_stesso._nome_collezione = nome
44
- fine
66
+ alza "Mangusta non è ancora stato connesso ad una base dati" se Mangusta.connessione.nulla?
45
67
 
46
- ##
47
- # Metodo per definire che classe documento usare.
48
- definisci documento(nome_classe)
49
- se_stesso._nome_classe_documento = nome_classe
50
- se_stesso._classe_documento = Oggetto.ottieni_costante nome_classe
51
- fine
68
+ se se_stesso.nome_base_dati.specificato?
69
+ basi_dati = Mangusta.connessione.list_mongo_databases
70
+ base_dati = basi_dati.trova { |base_dati| base_dati.name == se_stesso.nome_base_dati }
71
+ alza "la base dati `#{se_stesso.nome_base_dati}` non esiste" se basi_dati.non_esiste?
72
+ base_dati[se_stesso.nome_collezione]
73
+ altrimenti
74
+ Mangusta.connessione[se_stesso.nome_collezione]
75
+ fine
76
+ fine
52
77
 
53
- ##
54
- # Cerca documenti nella collezione.
55
- definisci cerca(parametri, ordinamento = Mappa.nuova)
56
- _risultato_ricerca parametri, ordinamento
57
- fine
78
+ ##
79
+ # Imposta la classe documento agganciata a questo ripostiglio.
80
+ definisci documento(nome_classe_documento_da_impostare)
81
+ se_stesso.nome_classe_documento = nome_classe_documento_da_impostare
82
+ se_stesso.classe_documento = Oggetto.ottieni_costante nome_classe_documento_da_impostare
83
+ fine
58
84
 
59
- ##
60
- # Cerca documento per id, e ritorna il primo trovato.
61
- definisci cerca_per_id(id)
62
- _risultato_ricerca(_id: IdOggetto.converti(id)).primo
63
- fine
85
+ ##
86
+ # Metodi di classe concernenti la ricerca.
87
+ modulo Ricerca
64
88
 
65
- ##
66
- # Ritorna il primo documento del ripostiglio.
67
- definisci primo(parametri = Mappa.nuova, ordinamento = Mappa.nuova)
68
- _risultato_ricerca(parametri, ordinamento).primo
69
- fine
70
- alias :prima :primo
71
- alias :primo_per :primo
72
- alias :prima_per :primo
89
+ ##
90
+ # Cerca documenti in base a dei parametri di ricerca.
91
+ definisci cerca(parametri = Mappa.nuova, ordinamento = Mappa.nuova)
92
+ _nuova_ricerca_per parametri, ordinamento
93
+ fine
73
94
 
74
- ##
75
- # Ritorna l'ultimo documento del ripostiglio.
76
- definisci ultimo(parametri = Mappa.nuova, ordinamento = Mappa.nuova)
77
- _risultato_ricerca(parametri, ordinamento).ultimo
95
+ ##
96
+ # Imposta un ordinamento.
97
+ definisci ordina(ordinamento = Mappa.nuova)
98
+ ordinamento_trasformato = ordinamento.trasforma_valori esegui |valore|
99
+ considera valore
100
+ quando :crescente allora 1
101
+ quando :decrescente allora -1
102
+ altrimenti valore fine
78
103
  fine
79
- alias :ultima :ultimo
80
- alias :ultimo_per :ultimo
81
- alias :ultima_per :ultimo
104
+ _nuova_ricerca_per Mappa.nuova, ordinamento_trasformato
105
+ fine
106
+ alias :ordina_per :ordina
107
+ alias :ordinati_per :ordina
108
+ alias :ordinate_per :ordina
109
+
110
+ ##
111
+ # Cerca documento per id.
112
+ definisci cerca_per_id(id)
113
+ alza "l'id deve essere una Stringa o un IdOggetto" se id.non_è_una? Stringa e id.non_è_un? IdOggetto
114
+ primo_per _id: IdOggetto.converti(id)
115
+ fine
82
116
 
83
- ##
84
- # Cerca senza filtri, su tutti i documenti della collezione.
85
- definisci prendi_tutti
86
- _risultato_ricerca
87
- fine
88
- alias :prendi_tutte :prendi_tutti
117
+ ##
118
+ # Ottiene il primo documento in base ai parametri di ricerca.
119
+ # Il primo documento viene preso con ordinamento sul campo `_id`.
120
+ definisci primo(parametri = Mappa.nuova)
121
+ risultato_ricerca = _nuova_ricerca_per parametri, _id: 1
122
+ risultato_ricerca.primo
123
+ fine
124
+ alias :prima :primo
125
+ alias :primo_per :primo
126
+ alias :prima_per :primo
127
+
128
+ ##
129
+ # Ottiene l'ultimo documento in base ai parametri di ricerca.
130
+ # L'ultimo documento viene preso con ordinamento sul campo `_id`.
131
+ definisci ultimo(parametri = Mappa.nuova)
132
+ risultato_ricerca = _nuova_ricerca_per parametri, _id: -1
133
+ risultato_ricerca.primo
134
+ fine
135
+ alias :ultima :ultimo
136
+ alias :ultimo_per :ultimo
137
+ alias :ultima_per :ultimo
138
+
139
+ ##
140
+ # Cerca senza filtri, su tutti i documenti della collezione.
141
+ definisci tutti(ordinamento = Mappa.nuova)
142
+ _nuova_ricerca_per Mappa.nuova, ordinamento
143
+ fine
144
+ alias :tutte :tutti
145
+ alias :prendi_tutti :tutti
146
+ alias :prendi_tutte :tutti
147
+
148
+ ##
149
+ # Conteggia tutti i documenti del ripostiglio.
150
+ definisci conteggio
151
+ _nuova_ricerca_per(Mappa.nuova).conteggio
152
+ fine
153
+ alias :conteggia :conteggio
89
154
 
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
155
+ ##
156
+ # Include le relazioni.
157
+ definisci includi_relazioni(*relazioni_da_includere)
158
+ _nuova_ricerca_per(Mappa.nuova).includi_relazioni *relazioni_da_includere
159
+ fine
104
160
 
105
- ##
106
- # Deposita molti documenti.
107
- definisci inserisci_molti(documenti)
108
- alza "L'argomento passato non è una lista" a_meno_che documenti.risponde_a? :mappa
109
- documenti_in_json = documenti.mappa { |documento| Mangusta::Utilità.converti_in_json(documento) }
110
- _collezione.inserisci_molti documenti_in_json
111
- documenti
112
- fine
113
- alias :inserisci_molte :inserisci_molti
161
+ privati
114
162
 
115
163
  ##
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
164
+ # Effettua una nuova ricerca.
165
+ definisci _nuova_ricerca_per(parametri = Mappa.nuova, ordinamento = Mappa.nuova)
166
+ Mangusta::Ricerca.nuova se_stesso, parametri, ordinamento
128
167
  fine
129
168
 
130
- ##
131
- # Aggiorna molti documenti.
132
- definisci aggiorna_molti(ricerca = Mappa.nuova, **valori_da_aggiornare)
133
- documenti = _ricerca_per_mappa_o_lista_documenti ricerca
134
- risultato_aggiornamento = _collezione.aggiorna_molti documenti, Mappa["$set": valori_da_aggiornare]
135
- risultato_aggiornamento.modified_count
136
- fine
137
- alias :aggiorna_molte :aggiorna_molti
169
+ fine
138
170
 
139
- ##
140
- # Aggiorna tutti i documenti.
141
- definisci aggiorna_tutti(**valori_da_aggiornare)
142
- risultato_aggiornamento = _collezione.aggiorna_molti Mappa.nuova, Mappa["$set": valori_da_aggiornare]
143
- risultato_aggiornamento.modified_count
171
+ ##
172
+ # Metodi di classe concernenti la persistenza.
173
+ modulo Persistenza
174
+
175
+ ##
176
+ # Inserisce un documento nella collezione.
177
+ definisci inserisci(documento)
178
+ se documento.è_un? classe_documento
179
+ collezione.inserisci_uno documento._esponi
180
+ documento_da_ritornare = documento
181
+ altrimenti_se documento.è_una? Mappa
182
+ collezione.inserisci_uno documento
183
+ documento_da_ritornare = classe_documento.nuovo **documento
184
+ altrimenti
185
+ alza "il documento da inserire deve essere un #{nome_classe_documento} o una Mappa"
144
186
  fine
145
- alias :aggiorna_tutte :aggiorna_tutti
146
187
 
147
- ##
148
- # Cancella un documento.
149
- definisci cancella(documento)
150
- alza "Il primo argomento deve essere una Stringa o un documento" a_meno_che
151
- documento.è_una? Stringa o documento.risponde_a? :_id
152
-
153
- id_documento = documento.risponde_a?(:_id) ? documento._id : documento
154
- id_documento = IdOggetto.converti id_documento
155
- risultato_cancellazione = _collezione.cancella_uno Mappa[_id: id_documento]
156
- risultato_cancellazione.deleted_count
188
+ _propaga_relazioni_su documento_da_ritornare
189
+ documento_da_ritornare
190
+ fine
191
+
192
+ ##
193
+ # Inserisce molti documenti nella collezione.
194
+ definisci inserisci_molti(documenti)
195
+ alza "i documenti da inserire devono essere una Lista" se documenti.non_è_una? Lista
196
+
197
+ se documenti.tutti? { |documento| documento.è_un? classe_documento }
198
+ collezione.inserisci_molti documenti.mappa(&:_esponi)
199
+ altrimenti_se documenti.tutti? { |documento| documento.è_una? Mappa }
200
+ collezione.inserisci_molti documenti
201
+ altrimenti
202
+ alza "i documenti da inserire devono essere una Lista di #{nome_classe_documento} o di Mappe"
157
203
  fine
158
204
 
159
- ##
160
- # Cancella molti documenti.
161
- definisci cancella_molti(ricerca = Mappa.nuova)
162
- documenti = _ricerca_per_mappa_o_lista_documenti ricerca
163
- risultato_cancellazione = _collezione.cancella_molti documenti
164
- risultato_cancellazione.deleted_count
205
+ documenti
206
+ fine
207
+ alias :inserisci_molte :inserisci_molti
208
+
209
+ ##
210
+ # Aggiorna un documento.
211
+ definisci aggiorna(documento, **valori_da_aggiornare)
212
+ se documento.è_un? IdOggetto
213
+ documento_da_aggiornare = cerca_per_id documento
214
+ altrimenti_se documento.è_un? classe_documento
215
+ documento_da_aggiornare = documento
216
+ altrimenti
217
+ alza "il primo argomento deve essere un IdOggetto o un #{nome_classe_documento}"
165
218
  fine
166
- alias :cancella_molte :cancella_molti
167
219
 
168
- ##
169
- # Cancella tutti i documenti.
170
- definisci cancella_tutti
171
- risultato_cancellazione = _collezione.cancella_molti
172
- risultato_cancellazione.deleted_count
220
+ ritorna documento_da_aggiornare se valori_da_aggiornare.nessuno?
221
+ collezione.aggiorna_uno Mappa[_id: documento_da_aggiornare._id], Mappa["$set" => valori_da_aggiornare]
222
+ documento_da_ritornare = cerca_per_id documento_da_aggiornare._id
223
+
224
+ _propaga_relazioni_su documento_da_ritornare
225
+ documento_da_ritornare
226
+ fine
227
+
228
+ ##
229
+ # Aggiorna molti documenti.
230
+ definisci aggiorna_molti(ricerca = Mappa.nuova, **valori_da_aggiornare)
231
+ ritorna 0 se ricerca.nulla? o ricerca.vuota?
232
+ se ricerca.è_una? Lista e ricerca.tutti? { |elemento| elemento.risponde_a? :_id }
233
+ ricerca = Mappa(_id: Mappa("$in": ricerca.pizzica(:_id)))
173
234
  fine
174
- alias :cancella_tutte :cancella_tutti
175
235
 
176
- privati
236
+ risultato_aggiornamento = collezione.aggiorna_molti ricerca, Mappa["$set": valori_da_aggiornare]
237
+ risultato_aggiornamento.modified_count
238
+ fine
239
+ alias :aggiorna_molte :aggiorna_molti
177
240
 
178
- ##
179
- # Connette alla collezione.
180
- definisci _collezione
181
- alza "Mangusta non è ancora stato connesso ad una base dati" se Mangusta.connessione.nulla?
182
- Mangusta.connessione[_nome_collezione]
183
- fine
241
+ ##
242
+ # Aggiorna tutti i documenti.
243
+ definisci aggiorna_tutti(**valori_da_aggiornare)
244
+ risultato_aggiornamento = collezione.aggiorna_molti Mappa.nuova, Mappa["$set": valori_da_aggiornare]
245
+ risultato_aggiornamento.modified_count
246
+ fine
247
+ alias :aggiorna_tutte :aggiorna_tutti
248
+
249
+ ##
250
+ # Cancella un documento.
251
+ definisci cancella(documento)
252
+ se documento.è_un? IdOggetto
253
+ documento_da_cancellare = cerca_per_id documento
254
+ altrimenti_se documento.è_un? classe_documento
255
+ documento_da_cancellare = documento
256
+ altrimenti
257
+ alza "il primo argomento deve essere un IdOggetto o un #{nome_classe_documento}"
258
+ fine
184
259
 
185
- ##
186
- # Ritorna un risultato ricerca.
187
- definisci _risultato_ricerca(parametri = Mappa.nuova, ordinamento = Mappa.nuova)
188
- Mangusta::Ripostiglio::RisultatoRicerca.nuovo(_collezione, _classe_documento, parametri, ordinamento)
189
- fine
260
+ ritorna 0 se documento_da_cancellare.nullo?
261
+ risultato_cancellazione = collezione.cancella_uno Mappa[_id: documento._id]
262
+ risultato_cancellazione.deleted_count
263
+ fine
190
264
 
191
- ##
192
- # Propaga tutte le relazioni del documento.
193
- definisci _propaga_relazioni(documento, documento_in_json)
194
- _classe_documento.relazioni.per_ognuna esegui |relazione|
195
- se documento_in_json.ha_chiave? relazione.nome_campo
196
- relazione.propaga documento, documento_in_json.prendi(relazione.nome_campo)
197
- fine
198
- fine
199
- fine
265
+ ##
266
+ # Cancella molti documenti.
267
+ definisci cancella_molti(ricerca = Mappa.nuova)
268
+ ritorna 0 se ricerca.nulla? o ricerca.vuota?
269
+ se ricerca.è_una? Lista e ricerca.tutti? { |elemento| elemento.risponde_a? :_id }
270
+ ricerca = Mappa(_id: Mappa("$in": ricerca.pizzica(:_id)))
271
+ fine
200
272
 
201
- ##
202
- # Ottieni ricerca per lista di documenti o lista di id.
203
- definisci _ricerca_per_mappa_o_lista_documenti(ricerca = Mappa.nuova)
204
- alza "Il primo argomento deve essere una Mappa o una Lista" se
205
- ricerca.non_è_una? Mappa e ricerca.non_è_una? Lista
273
+ risultato_cancellazione = collezione.cancella_molti ricerca
274
+ risultato_cancellazione.deleted_count
275
+ fine
276
+ alias :cancella_molte :cancella_molti
206
277
 
207
- ritorna ricerca se ricerca.è_una? Mappa
278
+ ##
279
+ # Cancella tutti i documenti.
280
+ definisci cancella_tutti
281
+ risultato_cancellazione = collezione.cancella_molti
282
+ risultato_cancellazione.deleted_count
283
+ fine
284
+ alias :cancella_tutte :cancella_tutti
208
285
 
209
- alza "Il primo argomento è una Lista, ma non di documenti" a_meno_che
210
- ricerca.tutti? { |documento| documento.risponde_a? :_id }
286
+ privati
211
287
 
212
- filtro_lista_id_documenti = Mappa["$in": ricerca.mappa(&:_id)]
213
- Mappa[_id: filtro_lista_id_documenti]
288
+ ##
289
+ # Propaga le relazioni del documento.
290
+ definisci _propaga_relazioni_su(documento)
291
+ classe_documento.relazioni.per_ognuna esegui |relazione|
292
+ relazione.propaga documento
214
293
  fine
294
+ fine
215
295
 
216
- fine
217
296
  fine
297
+
218
298
  fine
219
299
 
220
300
  fine