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.
@@ -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