bloggers bloggers

Jader Jed Francia
Messaggi: 63
Stelle: 0
Data: 18/02/21
Marco Napolitano
Messaggi: 78
Stelle: 0
Data: 12/06/20
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

Documentum - IDfQueryBuilder ed esecuzione subquery DQL

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):

  1. "my_field", è il nome del campo su cui dobbiamo fare la ricerca IN;
  2. IDfValue.DF_STRING, è il tipo del campo (stringa, intero, boolean, ...);
  3. IDfValueListAttrExpression.SEARCH_OP_IN, è l'operazione di filtro da eseguire (nel nostro caso IN);
  4. false, abilita/disabilita la ricerca case sensitive;
  5. false, configura l'attributo come repeating in modo che il framework utilizzi la clausola ANY;
  6. listForINClause, elenco dei valori da cercare.


Enjoy!

Precedente
Commenti
Nessun commento. Vuoi essere il primo.