Add generic filter build for filter.Filter

This commit is contained in:
Denis Arh
2022-07-31 11:50:31 +02:00
parent c710aa079d
commit 0ae4311003
+92
View File
@@ -1,6 +1,17 @@
package filter
type (
filterOpt func(*filter)
filter struct {
constaints map[string][]any
stateConditions map[string]State
expression string
orderBy SortExprSet
limit uint
cursor *PagingCursor
}
Filter interface {
// Constraints returns map of attribute idents and values
// used for structured filtering ({a1: [v1], a2: [v2, v3]} => "a1 = v1 AND a2 = (v2,v4)")
@@ -23,3 +34,84 @@ type (
Cursor() *PagingCursor
}
)
func Generic(oo ...filterOpt) Filter {
f := &filter{}
for _, o := range oo {
o(f)
}
return f
}
// WithConstraint sets single constraint to filter
func WithConstraint(k string, v any) filterOpt {
return func(f *filter) {
if f.constaints == nil {
f.constaints = make(map[string][]any)
}
f.constaints[k] = append(f.constaints[k], v)
}
}
// WithConstraints set multiple constraints to filter
func WithConstraints(c map[string][]any) filterOpt {
return func(f *filter) {
f.constaints = c
}
}
// WithStateConstraint sets single state constraint to filter
func WithStateConstraint(k string, s State) filterOpt {
return func(f *filter) {
if f.stateConditions == nil {
f.stateConditions = make(map[string]State)
}
f.stateConditions[k] = s
}
}
// WithStateConstraints sets multiple state constraints to filter
func WithStateConstraints(sc map[string]State) filterOpt {
return func(f *filter) {
f.stateConditions = sc
}
}
// WithExpression sets expression to filter
func WithExpression(e string) filterOpt {
return func(f *filter) {
f.expression = e
}
}
// WithOrderBy sets order by expression
func WithOrderBy(o SortExprSet) filterOpt {
return func(f *filter) {
f.orderBy = o
}
}
// WithLimit sets limit to filter
func WithLimit(l uint) filterOpt {
return func(f *filter) {
f.limit = l
}
}
// WithCursor sets cursor to filter
func WithCursor(p *PagingCursor) filterOpt {
return func(f *filter) {
f.cursor = p
}
}
func (f *filter) Constraints() map[string][]any { return f.constaints }
func (f *filter) StateConstraints() map[string]State { return f.stateConditions }
func (f *filter) Expression() string { return f.expression }
func (f *filter) OrderBy() SortExprSet { return f.orderBy }
func (f *filter) Limit() uint { return f.limit }
func (f *filter) Cursor() *PagingCursor { return f.cursor }