Recentemente mi sono trovato a dover lavorare con il motore di indicizzazione di Liferay 7 (che ricordo essere ElasticSearch) per estrarre e visualizzare dati complessi di entità custom.
Una delle esigenze che avevo era quella di ordinare i dati, cosa che mi aspettavo fosse banale; purtroppo ho avuto un pò di problemi ma alla fine sono arrivato ad una soluzione che ora vi illustro, sperando di farvi risparmiare tempo prezioso.
Innanzitutto partiamo dall'indicizzazione delle entità custom, ossia dal metodo doGetDocument
della nostra classe Indexer; se vogliamo che un campo sia ordinabile dobbiamo indicizzarlo attraverso uno di questi metodi:
addKeywordSortable
addTextSortable
- ...
Questi metodi fanno sì che, all'interno del documento da indicizzare, vengano creati 2 campi diversi: uno che si chiama come il campo stesso, ad esempio code
, mentre l'altro si chiama code_String_sortable
e viene salvato tutto in minuscolo. L'infisso _String_
dipende dal tipo di dato del campo.
Dopodichè, all'interno della JSP, possiamo creare l'oggetto SearchContext
che conterrà tutti i parametri di ricerca, tra cui anche i campi su cui ordinare:
SearchContext searchContext = SearchContextFactory.getInstance(request);
...
searchContext.setSorts(SortFactoryUtil.getSort(MyEntity.class, "code", "asc"));
La definizione di ogni singolo campo di ordinamento deve essere effettuata mediante il medoto SortFactoryUtil.getSort
; questo passaggio è fondamentale perchè il metodo getSort
analizza la struttura dell'entità per capire come si deve chiamare esattamente il campo di ordinamento e per farlo invoca il metodo doGetSortField
della nostra classe Indexer.
L'implementazione di default restituisce semplicemente il nome del campo stesso, pertanto sarà necessario sovrascrivere il metodo per gestire correttamente la nomenclatura:
@Override
protected String doGetSortField(String orderByCol) {
if ("code".equals(orderByCol))
return "code_String_sortable";
return super.doGetSortField(orderByCol);
}
Buon divertimento!