2017-07-25 2 views
0

Je dois créer une requête où les params sont comme:constructeur AEM Interrogation exclure un dossier à la recherche

queryParams.put("path", "/content/myFolder"); 
queryParams.put("1_property", "myProperty"); 
queryParams.put("1_property.operation", "exists"); 
queryParams.put("p.limit", "-1"); 

Mais, je dois exclure un certain chemin dans ce dossier de couverture, par exemple: "/content/myFolder/wrongFolder" et rechercher dans tous les autres dossiers (dont le nombre ne cesse de varier)

Y a-t-il un moyen de le faire? Je ne l'ai pas trouvé exactement en ligne.

J'ai également essayé l'opération unequals car le chemin parent est enregistré dans une propriété JCR, mais toujours pas de chance. J'ai vraiment besoin de unlike pour éviter toutes les occurrences du chemin. Mais il n'y a pas une telle chose:

path=/main/path/to/search/in 
group.1_property=cq:parentPath 
group.1_property.operation=unequals 
group.1_property.value=/path/to/be/avoided 
group.2_property=myProperty 
group.2_property.operation=exists 
group.p.or=true 
p.limit=-1 
+0

si la requête SQL2 fonctionnera pour vous, alors vous pouvez exécuter comme cette requête: sélectionnez * from [nt: non structuré] comme p où (isdescendantnode (p, [/ content/myFolder /]) et n'est pas isdescendantnode (p, [/ content/myFolder/wrongFolder /])) et contient (p. *, 'myProperty') Faites-moi savoir si cela fonctionne. –

+0

@SumantaPakira, je ne peux pas utiliser SQL2 pour l'instant, car il faudra un changement majeur dans l'application. Par conséquent, la recherche d'une solution uniquement dans le générateur de requêtes pour l'instant. –

Répondre

0

En utilisant QueryBuilder vous pouvez exécuter:

map.put("group.p.not",true) 
map.put("group.1_path","/first/path/where/you/donot/want/to/search") 
map.put("group.2_path","/second/path/where/you/donot/want/to/search") 

Aussi j'ai vérifié l'API de classe PredicateGroup et ils fournissent une méthode setNegated. Je ne l'ai jamais utilisé moi-même, mais je pense que vous pouvez nier un groupe et les combiner dans un prédicat commun avec le chemin que vous êtes à la recherche sur comme:

final PredicateGroup doNotSearchGroup = new PredicateGroup(); 
doNotSearchGroup.setNegated(true); 
doNotSearchGroup.add(new Predicate("path").set("path", "/path/where/you/donot/want/to/search")); 

final PredicateGroup combinedPredicate = new PredicateGroup(); 
combinedPredicate.add(new Predicate("path").set("path", "/path/where/you/want/to/search")); 
combinedPredicate.add(doNotSearchGroup); 

final Query query = queryBuilder.createQuery(combinedPredicate); 
+0

Le groupe.p.n'a pas fonctionné pour moi. J'ai essayé ci-dessous et ai obtenu trois fois les résultats plus tôt .: chemin =/main/chemin/où/je/veux/pour/recherche group.p.not = vrai group.1_path =/premier/chemin/où/vous/donot/want/to/search group.2_property = monProperty group.2_property.operation = existe group.p.or = true p.limit = -1 –