Het uitvoeren van een Evaluator van de Predicatie van de Douane voor de Bouwer van de Vraag implementing-a-custom-predicate-evaluator-for-the-query-builder
In dit document wordt beschreven hoe u het dialoogvenster Query Builder door een aangepaste evaluatieversie van de predikaat te implementeren.
Overzicht overview
De Query Builder biedt een eenvoudige manier om de opslagplaats voor inhoud te vragen. AEM wordt geleverd met een reeks beoordelaars met voorspelling waarmee u uw gegevens kunt opvragen.
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:
- Gegevens opvragen van een andere service
- Aangepast filteren op basis van een berekening
- Open aem-onderzoek-douane-predicaat-evaluatorproject op GitHub
- Het project downloaden als een ZIP-bestand
Voorspelende evaluator in detail predicate-evaluator-in-detail
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 toegewezen (zoals width>200
) naar een specifieke JCR-query die past bij het daadwerkelijke inhoudsmodel (bijvoorbeeld metadata/@width > 200
). Of het kan knopen manueel filtreren en hun beperkingen controleren.
PredicateEvaluator
en de com.day.cq.search
pakket zie Java-documentatie.Implementatie van een aangepaste voorspellende evaluator voor replicatiemetagegevens implementing-a-custom-predicate-evaluator-for-replication-metadata
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 opslaatcq:lastReplicatedBy
die identiteitskaart van de gebruiker opslaat die de laatste replicatieactie teweegbrachtcq:lastReplicationAction
die de laatste replicatieactie (bijvoorbeeld, Activering, Deactivering) opslaat
Replicatiemetagegevens met standaardvoorspellende evaluatoren opvragen querying-replication-metadata-with-default-predicate-evaluators
Met de volgende query wordt de lijst met knooppunten opgehaald in /content
vertakking die is geactiveerd door admin
sinds het begin van het jaar.
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 evaluator zal de ingewikkeldheid verminderen en de semantiek van deze vraag verbeteren.
Doelstellingen objectives
Het doel van het ReplicationPredicateEvaluator
moet bovenstaande query met de volgende syntaxis ondersteunen.
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.
Geweven afhankelijkheden bijwerken updating-maven-dependencies
Eerst moet u de Geweven gebiedsdelen van uw project bijwerken. De PredicateEvaluator
maakt deel uit van de cq-search
artefact, dus moet deze worden toegevoegd aan het pomabestand Maven.
cq-search
afhankelijkheid is ingesteld op provided
omdat cq-search
wordt verstrekt door OSGi
container.In het volgende fragment worden de verschillen in de pom.xml
bestand, in Unified Diff-indeling
@@ -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>
Het schrijven van ReplicationPredicateEvaluator writing-the-replicationpredicateevaluator
De cq-search
het project bevat AbstractPredicateEvaluator
abstracte klasse. Dit kan met een paar stappen worden uitgebreid om uw eigen douane uit te voeren voorspelt beoordelaar (PredicateEvaluator
).
Xpath
expressie om gegevens te filteren. Een andere mogelijkheid zou zijn om de includes
methode waarmee gegevens op rijbasis worden geselecteerd. Zie de Java-documentatie voor meer informatie .-
Een nieuwe Java-klasse maken die een uitbreiding
com.day.cq.search.eval.AbstractPredicateEvaluator
-
Annoteer uw klasse met een
@Component
zoals fragmenten in Unified Diff-indelingcode language-text @@ -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 { }
note note NOTE De factory
moet een unieke tekenreeks zijn die begint metcom.day.cq.search.eval.PredicateEvaluator/
en eindigend met de naam van uw aangepastePredicateEvaluator
.note note NOTE De naam van PredicateEvaluator
is de predicaatnaam, die wordt gebruikt wanneer het bouwen van vragen. -
Overschrijven:
code language-java public String getXPathExpression(Predicate predicate, EvaluationContext context)
In de overschrijfmethode bouwt u een
Xpath
op basis van dePredicate
geargumenteerd.
Voorbeeld van een aangepaste voorspellende evaluator voor replicatiemetagegevens example-of-a-custom-predicate-evaluator-for-replication-metadata
De volledige uitvoering van deze PredicateEvaluator
Dit kan vergelijkbaar zijn met de volgende klasse.
/*
* #%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 ");
}
}
}