Implementera en anpassad predikatutvärderare för Query Builder implementing-a-custom-predicate-evaluator-for-the-query-builder

CAUTION
AEM 6.4 har nått slutet på den utökade supporten och denna dokumentation är inte längre uppdaterad. Mer information finns i teknisk supportperiod. Hitta de versioner som stöds här.

I det här avsnittet beskrivs hur du utökar Query Builder genom att implementera en anpassad predikatutvärderare.

Översikt overview

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
NOTE
Prestandafrågor måste beaktas när du implementerar ett anpassat predikat.
NOTE
Du kan hitta exempel på frågor i Query Builder -avsnitt.

KOD PÅ GITHUB

Koden för den här sidan finns på GitHub

Förutse utvärderaren i detalj predicate-evaluator-in-detail

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.

NOTE
Mer information om PredicateEvaluator och com.day.cq.search paketet finns i Java-dokumentation.

Implementera en anpassad predikatutvärderare för replikeringsmetadata implementing-a-custom-predicate-evaluator-for-replication-metadata

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 querying-replication-metadata-with-default-predicate-evaluators

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 objectives

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 updating-maven-dependencies

NOTE
Införandet av nya AEM med hjälp av Maven dokumenteras av Skapa AEM projekt med Apache Maven.

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.

NOTE
Omfattningen av 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 writing-the-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).

NOTE
I proceduren nedan beskrivs hur du skapar en 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.
  1. Skapa en ny Java-klass som utökar com.day.cq.search.eval.AbstractPredicateEvaluator

  2. Anteckna din klass med en @Component gillar följande

    src/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

NOTE
The factorymåste vara en unik sträng som börjar med com.day.cq.search.eval.PredicateEvaluator/och avslutas med namnet på din egen PredicateEvaluator.
NOTE
Namnet på PredicateEvaluator är predikatnamnet, som används när frågor skapas.
  1. Åsidosätt:

    code language-java
    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 example-of-a-custom-predicate-evalutor-for-replication-metadata

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 ");

        }

    }

}

aem-search-custom-prediate-utvärderator - src/main/java/com/adobe/aem/docs/search/ReplicationPredicateEvaluator.java

recommendation-more-help
2315f3f5-cb4a-4530-9999-30c8319c520e