Skip to content

Commit

Permalink
add AddCondition method
Browse files Browse the repository at this point in the history
  • Loading branch information
hexaforce committed Nov 27, 2024
1 parent 805ec6e commit 21f1beb
Show file tree
Hide file tree
Showing 2 changed files with 388 additions and 27 deletions.
145 changes: 128 additions & 17 deletions mongox/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,38 @@ package mongox

import "go.mongodb.org/mongo-driver/bson"

func isEmptyCondition(condition interface{}) bool {
switch c := condition.(type) {
func AppendE(f interface{}, elements ...bson.E) interface{} {
switch f2 := f.(type) {
case bson.D:
for _, e := range elements {
f2 = append(f2, e)
}
return f2
case bson.M:
return len(c) == 0
f3 := make(bson.M, len(f2))
for k, v := range f2 {
f3[k] = v
}
for _, e := range elements {
f3[e.Key] = e.Value
}
return f3
}
return f
}

func GetE(f interface{}, k string) interface{} {
switch g := f.(type) {
case bson.D:
return len(c) == 0
case bson.A:
return len(c) == 0
case []bson.M:
return len(c) == 0
case []bson.D:
return len(c) == 0
case []bson.A:
return len(c) == 0
case []interface{}:
return len(c) == 0
default:
return false
for _, e := range g {
if e.Key == k {
return e.Value
}
}
case bson.M:
return g[k]
}
return nil
}

func DToM(i interface{}) interface{} {
Expand Down Expand Up @@ -68,7 +81,105 @@ func DToM(i interface{}) interface{} {
return i
}

func And(filter interface{}, key string, condition interface{}) interface{} {
func AppendI(f interface{}, elements ...interface{}) interface{} {
switch f2 := f.(type) {
case []bson.D:
res := make([]interface{}, 0, len(f2))
for _, e := range f2 {
res = append(res, e)
}
return append(res, elements...)
case []bson.M:
res := make([]interface{}, 0, len(f2)+len(elements))
for _, e := range f2 {
res = append(res, e)
}
return append(res, elements...)
case bson.A:
res := make([]interface{}, 0, len(f2)+len(elements))
return append(res, append(f2, elements...)...)
case []interface{}:
res := make([]interface{}, 0, len(f2)+len(elements))
return append(res, append(f2, elements...)...)
}
return f
}

func And(filter interface{}, key string, f interface{}) interface{} {
if f == nil {
return filter
}
if g, ok := f.(bson.M); ok && g == nil {
return filter
}
if g, ok := f.(bson.D); ok && g == nil {
return filter
}
if g, ok := f.(bson.A); ok && g == nil {
return filter
}
if g, ok := f.([]interface{}); ok && g == nil {
return filter
}
if g, ok := f.([]bson.M); ok && g == nil {
return filter
}
if g, ok := f.([]bson.D); ok && g == nil {
return filter
}
if g, ok := f.([]bson.A); ok && g == nil {
return filter
}

if key != "" && GetE(filter, key) != nil {
return filter
}
var g interface{}
if key == "" {
g = f
} else {
g = bson.M{key: f}
}
if GetE(filter, "$or") != nil {
return bson.M{
"$and": []interface{}{filter, g},
}
}
if and := GetE(filter, "$and"); and != nil {
return bson.M{
"$and": AppendI(and, g),
}
}
if key == "" {
return bson.M{
"$and": []interface{}{filter, g},
}
}
return AppendE(filter, bson.E{Key: key, Value: f})
}

func isEmptyCondition(condition interface{}) bool {
switch c := condition.(type) {
case bson.M:
return len(c) == 0
case bson.D:
return len(c) == 0
case bson.A:
return len(c) == 0
case []bson.M:
return len(c) == 0
case []bson.D:
return len(c) == 0
case []bson.A:
return len(c) == 0
case []interface{}:
return len(c) == 0
default:
return false
}
}

func AddCondition(filter interface{}, key string, condition interface{}) interface{} {
if condition == nil || isEmptyCondition(condition) {
return filter
}
Expand Down
Loading

0 comments on commit 21f1beb

Please sign in to comment.