In entrambe le edizioni di Instant Developer una delle funzionalità più interessanti in assoluto è la Document Orientation, l’entity framework di Pro Gamma che segue i principi della AOP – Aspect Oriented Programming. Chi già conosce questo framework nell’edizione Foundation non avrà problemi ad approcciare la versione Cloud, perché i principi di funzionamento sono gli stessi e così anche il boost nei tempi di sviluppo, ma il piccolo trucchetto che voglio mostrarvi oggi sull’edizione Cloud potrebbe essere passato inosservato.
La prima e più facile semplificazione della DO è la capacità di caricare i documenti senza il bisogno di scrivere sempre la stessa query di caricamento in stile select * from [tabella] where [condizioni]. Questo è incredibilmente utile quando le condizioni di caricamento sono nella tabella che rappresenta il documento, ad esempio se nel database Nwind abbiamo la tabella Products e vogliamo caricare una lista di oggetti della classe Product che costano più di 10 €.
Per farlo è sufficiente utilizzare il metodo Document.loadCollection():
Ma come fare per caricare rapidamente tutti i prodotti che hanno avuto un ordine nel 2019?
La condizione da verificare non risiede nella tabella dei prodotti ma nella tabella degli ordini: abbiamo bisogno di fare una join tra tabelle, una query manuale con la quale sia possibile aggiungere liberamente delle condizioni (magari a run-time) e poi convertire rapidamente il risultato in una Collection di Product.
Come far incontrare una query specifica con l’uso della DO?
Possiamo ricorrere ai metodi DataMap.prepare(), DataMap.filterBy(), DataMap.load() e DataMap.toCollection().
DataMap.prepare() ritorna un oggetto DataMap corrispondente al codice SQL passato a parametro, ma senza eseguire la query.
DataMap.filterBy() permette di aggiungere condizioni di filtro alla query, usando codice SQL libero e permettendo quindi qualsiasi condizione sia possibile scrivere con il database in uso.
DataMap.load() esegue la query utilizzando i filtri impostati con DataMap.filterBy() e popola l’oggetto DataMap con il risultato della query.
DataMap.toCollection() crea una collection di documenti della classe desiderata, a partire dai dati dell’oggetto DataMap stesso.
Usando questo codice è quindi possibile ottenere tutti i prodotti ordinati in un determinato anno. Questo perché prima prepariamo una query con tutte le join necessarie, poi impostiamo un filtro sulla tabella Orders, lontana da Products, e poi eseguiamo la query convertendo il risultato in una lista di oggetti Product.
Certo, questa implementazione è ancora embrionale, ma pensate a cosa potremmo fare con il metodo DataMap.filterBy() usato a run-time assieme alle informazioni della struttura del documento: potremmo implementare un metodo unico che dato un filtro complesso passato a parametro è in grado di trovare nel database i prodotti che corrispondono a diversi criteri di ricerca anche non dipendenti dalla tabella Products.
Se volete vedere il codice in azione, ho preparato per voi il progetto pubblico prepare-example. Lo trovate nella Console di Instant Developer Cloud.
Se volete sapere come si fa la stessa cosa con Instant Developer Foundation, vi basta verificare l’uso di select into collection.
Se poi questi tips&tricks vi piacciono e vi tornano utili e ne vorreste altri… restate con noi!