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网站上的"策略参考"页面解释了如何对数组、对象和集合执行查找、比较和迭代。