动态条件生成器

时间:2021-06-04 10:58:35

标签: go amazon-dynamodb

我的问题很简单,我想动态创建过滤器以在我的查询输入中使用它。 我必须确定 tf 变量不能改变。

这就是我所做的:

totalFilter := expression.ConditionBuilder{}
filter := expression.Name("status").Equal(expression.Value("0"))
filter2 := expression.Name("foo").Equal(expression.Value("bar"))
filter3 := expression.Name("yes").Equal(expression.Value("no"))
tf := []expression.ConditionBuilder{filter, filter2, filter3}
for _, v := range tf {
    totalFilter = totalFilter.And(v)
}
expr := expression.NewBuilder().WithFilter(totalFilter)
builder, err := expr.Build()
if err != nil {
    log.Println(err)
    return err
}

但问题是 totalFilter 是一个空结构体,所以它的模式变量等于 0,然后它引发警报,因为模式 0 是 unsetCond。

我发现的唯一解决方法是这样做:

for i, v := range tf {
    if i == 0 {
        totalFilter = v
    } else {
        totalFilter.And(v)
    }
}

但我想知道是否还有其他解决方案。

1 个答案:

答案 0 :(得分:1)

您可以抽象出使用至少一个 expression.ConditionBuilder 参数的自定义可变参数函数中第一个 expression.ConditionBuilder 的处理:

func And(first expression.ConditionBuilder, rest ...expression.ConditionBuilder) expression.ConditionBuilder {
    result := first
    for _, cb := range rest {
        result = result.And(cb)
    }
    return result
}

然后,在 main 中:

filter := expression.Name("status").Equal(expression.Value("0"))
filter2 := expression.Name("foo").Equal(expression.Value("bar"))
filter3 := expression.Name("yes").Equal(expression.Value("no"))
totalFilter := And(filter, filter2, filter3)
expr := expression.NewBuilder().WithFilter(totalFilter)
builder, err := expr.Build()
// etc.

请注意,similar function,也称为 And,由 expression 包导出,但它至少需要两个(不仅仅是一个)expression.ConditionBuilder 参数。真可惜……