如何在 OPA Rego 中将列表转换为具有重复键的对象
How to convert a list to an object with key duplications in OPA Rego
我不熟悉 Open Policy Agent (OPA) 和 Rego 语言。我需要将从输入中获取的对象列表转换为一个对象(最好是在 O(n) 时间内)。问题是使用过的密钥可能在列表中重复。输入示例:
[
{
"id": "a",
"body": {...}
},
{
"id": "b",
"body": {...}
},
{
"id": "a",
"body": {...}
}
]
预期输出:
{
"a": [
{
"id": "a",
"body": {...}
},
{
"id": "a",
"body": {...}
}
],
"b": [
{
"id": "b",
"body": {...}
}
]
}
执行此操作的最佳选择是什么?我试图创建一个函数,但从未评估输出:
package test
inpt := [
{"id": "a", "body":{"a":1}},
{"id": "b", "body":{"a":1}},
{"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]
]
}
我不熟悉 Open Policy Agent (OPA) 和 Rego 语言。我需要将从输入中获取的对象列表转换为一个对象(最好是在 O(n) 时间内)。问题是使用过的密钥可能在列表中重复。输入示例:
[
{
"id": "a",
"body": {...}
},
{
"id": "b",
"body": {...}
},
{
"id": "a",
"body": {...}
}
]
预期输出:
{
"a": [
{
"id": "a",
"body": {...}
},
{
"id": "a",
"body": {...}
}
],
"b": [
{
"id": "b",
"body": {...}
}
]
}
执行此操作的最佳选择是什么?我试图创建一个函数,但从未评估输出:
package test
inpt := [
{"id": "a", "body":{"a":1}},
{"id": "b", "body":{"a":1}},
{"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]
]
}