Files
zitadel/backend/v3/storage/database/condition.go

113 lines
2.3 KiB
Go
Raw Normal View History

2025-05-06 07:18:11 +02:00
package database
2025-04-29 06:03:47 +02:00
type Condition interface {
2025-05-06 07:18:11 +02:00
Write(builder *StatementBuilder)
2025-04-29 06:03:47 +02:00
}
type and struct {
conditions []Condition
}
2025-05-06 07:18:11 +02:00
// Write implements [Condition].
func (a *and) Write(builder *StatementBuilder) {
2025-04-29 06:03:47 +02:00
if len(a.conditions) > 1 {
builder.WriteString("(")
defer builder.WriteString(")")
}
for i, condition := range a.conditions {
if i > 0 {
builder.WriteString(" AND ")
}
2025-05-06 07:18:11 +02:00
condition.(Condition).Write(builder)
2025-04-29 06:03:47 +02:00
}
}
func And(conditions ...Condition) *and {
return &and{conditions: conditions}
}
var _ Condition = (*and)(nil)
type or struct {
conditions []Condition
}
2025-05-06 07:18:11 +02:00
// Write implements [Condition].
func (o *or) Write(builder *StatementBuilder) {
2025-04-29 06:03:47 +02:00
if len(o.conditions) > 1 {
builder.WriteString("(")
defer builder.WriteString(")")
}
for i, condition := range o.conditions {
if i > 0 {
builder.WriteString(" OR ")
}
2025-05-06 07:18:11 +02:00
condition.(Condition).Write(builder)
2025-04-29 06:03:47 +02:00
}
}
func Or(conditions ...Condition) *or {
return &or{conditions: conditions}
}
var _ Condition = (*or)(nil)
type isNull struct {
column Column
}
2025-05-06 07:18:11 +02:00
// Write implements [Condition].
func (i *isNull) Write(builder *StatementBuilder) {
i.column.Write(builder)
2025-04-29 06:03:47 +02:00
builder.WriteString(" IS NULL")
}
func IsNull(column Column) *isNull {
return &isNull{column: column}
}
var _ Condition = (*isNull)(nil)
type isNotNull struct {
column Column
}
2025-05-06 07:18:11 +02:00
// Write implements [Condition].
func (i *isNotNull) Write(builder *StatementBuilder) {
i.column.Write(builder)
2025-04-29 06:03:47 +02:00
builder.WriteString(" IS NOT NULL")
}
func IsNotNull(column Column) *isNotNull {
2025-05-06 07:18:11 +02:00
return &isNotNull{column: column.(Column)}
2025-04-29 06:03:47 +02:00
}
var _ Condition = (*isNotNull)(nil)
2025-05-06 07:18:11 +02:00
type valueCondition func(builder *StatementBuilder)
2025-04-29 06:03:47 +02:00
2025-05-06 07:18:11 +02:00
func NewTextCondition[V Text](col Column, op TextOperation, value V) Condition {
return valueCondition(func(builder *StatementBuilder) {
2025-04-29 06:03:47 +02:00
writeTextOperation(builder, col, op, value)
})
}
2025-05-06 07:18:11 +02:00
func NewNumberCondition[V Number](col Column, op NumberOperation, value V) Condition {
return valueCondition(func(builder *StatementBuilder) {
2025-04-29 06:03:47 +02:00
writeNumberOperation(builder, col, op, value)
})
}
2025-05-06 07:18:11 +02:00
func NewBooleanCondition[V Boolean](col Column, value V) Condition {
return valueCondition(func(builder *StatementBuilder) {
2025-04-29 06:03:47 +02:00
writeBooleanOperation(builder, col, value)
})
}
2025-05-06 07:18:11 +02:00
// Write implements [Condition].
func (c valueCondition) Write(builder *StatementBuilder) {
2025-04-29 06:03:47 +02:00
c(builder)
}
var _ Condition = (*valueCondition)(nil)