Implementazione di un valutatore predefinito personalizzato per Query Builder

Questa sezione descrive come estendere il Generatore di query implementando un valutatore di predicati personalizzato.

Panoramica

Query Builder offre un modo semplice per eseguire query sull'archivio dei contenuti. AEM viene fornito con un insieme di valutatori di predicati che consentono di gestire i dati.

Tuttavia, potrebbe essere utile semplificare le query implementando un valutatore di predicati personalizzato che nasconde una certa complessità e assicura una semantica migliore.

Un predicato personalizzato potrebbe anche eseguire altre operazioni non direttamente possibili con XPath, ad esempio:

  • ricerca di alcuni dati da un servizio
  • filtraggio personalizzato in base al calcolo
NOTA

Durante l'implementazione di un predicato personalizzato è necessario tenere in considerazione i problemi di prestazioni.

NOTA

Potete trovare esempi di query nella sezione Query Builder.

CODICE SU GITHUB

Puoi trovare il codice di questa pagina su GitHub

Predicate Valutator in Detail

Un valutatore predicato gestisce la valutazione di determinati predicati, che sono i vincoli di definizione di una query.

Mappa 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, metadata/@larghezza > 200). Oppure può filtrare manualmente i nodi e controllarne i vincoli.

NOTA

Per ulteriori informazioni sul pacchetto PredicateEvaluator e com.day.cq.search, consultare la documentazione Java.

Implementazione di un valutatore personalizzato per i metadati di replica

Ad esempio, in questa sezione viene illustrato come creare un valutatore di predicati personalizzato che supporti 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 gli strumenti di valutazione predefiniti

La seguente query recupera l'elenco di nodi nel ramo /content che sono stati attivati 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

L'obiettivo di ReplicationPredicateEvaluator è quello di supportare la query precedente 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 di metadati di replica con un valutatore predicato personalizzato consente di creare una query significativa.

Aggiornamento delle dipendenze del cielo

NOTA

L'impostazione di nuovi progetti AEM con maven è documentata da Come creare AEM progetti con Apache Maven.

Prima devi aggiornare le dipendenze Paradiso del tuo progetto. Il PredicateEvaluator fa parte dell'artefatto cq-search e quindi deve essere aggiunto al file pom di Maven.

NOTA

L'ambito della dipendenza cq-search è impostato su provided perché cq-search sarà fornito dal contenitore OSGi.

pom.xml

Lo snippet di codice 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-evaluate- pom.xml

Scrittura di ReplicationPredicateEevaluate

Il progetto cq-search contiene la classe astratta AbstractPredicateEvaluator. Questo può essere esteso con alcuni passaggi per implementare il proprio valutatore predicato personalizzato (PredicateEvaluator).

NOTA

La procedura seguente spiega come creare un'espressione Xpath per filtrare i dati. Un'altra opzione consiste nell'implementare il metodo includes che seleziona i dati su base di riga. Per ulteriori informazioni, consultare la documentazione Java.

  1. Creare una nuova classe Java che si estende su com.day.cq.search.eval.AbstractPredicateEvaluator

  2. Annotate la classe con un @Component simile al seguente

    src/main/java/com/adobe/aem/docs/search/ReplicationPredicateEvaluator.java

    Lo snippet di codice 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-evaluate- src/main/java/com/adobe/aem/docs/search/ReplicationPredicateEvaluator.java

NOTA

La factorydeve essere una stringa univoca che inizia con com.day.cq.search.eval.PredicateEvaluator/e termina con il nome della PredicateEvaluator personalizzata.

NOTA

Il nome dell' PredicateEvaluator è il nome del predicato, utilizzato per la creazione di query.

  1. Sostituisci:

    public String getXPathExpression(Predicate predicate, EvaluationContext context)
    

    Nel metodo override si crea un'espressione Xpath basata sull'argomento Predicate fornito in.

Esempio di un predefinito personalizzato per metadati di replica

L'implementazione completa di questo 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-evaluate - src/main/java/com/adobe/aem/docs/search/ReplicationPredicateEvaluator.java

In questa pagina

Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now