Deze sectie beschrijft hoe te om de Bouwer van de Vraag uit te breiden door een douane te uitvoeren predikaat beoordelaar.
De Query Builder biedt een eenvoudige manier om de opslagplaats voor inhoud op te vragen. AEM wordt geleverd met een set evaluatoren die u helpen met uw gegevens om te gaan.
Nochtans zou u uw vragen kunnen willen vereenvoudigen door een douane uit te voeren predikt beoordelaar die wat ingewikkeldheid verbergt en een betere semantiek verzekert.
Een aangepaste predikaat kan ook andere dingen uitvoeren die niet direct mogelijk zijn met XPath, bijvoorbeeld:
De kwesties van prestaties moeten in overweging worden genomen wanneer het uitvoeren van een douane predikaat.
U kunt voorbeelden van vragen in de sectie van de Bouwer van de Vraag vinden.
CODE VOOR GITHUB
U kunt de code van deze pagina op GitHub vinden
Een predikaat beoordelaar behandelt de evaluatie van bepaalde predikaten, die de bepalende beperkingen van een vraag zijn.
Hiermee wordt een zoekrestrictie op een hoger niveau (zoals "breedte > 200") toegewezen aan een specifieke JCR-query die past bij het werkelijke inhoudsmodel (bijvoorbeeld metagegevens/@breedte > 200). Of het kan knopen manueel filtreren en hun beperkingen controleren.
Zie de Java-documentatie voor meer informatie over het PredicateEvaluator
- en com.day.cq.search
-pakket.
Als voorbeeld beschrijft deze sectie hoe te om een douane te creëren predikaat beoordelaar die gegevens helpt die op de replicatiemetagegevens worden gebaseerd:
cq:lastReplicated
die de datum van de laatste replicatieactie opslaat
cq:lastReplicatedBy
die identiteitskaart van de gebruiker opslaat die de laatste replicatieactie teweegbracht
cq:lastReplicationAction
die de laatste replicatiehandeling opslaat (bijvoorbeeld activering, deactivering)
De volgende vraag haalt de lijst van knopen in /content
tak die door admin
sinds het begin van het jaar zijn geactiveerd.
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=>=
Deze vraag is geldig maar moeilijk te lezen en benadrukt niet het verband tussen de drie replicatieeigenschappen. Het uitvoeren van een douane predikaat beoordelaar zal de ingewikkeldheid verminderen en de semantiek van deze vraag verbeteren.
Het doel van ReplicationPredicateEvaluator
is de bovengenoemde vraag te steunen gebruikend de volgende syntaxis.
path=/content
replic.by=admin
replic.since=2013-01-01T00:00:00.000+01:00
replic.action=Activate
Het groeperen van replicatiemagegevens predikt met een douane predikaat evaluator helpt om een zinvolle vraag tot stand te brengen.
De opstelling van nieuwe AEM die maven gebruiken wordt gedocumenteerd door Hoe te AEM Projecten bouwen gebruikend Apache Maven.
Eerst moet u de Geweven gebiedsdelen van uw project bijwerken. De PredicateEvaluator
maakt deel uit van het cq-search
artefact zodat moet het aan uw Maven pom dossier worden toegevoegd.
Het bereik van de cq-search
-afhankelijkheid wordt ingesteld op provided
omdat cq-search
wordt geleverd door de OSGi
-container.
pom.xml
Het volgende fragment toont de verschillen, in Unified diff format
@@ -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-evaluator- pom.xml
Het cq-search
project bevat de AbstractPredicateEvaluator
abstracte klasse. Dit kan met een paar stappen worden uitgebreid om uw eigen douane uit te voeren voorspelt beoordelaar (PredicateEvaluator
).
In de volgende procedure wordt uitgelegd hoe u een expressie Xpath
kunt bouwen om gegevens te filteren. Een andere optie zou zijn de includes
methode uit te voeren die gegevens op een rijbasis selecteert. Zie de Java-documentatie voor meer informatie.
Een nieuwe Java-klasse maken die com.day.cq.search.eval.AbstractPredicateEvaluator
uitbreidt
Annoteer uw klasse met een @Component
als het volgende
src/main/java/com/adobe/aem/docs/search/ReplicationPredicateEvaluator.java
Het volgende fragment toont de verschillen, in Unified diff format
@@ -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-evaluator- src/main/java/com/adobe/aem/docs/search/ReplicationPredicateEvaluator.java
De factory
moet een unieke tekenreeks zijn die begint met com.day.cq.search.eval.PredicateEvaluator/
en eindigt met de naam van uw aangepaste PredicateEvaluator
.
De naam van PredicateEvaluator
is de voorspelbare naam, die wordt gebruikt wanneer het bouwen van vragen.
Overschrijven:
public String getXPathExpression(Predicate predicate, EvaluationContext context)
In de opheffingsmethode bouwt u een Xpath
uitdrukking die op Predicate
in argument wordt gebaseerd.
De volledige implementatie van deze PredicateEvaluator
zou aan de volgende klasse kunnen gelijkaardig zijn.
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-evaluator - src/main/java/com/adobe/aem/docs/search/ReplicationPredicateEvaluator.java