Split compose applier

v2
Nikita Tokarchuk 6 years ago
parent bf089314f0
commit c9f3a59969
  1. 42
      mongox/query/compose.go

@ -14,7 +14,9 @@ func Compose(filters ...interface{}) *Query {
ok := false ok := false
ok = ok || applyBson(q, f) ok = ok || applyBson(q, f)
ok = ok || applyLimits(q, f) ok = ok || applyLimit(q, f)
ok = ok || applySort(q, f)
ok = ok || applySkip(q, f)
if !ok { if !ok {
panic(errors.InternalErrorf("unknown filter %v", f)) panic(errors.InternalErrorf("unknown filter %v", f))
@ -27,29 +29,43 @@ func Compose(filters ...interface{}) *Query {
// applyBson is a fallback for a custom bson.M // applyBson is a fallback for a custom bson.M
func applyBson(q *Query, f interface{}) bool { func applyBson(q *Query, f interface{}) bool {
switch f := f.(type) { if f, ok := f.(bson.M); ok {
case bson.M:
q.And(f) q.And(f)
default: return true
}
return false return false
} }
// applyLimits extends query with a limiter
func applyLimit(q *Query, f interface{}) bool {
if f, ok := f.(Limiter); ok {
q.limiter = f
return true return true
} }
// applyLimits extends query with contol functions return false
func applyLimits(q *Query, f interface{}) bool { }
switch f := f.(type) { // applySort extends query with a sort rule
case Limiter: func applySort(q *Query, f interface{}) bool {
q.limiter = f
case Sorter: if f, ok := f.(Sorter); ok {
q.sorter = f q.sorter = f
case Skipper: return true
q.skipper = f }
default:
return false return false
} }
// applySkip extends query with a skip number
func applySkip(q *Query, f interface{}) bool {
if f, ok := f.(Skipper); ok {
q.skipper = f
return true return true
} }
return false
}

Loading…
Cancel
Save