繁体   English   中英

Rego 函数调用是否已记忆?

[英]Are Rego function calls memoized?

我定义了一个非幂等的函数; 它可以为相同的输入返回不同的结果。 Rego 会记住每个查询的函数结果吗? 换句话说,鉴于以下政策:

val := myFunc(...) # Returns an object with "a" and "b" fields.

foo {
    val.a
}

bar {
    val.b
}

规则foobar将在同一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM