mangusta 0.4.6 → 0.5.0

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,257 @@ 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_collezione
45
+ accessore :nome_classe_documento
46
+ accessore :classe_documento
47
+ fine
48
+ fine
49
+ fine
35
50
 
36
- accessore :_nome_collezione
37
- accessore :_nome_classe_documento
38
- accessore :_classe_documento
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
- # Metodo per definire su che collezione agire.
42
- definisci collezione(nome)
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
- # 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
+ ##
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
- # Cerca documenti nella collezione.
55
- definisci cerca(parametri, ordinamento = Mappa.nuova)
56
- _risultato_ricerca parametri, ordinamento
57
- fine
75
+ ##
76
+ # Metodi di classe concernenti la ricerca.
77
+ modulo Ricerca
58
78
 
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
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
- # Ritorna il primo documento del ripostiglio.
67
- definisci primo(parametri = Mappa.nuova, ordinamento = Mappa.nuova)
68
- _risultato_ricerca(parametri, ordinamento).primo
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
- alias :prima :primo
71
- alias :primo_per :primo
72
- alias :prima_per :primo
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
- # Ritorna l'ultimo documento del ripostiglio.
76
- definisci ultimo(parametri = Mappa.nuova, ordinamento = Mappa.nuova)
77
- _risultato_ricerca(parametri, ordinamento).ultimo
78
- fine
79
- alias :ultima :ultimo
80
- alias :ultimo_per :ultimo
81
- alias :ultima_per :ultimo
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
- # Cerca senza filtri, su tutti i documenti della collezione.
85
- definisci prendi_tutti
86
- _risultato_ricerca
87
- fine
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
- # 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
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
- # 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
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
- # 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
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
- # 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
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
- # 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
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
- # Cancella tutti i documenti.
170
- definisci cancella_tutti
171
- risultato_cancellazione = _collezione.cancella_molti
172
- risultato_cancellazione.deleted_count
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
- privati
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
- # 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
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
- # 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
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
- # 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
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
- # 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
263
+ risultato_cancellazione = collezione.cancella_molti ricerca
264
+ risultato_cancellazione.deleted_count
265
+ fine
266
+ alias :cancella_molte :cancella_molti
206
267
 
207
- ritorna ricerca se ricerca.è_una? Mappa
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
- alza "Il primo argomento è una Lista, ma non di documenti" a_meno_che
210
- ricerca.tutti? { |documento| documento.risponde_a? :_id }
276
+ privati
211
277
 
212
- filtro_lista_id_documenti = Mappa["$in": ricerca.mappa(&:_id)]
213
- Mappa[_id: filtro_lista_id_documenti]
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