85 lines
2.0 KiB
Go
85 lines
2.0 KiB
Go
|
package leaf
|
||
|
|
||
|
var (
|
||
|
FilterAll = FilterDocument{}
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
OperatorEq Operator = "$eq"
|
||
|
OperatorNe Operator = "$ne"
|
||
|
OperatorGt Operator = "$gt"
|
||
|
OperatorGte Operator = "$gte"
|
||
|
OperatorLt Operator = "$lt"
|
||
|
OperatorLte Operator = "$lte"
|
||
|
OperatorIn Operator = "$in"
|
||
|
OperatorNin Operator = "$nin"
|
||
|
OperatorExists Operator = "$exists"
|
||
|
OperatorRegex Operator = "$regex"
|
||
|
)
|
||
|
|
||
|
type M map[Operator]any
|
||
|
type Operator string
|
||
|
type FilterDocument map[string]M
|
||
|
|
||
|
func Eq[T any](field string, value T) FilterDocument {
|
||
|
return createSelector(field, OperatorEq, value)
|
||
|
}
|
||
|
|
||
|
func Ne[T any](field string, value T) FilterDocument {
|
||
|
return createSelector(field, OperatorNe, value)
|
||
|
}
|
||
|
|
||
|
func Gt[T any](field string, value T) FilterDocument {
|
||
|
return createSelector(field, OperatorGt, value)
|
||
|
}
|
||
|
|
||
|
func Gte[T any](field string, value T) FilterDocument {
|
||
|
return createSelector(field, OperatorGte, value)
|
||
|
}
|
||
|
|
||
|
func Lt[T any](field string, value T) FilterDocument {
|
||
|
return createSelector(field, OperatorLt, value)
|
||
|
}
|
||
|
|
||
|
func Lte[T any](field string, value T) FilterDocument {
|
||
|
return createSelector(field, OperatorLte, value)
|
||
|
}
|
||
|
|
||
|
func In[T any](field string, value []T) FilterDocument {
|
||
|
return createSelector(field, OperatorIn, value)
|
||
|
}
|
||
|
|
||
|
func Nin[T any](field string, value []T) FilterDocument {
|
||
|
return createSelector(field, OperatorNin, value)
|
||
|
}
|
||
|
|
||
|
func Exists(field string, value bool) FilterDocument {
|
||
|
return createSelector(field, OperatorExists, value)
|
||
|
}
|
||
|
|
||
|
func Regex(field string, value string) FilterDocument {
|
||
|
return createSelector(field, OperatorRegex, value)
|
||
|
}
|
||
|
|
||
|
func createSelector(field string, operator Operator, value any) FilterDocument {
|
||
|
return FilterDocument{field: M{operator: value}}
|
||
|
}
|
||
|
|
||
|
func Filter(docs ...FilterDocument) FilterDocument {
|
||
|
query := FilterDocument{}
|
||
|
for _, doc := range docs {
|
||
|
for field, operators := range doc {
|
||
|
if _, ok := query[field]; !ok {
|
||
|
query[field] = operators
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
for op, value := range operators {
|
||
|
query[field][op] = value
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return query
|
||
|
}
|