Requêtes insensibles à la casse avec AEM Query Builder

Récemment, j'ai eu besoin d'effectuer une requête en utilisant AEM Query Builder qui était insensible à la casse. Bien que je préfère normalement utiliser les requêtes JCR SQL2 dans ce cas, Query Builder convenait mieux car je voulais que les applications consommatrices puissent manipuler la requête et le faire comme une carte est beaucoup plus facile que de le faire en tant que string.
J'ai été surpris de constater qu'il n'y avait pas de prédicat Query Builder natif pour faire des requêtes insensibles à la casse, alors j'ai fini par écrire le mien.
Le prédicat fonctionne en diminuant la casse de la valeur, puis en utilisant le XPath fn: méthode en minuscules à comparer à la valeur du champ en minuscules.
/ * Il s'agit d'un logiciel gratuit et sans encombrement publié dans le domaine public. Tout le monde est libre de copier, modifier, publier, utiliser, compiler, vendre ou distribuer ce logiciel, soit sous forme de code source, soit sous forme compilée binaire, à quelque fin que ce soit, commercial ou non commercial, et par tout veux dire. Dans les juridictions qui reconnaissent les lois sur les droits d'auteur, l'auteur ou les auteurs de ce logiciel consacrent tous les droits d'auteur sur le logiciel dans le domaine public. Nous faisons cette dédicace pour le bénéfice du grand public et au détriment de nos héritiers et successeurs. Nous voulons que ce dévouement soit un acte manifeste de abandon à perpétuité de tous les droits présents et futurs sur ce logiciel sous droit d'auteur. LE LOGICIEL EST FOURNI "EN L'ÉTAT", SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU IMPLICITE, INCLUANT MAIS SANS S'Y LIMITER, LES GARANTIES DE QUALITÉ MARCHANDE, ADAPTATION À UN USAGE PARTICULIER ET NON-CONTREFAÇON. EN AUCUN CAS, LES AUTEURS NE SERONT RESPONSABLES DE TOUTE RÉCLAMATION, DOMMAGES OU AUTRE RESPONSABILITÉ, QUE CE SOIT DANS UNE ACTION DE CONTRAT, DE TORT OU AUTRE, RÉSULTANT DE, HORS OU EN RELATION AVEC LE LOGICIEL OU L'UTILISATION OU AUTRES ACTIONS DANS LE LOGICIEL. Pour plus d'informations, veuillez consulter * / package com.perficient.adobe.predicates; import java.util.Locale; import java.util.Optional; import com.day.cq.search.Predicate; import com.day.cq.search.eval.AbstractPredicateEvaluator; import com.day.cq.search.eval.EvaluationContext; import org.osgi.service.component.annotations.Component; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Component (factory = "com.day.cq.search.eval.PredicateEvaluator / equalsIgnoreCase") la classe publique CaseInsensitiveEquals étend AbstractPredicateEvaluator { Journal de journalisation final statique privé = LoggerFactory.getLogger (CaseInsensitiveEquals.class); static final String PREDICATE_PROPERTY = "propriété"; static final String PREDICATE_VALUE = "valeur"; static final String PREDICATE_LOCALE = "locale"; @Passer outre public String getXPathExpression (prédicat prédicat, contexte EvaluationContext) { log.debug ("Evaluating predicate: {}", predicate); Propriété de chaîne = predicate.get (PREDICATE_PROPERTY); Locale locale = Optional.ofNullable (predicate.get (PREDICATE_LOCALE)). Map (lt -> Locale.forLanguageTag (lt)) .orElse (Locale.getDefault ()); Valeur de chaîne = predicate.get (PREDICATE_VALUE) .toLowerCase (locale) .replace ("'", "' '"); String query = String.format ("fn: minuscules (@% s) = '% s'", propriété, valeur); log.debug ("Requête générée: {}", requête); requête de retour; } }
Une fois que le prédicat personnalisé est disponible dans votre application, il peut être utilisé dans n'importe quelle requête Query Builder en tant que telle:
path = / content / test equalsIgnoreCase.property = test equalsIgnoreCase.value = test equalsIgnoreCase.locale = en_US
Le paramètre locale n'est pas obligatoire, mais serait généralement recommandé à moins que l'entrée soit toujours dans la locale par défaut du système.
Source link