[英]Are Rego function calls memoized?
我定义了一个非幂等的函数; 它可以为相同的输入返回不同的结果。 Rego 会记住每个查询的函数结果吗? 换句话说,鉴于以下政策:
val := myFunc(...) # Returns an object with "a" and "b" fields.
foo {
val.a
}
bar {
val.b
}
规则foo
和bar
将在同一个val
上运行,这是对myFunc
的一次调用。 Rego 能保证这一点吗?
除了http.send
,我认为没有任何内置函数可以让您在提供相同输入的情况下返回不同的数据。 不过我很想知道! :) 要回答您的问题,规则/函数会缓存在单个查询的范围内,因此不会重新评估对同一规则/函数的多次调用。 内置的http.send
允许您跨查询缓存结果,这在请求很少更新的数据时非常有用。
说到http.send
,它是一个非常有用的内置函数来测试这样的事情。 只需启动一个本地网络服务器,例如python3 -m http.server
然后有一个策略来查询:
package policy
my_func(x) {
http.send({
"method": "GET",
"url": "http://localhost:8000",
})
}
boo := my_func("x")
foo := my_func("x")
然后评估策略:
opa eval -f pretty -d policy.rego data.policy
{
"boo": true,
"foo": true
}
检查 Web 服务器的日志,您会看到尽管有两条规则调用了my_func
函数,但只发送了一个请求:
::1 - - [29/Jun/2022 19:27:01] "GET / HTTP/1.1" 200 -
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.