MarkLogic : Trier son résultat dynamiquement en XQuery

 

Pour trier le résultat d’une XQuery en fonction de paramètres externes, rien de plus simple, mais il fallait le savoir ! Voici une petite astuce sur l’utilisation du « order by », ou plus précisément sur le sens du tri : « ascending » ou « descending »

 

Prenons l’exemple suivant d’un tri sur une date de modification :

for $myDoc in xdmp:directory(« /big-data/ », « infinity »)
order by $myDoc/xml/@date-modification ascending
return $myDoc
Ensuite je veux compléter ma requête en rendant le sens du tri paramétrable. Je pense tout de suite à cette syntaxe :
 
let $ordering := « ascending » (: peut provenir d’un paramètre externe :)
return
    for $myDoc in xdmp:directory(« /big-data/ » , « infinity »)
    order by
        if  ($ordering = « ascending ») 
        then ($myDoc/xml/@date-modification ascending) 
        else ($myDoc/xml/@date-modification descending)
    return $myDoc

Mais ATTENTION, cette XQuery est fausse ! L’erreur générée est : « Unexpected token syntax error« .

Du coup, il faut ruser en ajoutant des tris sur « rien » …. Ce qui n’a aucun effet sur la performance de la requête, mais qui permet d’écrire tous les cas d’utilisation :
let $ordering := « ascending » (: peut provenir d’un paramètre externe :)  
return
    for $myDoc in xdmp:directory(« /big-data/ » , « infinity »)
    order by 
        if ($ordering = « ascending ») then ($myDoc/xml/@date-modification) else () ascending,
        if ($ordering != « ascending ») then ($myDoc/xml/@date-modification) else () descending
    return $myDoc

Simple non ? :-)

Si vous avez d’autres astuces, n’hésitez à pas à réagir !

Ce sujet vous intéresse ?

NOUS CONTACTER