Implementing a Custom Predicate Evaluator for Replication Metadata
As an example this section describes how to create a custom predicate evaluator that helps data based on the replication metadata:
-
cq:lastReplicatedthat stores the date of the last replication action -
cq:lastReplicatedBythat stores the id of the user who triggered the last replication action -
cq:lastReplicationActionthat stores the last replication action (for example, Activation, Deactivation)
Querying Replication Metadata with Default Predicate Evaluators
The following query fetches the list of nodes in /content branch that have been activated by admin since the beginning of the year.
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=>=
This query is valid but hard to read and does not highlight the relationship between the three replication properties. Implementing a custom predicate evaluator reduces the complexity and improve the semantic of this query.
Objectives
The goal of the ReplicationPredicateEvaluator is to support the above query using the following syntax.
path=/content
replic.by=admin
replic.since=2013-01-01T00:00:00.000+01:00
replic.action=Activate
Grouping replication metadata predicates with a custom predicate evaluator helps to create a meaningful query.
Updating Maven Dependencies
First, update the Maven dependencies of your project. The PredicateEvaluator is part of the cq-search artifact so it must be added to your Maven pom.xml file.
cq-search dependency is set to provided because cq-search is provided by the OSGi container.pom.xml
The following snippet shows the differences 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
Writing The ReplicationPredicateEvaluator
The cq-search project contains the AbstractPredicateEvaluator abstract class. This can be extended with a few steps to implement your own custom predicate evaluator (PredicateEvaluator).
Xpath expression to filter data. Another option would be to implement the includes method that selects data on a row basis. See the Java™ documentation for more information.-
Create a Java™ class which extends
com.day.cq.search.eval.AbstractPredicateEvaluator -
Annotate your class with a
@Componentlike the followingsrc/main/java/com/adobe/aem/docs/search/ReplicationPredicateEvaluator.java
The following snippet shows the differences 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
factorymust be a unique string starting with com.day.cq.search.eval.PredicateEvaluator/and ending with the name of your custom PredicateEvaluator.PredicateEvaluator is the predicate name, which is used when building queries.-
Override:
public String getXPathExpression(Predicate predicate, EvaluationContext context)In the override method, you build a
Xpathexpression based on thePredicategiven in argument.