Files
db/exp/exp_list.go
T
2025-03-22 23:02:05 +08:00

68 lines
1.6 KiB
Go

package exp
type (
expressionList struct {
operator ExpressionListType
expressions []Expression
}
)
// A list of expressions that should be ORed together
//
// Or(I("a").Eq(10), I("b").Eq(11)) //(("a" = 10) OR ("b" = 11))
func NewExpressionList(operator ExpressionListType, expressions ...Expression) ExpressionList {
el := expressionList{operator: operator}
exps := make([]Expression, 0, len(el.expressions))
for _, e := range expressions {
switch t := e.(type) {
case ExpressionList:
if !t.IsEmpty() {
exps = append(exps, e)
}
case Ex:
if len(t) > 0 {
exps = append(exps, e)
}
case ExOr:
if len(t) > 0 {
exps = append(exps, e)
}
default:
exps = append(exps, e)
}
}
el.expressions = exps
return el
}
func (el expressionList) Clone() Expression {
newExps := make([]Expression, 0, len(el.expressions))
for _, exp := range el.expressions {
newExps = append(newExps, exp.Clone())
}
return expressionList{operator: el.operator, expressions: newExps}
}
func (el expressionList) Expression() Expression {
return el
}
func (el expressionList) IsEmpty() bool {
return len(el.expressions) == 0
}
func (el expressionList) Type() ExpressionListType {
return el.operator
}
func (el expressionList) Expressions() []Expression {
return el.expressions
}
func (el expressionList) Append(expressions ...Expression) ExpressionList {
exps := make([]Expression, 0, len(el.expressions)+len(expressions))
exps = append(exps, el.expressions...)
exps = append(exps, expressions...)
return NewExpressionList(el.operator, exps...)
}