微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 OPA Rego 中将列表转换为具有密钥重复的对象

如何解决如何在 OPA Rego 中将列表转换为具有密钥重复的对象

我是 Open Policy Agent (OPA) 和 Rego 语言的新手。我需要将我从输入获得的对象列表转换为一个对象(在 O(n) 时间的最佳情况下)。问题是使用的密钥可能在列表中重复。输入示例:

[
    {
        "id": "a","body": {...}
    },{
        "id": "b",{
        "id": "a","body": {...}
    }
]

预期输出

{
    "a": [
        {
            "id": "a","body": {...}
        },{
            "id": "a","body": {...}
        }
    ],"b": [
        {
            "id": "b","body": {...}
        }
    ]
}

这样做的最佳选择是什么?我尝试创建一个函数,但从未评估输出

package test

inpt := [
    {"id": "a","body":{"a":1}},{"id": "b",{"id": "a","body":{"a":2}},]

x := f(inpt)

f(input_list) = output_obj {
    output_obj := {}
    inner := input_list[_]
    inner_list = object.get(output_obj,inner.id,[])
    merged := array.concat(inner_list,[inner])
    output_obj[inner.id] = merged
}

我发现的唯一选项是内循环 (O(n^2)):

output_obj := {i.id : [j | j:= inpt[_]; j.id == i.id] | i := inpt[_]}

解决方法

Comprehension indexing 应该确保 O(n) 运行时复杂度,因为规则满足条件(您的条件):

package test

output_obj := {id: list |
    some i
    id := input[i].id
    list := [obj |
        some j
        input[j].id == id
        obj := input[j]
    ]
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。