7

在 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"OR value.b == "one"

4

2 回答 2

12

将多个表达式连接在一起表示逻辑 AND。为了表达逻辑 OR,您定义了多个具有相同名称的规则或函数。这有几种不同的工作方式。这在 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 中,增量规则将一组值分配给一个变量。规则定义提供生成设定值的逻辑。与理解不同,您可以重载规则定义(提供具有相同名称的多个)并像其他答案解释的那样表达逻辑 OR。

# 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"
}
于 2019-10-10T15:04:51.077 回答
1

到目前为止,通过增量集找到了一个丑陋的答案:

goodValues[name] {
  value = values[name]
  value.a == "one"
}

goodValues[name] {
  value = values[name]
  value.b == "one"
}

但是,如果这种常见情况value = values[name]变得更加复杂怎么办?是否需要将其提取到一个单独的变量中(并在每个条件语句中对其进行迭代)?有更好的解决方案吗?

于 2019-10-10T01:47:23.430 回答