как проверить, содержит ли мои cts: and-query или cts: or-query какие-либо элементы запросов - PullRequest
1 голос
/ 20 июня 2019

У меня есть функция, которая будет возвращать либо cts:and-query(), либо cts:or-query().

Как я могу проверить, является ли запрос пустым (без каких-либо элементов или запросов коллекции внутри него)?

Я хочу отфильтровать запросы, как показано ниже

cts:and-query(cts:or-query((), ()), ())

1 Ответ

4 голосов
/ 20 июня 2019

Самый надежный способ проверить, является ли запрос пустым по вашему определению, - это рекурсивно пройти запрос, пока не встретится непустой элемент запроса, или, если нет, вернуть true.

Это немного проще сделать, сначала преобразовав запрос в XML:

declare function local:is-empty-query(
  $q as schema-element(cts:query)*
)
{
  if (empty($q)) then true()
  else if (every $e in $q satisfies ($e/self::cts:and-query or $e/self::cts:or-query))
  then local:is-empty-query($q/*)
  else false()
};


local:is-empty-query(document { cts:and-query((cts:or-query((), ()))) }/*)
=> true()

local:is-empty(document { cts:and-query((cts:or-query((cts:word-query('test'), ())))) }/*)
=> false()
...