Эффективные предикаты xquery против ... где - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть ряд узлов xml, которые выглядят следующим образом:

let $x := 
 <works>
   <work xml:id="W1">
      <author corresp="AU08"/>
      <group corresp="GR03"/>
   </work>
   <work xml:id="W2">
      <author corresp="AU09"/>
      <group corresp="GR10"/>
   </work>
   <work xml:id="W3">
      <author corresp="AU08"/>
      <group corresp="GR05"/>
   </work>
    ....
 </works>

У меня есть форма поиска, которая может предлагать или не предлагать параметры последовательности для work/@xml:id, work/author/@corresp и work/affiliation/$correspНапример:

let $xmlids := ("W1")
let $authors := ()
let $groups := ("GR05","GR08")

или

let $xmlids := ()
let $authors := ("AU01","AU08")
let $groups := ("GR05")

Я пытаюсь создать эффективный запрос в Xquery 3.1 (eXist 4.7) для учета различных перестановок параметров при выводе work/.Это привело меня к созданию уродливой серии вложенных if операторов, которые пытаются отдать предпочтение предикатам над for ...where, например, следующим образом:

if (count($xmlids) gt 0 and count($authors) gt 0 and count($groups) gt 0)
   then 
      $x/id($xmlids)/author[@corresp=$authors]/parent::work/group[@corresp=$groups]/parent::work
else if (count($xmlids) gt 0 and count($authors) gt 0 and count($groups) eq 0)
   then 
      $x/id($xmlids)/author[@corresp=$authors]/parent::work
else if ...

Существует ли более эффективный способ построения Xquery с учетом переменнойпараметры присутствия / отсутствия?

Большое спасибо заранее.

1 Ответ

1 голос
/ 25 сентября 2019

Я думаю, что для предикатов, которые вы просто хотите @corresp=$authors or not(exists($authors)) и @corresp=$groups or not(exists($groups)).

Для вызова id я думаю, что вам нужно

let $work-items := if ($x/id($xmlids)) then $x/id($xmlids) else $x/work
return $work-items[author[@corresp=$authors or not(exists($authors))] and group[@corresp=$groups or not(exists($groups))]]
...