或在 Open Policy Agent 中(联合行为)
OR in Open Policy Agent (union behavior)
在 OPA 中很清楚如何查询 condition AND condition
:
values := {
"value1": {
"a": "one"
},
"value2": {
"a": "one",
"b": "two"
},
"value3": {
"a": "one",
"b": "one"
}
}
goodValues = [name |
value = values[name]
value.a == "one"
value.b == "one"
]
所以这里的goodValues
将只包含value3
。
但是如何查询condition OR condition
,以便goodValues
包含所有3个值,因为它们有value.a == "one"
或value.b == "one"
?
到目前为止,通过 incremental set:
找到了一个丑陋的答案
goodValues[name] {
value = values[name]
value.a == "one"
}
goodValues[name] {
value = values[name]
value.b == "one"
}
但是,如果这种常见情况 value = values[name]
变得更加复杂怎么办?是否需要将它提取到一个单独的变量(并在每个条件语句中迭代它)?有更好的解决方案吗?
将多个表达式连接在一起表示逻辑与。要表达逻辑或,您可以定义多个具有相同名称的规则或函数。这有几种不同的工作方式。这在 OPA 的介绍中有所介绍:https://www.openpolicyagent.org/docs/latest/#logical-or.
选项 1:理解和功能
可以将要针对值表达的条件分解为辅助函数,然后理解查询可以引用该函数。
goodValues = [name |
value := values[name]
value_match(value)
]
value_match(v) {
v.a == "one"
}
value_match(v) {
v.b = "two"
}
选项 2:增量规则
在OPA/Rego中,增量规则将一组值赋给一个变量。规则定义提供了生成设置值的逻辑。与理解不同,您可以重载规则定义(提供多个具有相同名称的规则)并像其他答案解释的那样表达逻辑或。
# goodValues is a set that contains 'name' if...
goodValues[name] {
value := values[name] # name is in values
value.a == "one" # value.a is "one"
}
# goodvalues is a set that contains 'name' if...
goodValues[name] {
value := values[name] # name is in values
value.b == "two" # value.b is "two"
}
在 OPA 中很清楚如何查询 condition AND condition
:
values := {
"value1": {
"a": "one"
},
"value2": {
"a": "one",
"b": "two"
},
"value3": {
"a": "one",
"b": "one"
}
}
goodValues = [name |
value = values[name]
value.a == "one"
value.b == "one"
]
所以这里的goodValues
将只包含value3
。
但是如何查询condition OR condition
,以便goodValues
包含所有3个值,因为它们有value.a == "one"
或value.b == "one"
?
到目前为止,通过 incremental set:
找到了一个丑陋的答案goodValues[name] {
value = values[name]
value.a == "one"
}
goodValues[name] {
value = values[name]
value.b == "one"
}
但是,如果这种常见情况 value = values[name]
变得更加复杂怎么办?是否需要将它提取到一个单独的变量(并在每个条件语句中迭代它)?有更好的解决方案吗?
将多个表达式连接在一起表示逻辑与。要表达逻辑或,您可以定义多个具有相同名称的规则或函数。这有几种不同的工作方式。这在 OPA 的介绍中有所介绍:https://www.openpolicyagent.org/docs/latest/#logical-or.
选项 1:理解和功能
可以将要针对值表达的条件分解为辅助函数,然后理解查询可以引用该函数。
goodValues = [name |
value := values[name]
value_match(value)
]
value_match(v) {
v.a == "one"
}
value_match(v) {
v.b = "two"
}
选项 2:增量规则
在OPA/Rego中,增量规则将一组值赋给一个变量。规则定义提供了生成设置值的逻辑。与理解不同,您可以重载规则定义(提供多个具有相同名称的规则)并像其他答案解释的那样表达逻辑或。
# goodValues is a set that contains 'name' if...
goodValues[name] {
value := values[name] # name is in values
value.a == "one" # value.a is "one"
}
# goodvalues is a set that contains 'name' if...
goodValues[name] {
value := values[name] # name is in values
value.b == "two" # value.b is "two"
}