bloggers bloggers

Marco Napolitano
Messaggi: 79
Stelle: 0
Data: 17/02/22
Jader Jed Francia
Messaggi: 63
Stelle: 0
Data: 18/02/21
Paolo Gambetti
Messaggi: 2
Stelle: 0
Data: 11/11/19
Katia Pazzi
Messaggi: 1
Stelle: 0
Data: 27/06/19
Ezio Lombardi
Messaggi: 11
Stelle: 0
Data: 10/04/18
Chiara Mambretti
Messaggi: 25
Stelle: 0
Data: 27/02/17
Serena Traversi
Messaggi: 3
Stelle: 0
Data: 21/07/16
Francesco Falanga
Messaggi: 8
Stelle: 0
Data: 14/06/16
Antonio Musarra
Messaggi: 2
Stelle: 0
Data: 18/11/13
Simone Celli Marchi
Messaggi: 6
Stelle: 0
Data: 09/07/13
Indietro

Legame tra entità e categorie di Liferay

In questo articolo non si parlerà di come fare ad integrare le proprie entità (ma non solo) con il framework delle categorie di Liferay, ma di come le informazioni vengano gestite a basso livello all'interno del database.

Introduzione

Dal momento che Liferay non può sapere a priori quali sono le entità delle portlet, introduce un livello di indirettezza per riuscire a generalizzare il meccanismo di associazione alle categorie.

In particolare, viene introdotto il concetto di asset inteso come un oggetto generico di sistema (che quindi Liferay conosce e sa come usare) a cui vengono materialmente associate tag e categorie; ogni asset, inoltre, fa riferimento singolarmente allo specifico record dell'entità. Questo significa che, per ogni entità (a cui corrisponde una tabella del database), esiste uno ed un solo asset associato.

Gli asset sono censiti nella tabella assetentry ed il loro legame con le categorie è stabilito dalle tabelle di join assetentries_assetcategories e assetentries_assettags; come si può immaginare esiste anche una tabella assetcategory che contiene tutte le categorie ed una tabella assetvocabulary che contiene tutti i vocabolari a cui appartengono le categorie.

Ecco quindi che, volendo ricavare tutti gli asset (gli asset, non le entità custom) associati ad un determinato vocabolario, è necessario eseguire una query del tipo:

SELECT assetentry.*
FROM assetcategory
INNER JOIN assetvocabulary

ON (assetcategory.vocabularyid = assetvocabulary.vocabularyid)
INNER JOIN assetentries_assetcategories
ON (assetcategory.categoryid = assetentries_assetcategories.categoryid)
INNER JOIN assetentry
ON (assetentries_assetcategories.entryid = assetentry.entryid)
WHERE assetvocabulary.name = '...';

Questa query restituisce un elenco di AssetEntry che possono essere di qualsiasi tipo, ossia possono fare riferimento ad articoli, wiki, entità custom, pere, mele, qualsiasi cosa a cui sia stato associato il vocabolario sopra.

Quindi come si fa ad identificare una determinata entità?

Esiste la tabella classname che contiene il censimento di tutte le entità presenti all’interno di Liferay; inoltre come si può vedere, per ogni classe è associato un id univoco, grazie alla chiave primaria classNameId.

Analizziamo ora meglio la tabella assetentry: vi accorgerete che sono presenti 2 colonne, classNameId e classPK, che servono proprio ad identificare l’entità.

In particolare, classNameId rappresenta l’identificativo univoco del tipo di entità che si ricava dalla tabella classname mentre classPK rappresenta la sua chiave primaria, ossia la chiave della tabella dell’entità.

Quindi, tornando alla query SQL sopra, volendo estrarre solamente un tipo specifico di entità è necessario aggiungere una clausola di filtro sulla colonna classNameId:

SELECT assetentry.classPK
FROM assetcategory
INNER JOIN assetvocabulary

ON (assetcategory.vocabularyid = assetvocabulary.vocabularyid)
INNER JOIN assetentries_assetcategories
ON (assetcategory.categoryid = assetentries_assetcategories.categoryid)
INNER JOIN assetentry
ON (assetentries_assetcategories.entryid = assetentry.entryid)
WHERE assetvocabulary.name = '...'
AND assetentry.classnameid = 10108;

Il valore 10108 rappresenta nello specifico l’identificativo dei JournalArticle, ma ovviamente può essere inserito qualsiasi valore della tabella classname; inoltre ho selezionato in output solamente la colonna classPK in modo da avere solo un elenco di id.

Ecco, questi id sono quelli delle tabelle specifiche di una determinata entità; quindi è possibile accedere alla tabella specifica e filtrare tutti i record in base agli id ottenuti sopra.

Ovviamente è possibile fare una query SQL più complessa per fare tutto in un colpo solo...

Associare categorie via SQL

In prima battuta mi verrebbe da dire meglio non farlo perché, come avrete capito, non è easy subito; comunque cercherò di spiegare la procedura.

Partiamo per semplicità da una situazione in cui i record delle entità sono già tutti presenti all’interno del database ed anche il vocabolario è già presente e valorizzato completamente con le sue categorie.

Il fatto di avere tutti i record già nel database implica che all’interno della tabella assetentry saranno presenti tanti record in cui il campo classNameId è quello dell'entità (ad esempio il valore 10108 visto sopra) mentre il campo classPK è quello delle singole chiavi primarie dei record.

Quindi dati i record, è possibile ottenere un elenco dei relativi assetentry associati con una query banale, del tipo:

SELECT *
FROM assetentry
WHERE classnameid = 10108
AND classPK IN (...elenco degli id presi dalla tabella dell'entità...);

A questo punto non resta che associare le categorie andando a valorizzare la tabella di join assetentries_assetcategories; gli id degli assetentry si estraggono tutti dalla query sopra, mentre gli id delle categorie si possono ricavare in qualche modo, ad esempio partendo dal vocabolario che le contiene:

SELECT assetcategory.*
FROM assetcategory
INNER JOIN assetvocabulary
ON (assetcategory.vocabularyid = assetvocabulary.vocabularyid)
WHERE assetvocabulary.name = '...';

Se mi sono spiegato bene fin qui, dovrebbe anche risultare più chiaro il funzionamento della portlet Asset Publisher, che non fa altro che pubblicare degli asset ossia estrarre record dalla tabella assetentry (eventualmente filtrati per categorie e tag) e, tramite le colonne classNameId e classPK viste in precedenza, andare a risolvere l’indirettezza introdotta da Liferay in modo da visualizzare il dettaglio delle entità custom.

Enjoy!

Precedente
Commenti
Nessun commento. Vuoi essere il primo.