OPA Rego 函数语句求值顺序

OPA Rego function statement evaluation order

package play


exists(obj, a) {
   obj[a]
}


hello {
     exists(input, "department")
     contains(input["location"], "London")
}

world {        
    contains(input["location"], "London")
    exists(input, "department")    
}

input = { "department": "Eng", "location": "London" }

以上代码仅匹配 hello。为什么 world 即使条件相同但顺序颠倒也不匹配?

语句的顺序无关紧要。您实际上找到了 a bug!

如果你稍微改变这个例子,这样 exists 就不会以 input 作为第一个参数来调用,而是像 exists(input.user, "department") 这样的东西,然后你更新输入文档以反映这一点:

{"user": {"department": "Eng", "location": "London"}}

您将观察到正确的行为(例如,world { contains(input.user["location"], "London"); exists(input.user, "department") })。