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
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
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,
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 !
« Réalisation d’un Back Office éditorial pour LexisNexis France.
Responsive Web Design par ContentSide »
Ce sujet vous intéresse ?