Rego Set查找是否会迭代集合中的所有项


package example
default allow = false
input = {
"value_2": {"c", "b", "c", "b", "c", "b", "c", "b", "c", "b", "c", "b", "c", "b", "c", "b", "c", "b", "c", "b", "c", "a", "a"},
"value_1": ["c", "b", "c", "b", "c", "b", "c", "b", "c", "b", "c", "b", "c", "b", "c", "b", "c", "b", "c", "b", "c", "a", "a"]
}
allow {
input.value_1[_] == "a"
input.value_2["a"] == "a"
}

举个例子,哪一个查找速度更快?

设置查找为恒定时间:

a_set["a"]  # <-- this is constant time

集合元素的迭代和比较没有(目前(优化,是线性时间:

a_set[_] == "a" # <-- this is linear-time

但是,上面的示例无效,因为input.value_2被定义为数组(而不是(,因此input.value_2["a"]无效。如果你尝试这个例子,你会收到来自编译器的类型错误:

1 error occurred: policy.rego:12: rego_type_error: undefined ref: data.example.input.value_2.a
data.example.input.value_2.a
^
have: "a"
want (type): number

假设您最初想要使用集合,只需使用查找语法(s[k](,而不需要额外的相等性检查(除非您正在测试集合中是否包含false,但这很奇怪。(

请注意,OPA网站上的"策略参考"页面解释了如何对数组、对象和集合执行查找、比较和迭代。

相关内容

  • 没有找到相关文章

最新更新