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

Impostare IDfQueryBuilder con attributi repeating multipli

Mi sono recentemente scontrato con un problema apparentemente banale durante la realizzazione di una ricerca custom per un'applicazione Webtop-based.

La problematica era realizzare, tramite l'interfaccia IDfQueryBuilder, una query DQL del tipo:

SELECT *
FROM my_document
WHERE ANY (attr1 = ? AND attr2 = ?);

Entrambi gli attributi attr1 e attr2 sono di tipo repeating e devono essere racchiusi all'interno delle parentesti perchè mi serve fare una ricerca posizionale sui valori degli attributi, ossia una cosa del tipo:

attr1[0]=? AND attr2[0]=?
attr1[1]=? AND attr2[1]=?
attr1[2]=? AND attr2[2]=?
...e così via

Peccato che IDfQueryBuilder non consenta di creare un'espressione composta di quel tipo, ma consente solamente le 2 parti separate:

SELECT *
FROM my_document
WHERE ANY attr1 = ? AND ANY attr2 = ?;

Ecco quindi come fare a risolvere il problema.

Innanzitutto, nella classe Java che prepara la ricerca (il metodo buildQuery per intenderci) è necessario aggiungere le 2 espressioni di ricerca come se gli attributi NON fossero repeating:

IDfQueryBuilder qb = ...
IDfExpressionSet set = qb.getRootExpressionSet();
set.addSimpleAttrExpression("attr1", IDfValue.DF_STRING,
                            IDfSimpleAttrExpression.SEARCH_OP_EQUAL,
                            true, false, "valore");
set.addSimpleAttrExpression("attr2", IDfValue.DF_STRING,
                            IDfSimpleAttrExpression.SEARCH_OP_EQUAL,
                            true, false, "valore");

Dopodichè è necessario modificare il file dfc-dqlhints.xml al fine di forzare la ricerca ad utilizzare la DQL hint ROW_BASED che consente di effettuare una ricerca su attributi repeating multipli senza specificare la clausola ANY.

<Rule>
   <Condition>
      <From>
         <Type>my_document</Type>
      </From>
      <Where condition="all">
         <Attribute>attr1</Attribute>
         <Attribute>attr2</Attribute>
      </Where>
   </Condition>
   <DQLHint>ENABLE(ROW_BASED)</DQLHint>
</Rule>

Questa nuova rule da aggiungere ha il significato: per ogni query fatta sul tipo my_document che includa entrambi gli attributi attr1 e attr2, utilizzare la DQL hint ROW_BASED.

Ecco quindi che la query DQL che viene eseguita dal sistema sarà:

SELECT *
FROM my_document
WHERE attr1 = ? AND attr2 = ?
ENABLE(ROW_BASED);

Enjoy!

Precedente
Commenti
Nessun commento. Vuoi essere il primo.