Implementera en anpassad predikatutvärderare för Query Builder
- Ämnen:
- Developing
Skapat för:
- Developer
I det här avsnittet beskrivs hur du utökar Query Builder genom att implementera en anpassad predikatutvärderare.
Översikt
The Query Builder erbjuder ett enkelt sätt att fråga innehållsdatabasen. AEM levereras med en uppsättning prediktiva utvärderare som hjälper dig att hantera dina data.
Men du kanske vill förenkla dina frågor genom att implementera en anpassad predikatutvärderare som döljer komplexiteten och ger ett bättre semantiskt resultat.
Ett anpassat predikat kan även utföra andra saker som inte är direkt möjliga med XPath, till exempel:
- söka efter vissa data från vissa tjänster
- anpassad filtrering baserad på beräkning
KOD PÅ GITHUB
Koden för den här sidan finns på GitHub
- Öppna aem-search-custom-prediate-valuator-projekt på GitHub
- Hämta projektet som en ZIP-fil
Förutse utvärderaren i detalj
En predikatutvärderare hanterar utvärderingen av vissa predikat, vilket är definieringsbegränsningarna för en fråga.
Det mappar en sökbegränsning på högre nivå (t.ex. "width > 200") till en specifik JCR-fråga som passar den faktiska innehållsmodellen (t.ex. metadata/@width > 200). Det kan också filtrera noder manuellt och kontrollera deras begränsningar.
Implementera en anpassad predikatutvärderare för replikeringsmetadata
I det här avsnittet beskrivs hur du skapar en anpassad predikatutvärderare som kan användas för data baserat på replikeringens metadata:
-
cq:lastReplicated
som lagrar datumet för den senaste replikeringsåtgärden -
cq:lastReplicatedBy
som lagrar ID för den användare som utlöste den senaste replikeringsåtgärden -
cq:lastReplicationAction
som lagrar den senaste replikeringsåtgärden (t.ex. aktivering, inaktivering)
Frågar efter replikeringsmetadata med standardpredikatutvärderare
Följande fråga hämtar listan med noder i /content
gren som har aktiverats av admin
sedan början av året.
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=>=
Frågan är giltig men svårläst och visar inte relationen mellan de tre replikeringsegenskaperna. Implementering av en anpassad predikatutvärderare minskar komplexiteten och förbättrar semantiken i den här frågan.
Mål
Målsättningen med ReplicationPredicateEvaluator
ska ha stöd för ovanstående fråga med följande syntax.
path=/content
replic.by=admin
replic.since=2013-01-01T00:00:00.000+01:00
replic.action=Activate
Genom att gruppera metadata för replikering med en anpassad predikatutvärderare kan du skapa en meningsfull fråga.
Uppdaterar Maven Dependencies
Först måste du uppdatera Maven-beroendena för ditt projekt. The PredicateEvaluator
är en del av cq-search
artefakt så den behöver läggas till i din Maven-pom-fil.
cq-search
beroende är inställt på provided
därför cq-search
kommer att tillhandahållas av OSGi
behållare.pom.xml
I följande utdrag visas skillnaderna i enhetligt format för differenser
@@ -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-prediate-utvärderator- pom.xml
Skriver ReplicationPredicateEvaluator
The cq-search
projektet innehåller AbstractPredicateEvaluator
abstrakt klass. Detta kan utökas med några steg för att implementera en egen anpassad predikatutvärderare (PredicateEvaluator
).
Xpath
-uttryck för att filtrera data. Ett annat alternativ är att implementera includes
metod som markerar data på radbasis. Se Java-dokumentation för mer information.-
Skapa en ny Java-klass som utökar
com.day.cq.search.eval.AbstractPredicateEvaluator
-
Anteckna din klass med en
@Component
gillar följandesrc/main/java/com/adobe/aem/docs/search/ReplicationPredicateEvaluator.java
I följande utdrag visas skillnaderna i enhetligt format för differenser
@@ -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-prediate-utvärderator- src/main/java/com/adobe/aem/docs/search/ReplicationPredicateEvaluator.java
factory
måste vara en unik sträng som börjar med com.day.cq.search.eval.PredicateEvaluator/
och avslutas med namnet på din egen PredicateEvaluator
.PredicateEvaluator
är predikatnamnet, som används när frågor skapas.-
Åsidosätt:
public String getXPathExpression(Predicate predicate, EvaluationContext context)
I åsidosättningsmetoden skapar du en
Xpath
uttryck baserat påPredicate
anges i argumentet.
Exempel på en anpassad predikatutvärderare för replikeringsmetadata
Det fullständiga genomförandet av detta PredicateEvaluator
kan likna följande klass.
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 ");
}
}
}
Experience Manager
- Utveckla användarhandboken - översikt
- Introduktion för utvecklare
- Komma igång med utveckling i AEM Sites – WKND-självstudiekurs
- AEM kärnbegrepp
- Struktur för det AEM användargränssnittet med pekskärm
- Koncepten i det AEM användargränssnittet med pekskärm
- AEM - riktlinjer och bästa praxis
- Använda bibliotek på klientsidan
- Developing and Page Diff
- Begränsningar för redigerare
- CSRF Protection Framework
- Datamodellering - David Nueschelers modell
- Bidrar till AEM
- Dokumentskydd
- Referensmaterial
- Skapa en webbplats med alla funktioner (Classic UI)
- Designer och Designer (Classic UI)
- Plattform
- Fusklapp för Sling
- Använda Sling-adaptrar
- Taggbibliotek
- Mallar
- Använda Sling Resource Merger i AEM
- Övertäckningar
- Namnkonventioner
- Skapa en ny GRE-fältkomponent
- Query Builder
- Taggar
- Anpassa sidor som visas av felhanteraren
- Anpassade nodtyper
- Lägga till teckensnitt för grafikåtergivning
- Ansluta till SQL-databaser
- Extern URL
- Skapa och använda jobb för avlastning
- Konfigurerar cookie-användning
- Så här programmässigt kommer du åt AEM JCR
- Integrera tjänster med JMX-konsolen
- Developing the Bulk Editor
- Utveckla rapporter
- eCommerce
- Komponenter
- Kärnkomponenter
- Formatsystem
- Komponenter - översikt
- AEM - Grunderna
- Utveckla AEM
- Utveckla AEM - kodexempel
- JSON-exporterare för innehållstjänster
- Aktivera JSON-export för en komponent
- Bildredigeraren
- Dekoration-tagg
- Använda Dölj villkor
- Konfigurera flera redigerare på plats
- Utvecklarläge
- Testa användargränssnittet
- Komponenter för innehållsfragment
- Hämta sidinformation i JSON-format
- Internationalisering
- Klassiska gränssnittskomponenter
- Headless Experience Management
- Headless och Hybrid with AEM
- Aktivera JSON-export för en komponent
- Enkelsidiga program
- SPA introduktion och genomgång
- SPA WKND - självstudiekurs
- Getting Started with SPA in AEM - React
- Komma igång med SPA i AEM - Angular
- Implementera en React Component for SPA
- SPA djupdykning
- SPA
- Utveckla SPA för AEM
- SPA Blueprint
- SPA
- Dynamisk mappning av modell till komponent för SPA
- SPA
- SPA och Adobe Experience Platform Launch Integration
- SPA- och serveråtergivning
- SPA referensmaterial
- HTTP-API
- Innehållsfragment
- Experience Fragments
- Utvecklingsverktyg
- Utvecklingsverktyg
- AEM Modernization Tools
- Dialogruteredigeraren
- Verktyget Dialogkonvertering
- Utveckla med CRXDE Lite
- Hantera paket med Maven
- Utveckla AEM projekt med Eclipse
- Skapa AEM projekt med Apache Maven
- Utveckla AEM projekt med IntelliJ IDEA
- Så här använder du VLT-verktyget
- Så här använder du proxyserververktyget
- AEM Brackets Extension
- AEM Developer Tools for Eclipse
- AEM
- Personanpassning
- Utöka AEM
- Anpassa sidredigering
- Anpassa konsolerna
- Anpassa vyer av Sidegenskaper
- Konfigurera din sida för gruppredigering av sidegenskaper
- Anpassa och utöka Content Fragments
- Utöka arbetsflöden
- Utöka Multi Site Manager
- Spårning och analys
- Cloud Services
- Skapa anpassade tillägg
- Forms
- Integrera tjänster med JMX-konsolen
- Developing the Bulk Editor
- Utöka Classic UI
- Testning
- Bästa praxis
- Mobil webb