Fermer

novembre 11, 2020

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