Implementazione di un valutatore del predicato personalizzato per il Generatore di query implementing-a-custom-predicate-evaluator-for-the-query-builder
Questa sezione descrive come estendere il Query Builder implementando un valutatore predicato personalizzato.
Panoramica overview
La Query Builder offre un modo semplice per eseguire query sull’archivio dei contenuti. AEM viene fornito con un set di valutatori di predicati che ti aiutano a gestire i tuoi dati.
Tuttavia, potrebbe essere utile semplificare le query implementando un valutatore di predicati personalizzato che nasconde una certa complessità e garantisce una semantica migliore.
Un predicato personalizzato potrebbe anche eseguire altre operazioni non direttamente possibili con XPath, ad esempio:
- ricerca di dati da un servizio
- filtro personalizzato in base al calcolo
CODICE SU GITHUB
Puoi trovare il codice di questa pagina su GitHub
- Apri il progetto aem-search-custom-predicate-valutator su GitHub
- Scarica il progetto come un file ZIP
Predicatore valutatore in dettaglio predicate-evaluator-in-detail
Un valutatore predicato gestisce la valutazione di alcuni predicati, che sono i vincoli di definizione di una query.
Associa un vincolo di ricerca di livello superiore (ad esempio "larghezza > 200") a una query JCR specifica che si adatta al modello di contenuto effettivo (ad esempio metadati/@larghezza > 200). Oppure può filtrare manualmente i nodi e controllarne i vincoli.
PredicateEvaluator
e com.day.cq.search
vedi il pacchetto Documentazione Java.Implementazione di un valutatore del predicato personalizzato per i metadati di replica implementing-a-custom-predicate-evaluator-for-replication-metadata
Ad esempio, in questa sezione viene descritto come creare un valutatore di predicati personalizzato per aiutare i dati in base ai metadati di replica:
-
cq:lastReplicated
che memorizza la data dell'ultima azione di replica -
cq:lastReplicatedBy
che memorizza l'id dell'utente che ha attivato l'ultima azione di replica -
cq:lastReplicationAction
che memorizza l’ultima azione di replica (ad esempio Attivazione, Disattivazione)
Query dei metadati di replica con valutatori predefiniti dei predicati querying-replication-metadata-with-default-predicate-evaluators
La seguente query recupera l’elenco di nodi in /content
ramo attivato da admin
dall'inizio dell'anno.
path=/content
1_property=cq:lastReplicatedBy
1_property.value=admin
2_property=cq:lastReplicationAction
2_property.value=Activate
daterange.property=cq:lastReplicated
daterange.lowerBound=2013-01-01T00:00:00.000+01:00
daterange.lowerOperation=>=
Questa query è valida ma difficile da leggere e non evidenzia la relazione tra le tre proprietà di replica. L’implementazione di un valutatore di predicati personalizzato ridurrà la complessità e migliorerà la semantica di questa query.
Obiettivi objectives
L'obiettivo del ReplicationPredicateEvaluator
è per supportare la query di cui sopra utilizzando la seguente sintassi.
path=/content
replic.by=admin
replic.since=2013-01-01T00:00:00.000+01:00
replic.action=Activate
Il raggruppamento dei predicati dei metadati di replica con un valutatore predicato personalizzato consente di creare una query significativa.
Aggiornamento delle dipendenze Maven updating-maven-dependencies
Prima devi aggiornare le dipendenze Maven del progetto. La PredicateEvaluator
fa parte del cq-search
artefatto in modo che debba essere aggiunto al tuo file pom Maven.
cq-search
la dipendenza è impostata su provided
perché cq-search
sono fornite dal OSGi
contenitore.pom.xml
Il frammento seguente mostra le differenze, in formato diff unificato
@@ -120,6 +120,12 @@
<scope>provided</scope>
<dependency>
+ <groupid>com.day.cq</groupid>
+ <artifactid>cq-search</artifactid>
+ <version>5.6.4</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
<groupid>junit</groupid>
<artifactid>junit</artifactid>
<version>3.8.1</version></dependency>
aem-search-custom-predicate-valutator- pom.xml
Scrittura di ReplicationPredicateEvaluator writing-the-replicationpredicateevaluator
La cq-search
il progetto contiene AbstractPredicateEvaluator
classe astratta. Questo può essere esteso con alcuni passaggi per implementare il tuo valutatore di predicati personalizzato (PredicateEvaluator
).
Xpath
espressione per filtrare i dati. Un'altra opzione consiste nell'implementare includes
metodo che seleziona i dati su base di riga. Consulta la sezione Documentazione Java per ulteriori informazioni.-
Crea una nuova classe Java che si estende
com.day.cq.search.eval.AbstractPredicateEvaluator
-
Annotare la classe con un
@Component
come seguesrc/main/java/com/adobe/aem/docs/search/ReplicationPredicateEvaluator.java
Il frammento seguente mostra le differenze, in formato diff unificato
@@ -19,8 +19,11 @@
*/
package com.adobe.aem.docs.search;
+import org.apache.felix.scr.annotations.Component;
+import com.day.cq.search.eval.AbstractPredicateEvaluator;
+@Component(metatype = false, factory = "com.day.cq.search.eval.PredicateEvaluator/repli")
public class ReplicationPredicateEvaluator extends AbstractPredicateEvaluator {
}
aem-search-custom-predicate-valutator- src/main/java/com/adobe/aem/docs/search/ReplicationPredicateEvaluator.java
factory
deve essere una stringa univoca che inizia con com.day.cq.search.eval.PredicateEvaluator/
e che terminano con il nome del tuo personalizzato PredicateEvaluator
.PredicateEvaluator
è il nome del predicato, utilizzato per la creazione di query.-
Sostituisci:
code language-java public String getXPathExpression(Predicate predicate, EvaluationContext context)
Nel metodo override viene generato un
Xpath
basato suPredicate
dati in discussione.
Esempio di valutazione del predicato personalizzato per i metadati di replica example-of-a-custom-predicate-evalutor-for-replication-metadata
La completa attuazione di tale PredicateEvaluator
potrebbe essere simile alla classe seguente.
src/main/java/com/adobe/aem/docs/search/ReplicationPredicateEvaluator.java
/*
* #%L
* aem-docs-custom-predicate-evaluator
* %%
* Copyright (C) 2013 Adobe Research
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
package com.adobe.aem.docs.search;
import org.apache.felix.scr.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.day.cq.search.Predicate;
import com.day.cq.search.eval.AbstractPredicateEvaluator;
import com.day.cq.search.eval.EvaluationContext;
@Component(metatype = false, factory = "com.day.cq.search.eval.PredicateEvaluator/repli")
public class ReplicationPredicateEvaluator extends AbstractPredicateEvaluator {
static final String PE_NAME = "replic";
static final String PN_LAST_REPLICATED_BY = "cq:lastReplicatedBy";
static final String PN_LAST_REPLICATED = "cq:lastReplicated";
static final String PN_LAST_REPLICATED_ACTION = "cq:lastReplicationAction";
static final String PREDICATE_BY = "by";
static final String PREDICATE_SINCE = "since";
static final String PREDICATE_SINCE_OP = " >= ";
static final String PREDICATE_ACTION = "action";
Logger log = LoggerFactory.getLogger(getClass());
/**
* Returns a XPath expression filtering by replication metadata.
*
* @see com.day.cq.search.eval.AbstractPredicateEvaluator#getXPathExpression(com.day.cq.search.Predicate,
* com.day.cq.search.eval.EvaluationContext)
*/
@Override
public String getXPathExpression(Predicate predicate,
EvaluationContext context) {
log.debug("predicate {}", predicate);
String date = predicate.get(PREDICATE_SINCE);
String user = predicate.get(PREDICATE_BY);
String action = predicate.get(PREDICATE_ACTION);
StringBuilder sb = new StringBuilder();
if (date != null) {
sb.append(PN_LAST_REPLICATED).append(PREDICATE_SINCE_OP);
sb.append("xs:dateTime('").append(date).append("')");
}
if (user != null) {
addAndOperator(sb);
sb.append(PN_LAST_REPLICATED_BY);
sb.append("='").append(user).append("'");
}
if (action != null) {
addAndOperator(sb);
sb.append(PN_LAST_REPLICATED_ACTION);
sb.append("='").append(action).append("'");
}
String xpath = sb.toString();
log.debug("xpath **{}**", xpath);
return xpath;
}
/**
* Add an and operator if the builder is not empty.
*
* @param sb a {@link StringBuilder} containing the query under construction
*/
private void addAndOperator(StringBuilder sb) {
if (sb.length() != 0) {
sb.append(" and ");
}
}
}
aem-search-custom-predicate-valutator - src/main/java/com/adobe/aem/docs/search/ReplicationPredicateEvaluator.java