xquery поиск записей с заданной c ролью безопасности - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь найти записи с определенной c ролью безопасности, и я не могу найти способ сделать это с помощью cts: search (который должен быть быстрее, чем a для l oop). Вот для l oop:

let $validRoleList := (
    xdmp:role("myRole1"),
    xdmp:role("myRole2")
)
for $recordUri in cts:uris((), (), cts:collection-query("bigCollection"))
let $documentPermissions := xdmp:document-get-permissions($recorduri)/sec:role-id/fn:string()
let $intPermissions := 
    for $permissionValue in $documentPermissions
    return xs:unsignedLong($documentPermissions)
where $intPermissions eq $validRoleList
return $recordUri

Поскольку моя "bigCollection" находится в диапазоне 15 миллионов записей, даже на сервере задач это занимает более часа. Есть ли более простой способ найти запись по имени роли разрешения?

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Я нашел эту функцию где-то лет go, и я не знаю, как она работает, но она работает. Я использовал его в производственных системах в течение многих лет, и он отлично подходит для вашего вопроса «Как запросить документы, которые имеют определенное разрешение?» Это в XQuery, но я считаю, что для каждой функции XQuery есть JS эквивалент.

declare function permission-query($role, $capability)
{
  cts:term-query(
    xdmp:add64(
      xdmp:mul64(xdmp:add64(xdmp:mul64(xdmp:role($role), 5), xdmp:hash64($capability)), 5),
      xdmp:hash64("permission()")
    )
  )
};
0 голосов
/ 01 мая 2020

Этот циклический подход по своей сути медленный, потому что он собирается извлекать каждый документ с диска для извлечения его разрешений. 15 миллионов документов означает 15 миллионов выборок дисков. Неважно, какой код медленный.

Самый быстрый и простой способ ответить на этот вопрос - создать и стать пользователем с этими двумя ролями и выполнить запрос cts:uris для всех URI в базе данных, и ответ будет автоматически и эффективно ограничивать URI, видимые для этих двух ролей.

Если вам нужно больше динамичности c без создания такого пользователя, для администратора может быть xdmp:login со списком ролей.

...