In un precedente blog abbiamo visto come realizzare query DQL su attributi repeating mediante l'oggetto IDfQueryBuilder
; quello che vedremo adesso è un pò più complesso e riguarda l'esecuzione di subquery, sempre all'interno di un'applicazione Webtop/WDK.
Supponiamo quindi di dover eseguire la seguente query DQL:
SELECT *
FROM my_document1
WHERE my_field IN
(SELECT r_object_id FROM my_document2 WHERE ...);
L'idea alla base della soluzione che stiamo per vedere è quella di eseguire la subquery separatamente, utilizzando poi l'elenco dei valori nella clausola IN
.
Come prima cose vediamo come eseguire la subquery e ricavare i valori.
protected IDfQueryBuilder buildQuery() throws Exception {
//[...]
// creazione della query DQL
IDfPassThroughQuery query = getSearchInfo().getSearchService()
.newQueryMgr()
.newPassThroughQuery(
"SELECT r_object_id FROM my_document2 WHERE ..."
);
// si associano alla query creta tutti i DOCBASE presenti
// nella connessione a Documentum
IDfEnumeration availableSources = getSearchInfo().getSearchService()
.getSourceMap().getAvailableSources();
while (availableSources.hasMoreElements()) {
IDfSearchSource source =
(IDfSearchSource) availableSources.nextElement();
query.addSelectedSource(source.getName());
}
// creazione del processor della query
IDfQueryProcessor queryProc = getSearchInfo().getSearchService()
.newQueryProcessor(query, true);
// si esegue la query DQL e si valorizza la lista dei risultati
IDfList listForINClause = new DfList(IDfList.DF_STRING);
IDfResultsSet resultsSet = queryProc.getResults();
while (resultsSet.next()) {
IDfResultEntry entry = resultsSet.getResult();
listForINClause.appendString(entry.getString("r_object_id"));
}
//[...]
}
A questo punto è sufficiente aggiungere la clausola IN
al nostro oggetto IDfQueryBuilder
ed il gioco è fatto.
IDfExpressionSet expressionSet = qb.getRootExpressionSet();
expressionSet.addValueListAttrExpression("my_field",
IDfValue.DF_STRING,
IDfValueListAttrExpression.SEARCH_OP_IN,
false,
false,
listForINClause);
Il punto fondamentale è il metodo addValueListAttrExpression
pertanto analizziamone i parametri usati (confrontandoli con la query DQL vista sopra):
"my_field"
, è il nome del campo su cui dobbiamo fare la ricerca IN;IDfValue.DF_STRING
, è il tipo del campo (stringa, intero, boolean, ...);IDfValueListAttrExpression.SEARCH_OP_IN
, è l'operazione di filtro da eseguire (nel nostro caso IN);false
, abilita/disabilita la ricerca case sensitive;false
, configura l'attributo come repeating in modo che il framework utilizzi la clausola ANY;listForINClause
, elenco dei valori da cercare.
Enjoy!