繁体   English   中英

Arangodb自定义过滤器/访客为我的树图

[英]Arangodb custom filter/visitor for my tree graph

我有一个包含两个边缘定义的图形,如下所示:

isDepartment: [organisation] -> [organisation]
hasAccess: [user] -> [organisation]

组织嵌套在树中(无循环)。 有多个顶级组织没有任何传入的isDepartment边缘。

用户被授予访问一个或多个组织的权限。 这些可以是位于树下的某个顶层组织或组织。 如果用户有权访问组织,则可以访问所有子组织。

我正在尝试构建一个自定义访问者或过滤器,为用户提供所有可访问的组织,包括它的根路径,以及属性(如果它们可访问或不可访问)。

例如,采用以下组织结构:

  • 根A
    • 部门A.1
    • 部门A.2
  • 根B
    • 部门B.1
    • 部门B.2
    • Subdept。 B.2.1
  • 根C
    • 部门C.1
    • 部门C.2

现在请一位拥有访问Root ADept. B.2 我想生成以下结果树:

  • 根A,可访问:true
    • 部门A.1,可访问:真实
    • 部门A.2,无障碍:真实
  • 根B,可访问:false
    • 部门B.2,可访问:真实
    • Subdept。 B.2.1,access:true

请注意, Root CDept. B1不在结果中,因为用户无法访问它们,也无法访问任何子级。

另请注意,包含Root B但标记为not accessible 这是因为只允许用户访问Root B的子Root B而不是root用户。

如何编写完成此功能的自定义函数/访客/过滤器?

这确实是一个具有挑战性的问题,非常感谢你;)

您可以通过向AQL添加用户定义的函数并在TRAVERSER中使用它们来解决此问题。

首先,我通过arangosh注册了两个AQL访问者函数:

var aqlfunctions = require("org/arangodb/aql/functions");
aqlfunctions.register("myvisitor::indirectAccess", "function (config, result, vertex) { if(result.length === 0) {result.push({});} result[0][vertex._key] = {hasAccess: true};}")
aqlfunctions.register("myvisitor::noAccess", "function (config, result, vertex) { if (result.length === 0) {result.push({});} result[0][vertex._key] = {hasAccess: false};}")

这些功能只需执行以下操作:

  • myvisitor::indirectAccess将用于遍历树。 与在AQL中一样,结果始终是一个数组,我们只是在它的第一个文档(如果需要)存储所有数据。 然后我们为顶点_key属性赋值{hasAccess: true}
  • myvisitor::noAccess将用于遍历树,并将以相同的方式存储'{hasAccess:false}`。

现在我们可以执行以下使用这些访问者的查询:

FOR x IN GRAPH_NEIGHBORS(@graph, @userId, {direction: 'outbound'})
LET upwards = TRAVERSAL(organisation, isDepartment, x, 'inbound', {visitor: 'myvisitor::noAccess'})[0]
LET downwards = TRAVERSAL(organisation, isDepartment, x, 'outbound', {visitor: 'myvisitor::indirectAccess'})[0]
RETURN MERGE(upwards, downwards)

简短说明:

  1. 找到该用户可直接访问的组织。
  2. upwards树并将所有内容标记为“noAccess”。
  3. downwards走树,将所有内容标记为“访问”。
  4. 合并upwardsdownwards

如果要修改结果格式,则必须更改已注册的访问者功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM