Mongo Improvment for filtering
This commit is contained in:
31
dbs/dbs.go
31
dbs/dbs.go
@@ -21,6 +21,7 @@ const (
|
||||
EQUAL
|
||||
NOT
|
||||
ELEMMATCH
|
||||
OR
|
||||
)
|
||||
|
||||
var str = [...]string{
|
||||
@@ -67,29 +68,9 @@ func (m Operator) ToMongoOperator(k string, value interface{}) bson.M {
|
||||
case EQUAL:
|
||||
return bson.M{k: value}
|
||||
case NOT:
|
||||
v := value.(Filters)
|
||||
orList := bson.A{}
|
||||
andList := bson.A{}
|
||||
f := bson.D{}
|
||||
for k, filter := range v.Or {
|
||||
for _, ff := range filter {
|
||||
orList = append(orList, StringToOperator(ff.Operator).ToMongoOperator(k, ff.Value))
|
||||
}
|
||||
}
|
||||
for k, filter := range v.And {
|
||||
for _, ff := range filter {
|
||||
andList = append(andList, StringToOperator(ff.Operator).ToMongoOperator(k, ff.Value))
|
||||
}
|
||||
}
|
||||
if len(orList) > 0 && len(andList) == 0 {
|
||||
f = bson.D{{"$or", orList}}
|
||||
} else {
|
||||
if len(orList) > 0 {
|
||||
andList = append(andList, bson.M{"$or": orList})
|
||||
}
|
||||
f = bson.D{{"$and", andList}}
|
||||
}
|
||||
return bson.M{"$not": f}
|
||||
return bson.M{"$not": m.ToValueOperator(StringToOperator(m.String()), value)}
|
||||
case OR:
|
||||
return bson.M{"$or": m.ToValueOperator(StringToOperator(m.String()), value)}
|
||||
default:
|
||||
return defaultValue
|
||||
}
|
||||
@@ -132,9 +113,9 @@ func GetBson(filters *Filters) bson.D {
|
||||
}
|
||||
|
||||
func (m Operator) ToValueOperator(operator Operator, value interface{}) interface{} {
|
||||
switch value.(type) {
|
||||
switch value := value.(type) {
|
||||
case *Filters:
|
||||
return GetBson(value.(*Filters))
|
||||
return GetBson(value)
|
||||
default:
|
||||
if strings.TrimSpace(fmt.Sprintf("%v", value)) == "*" {
|
||||
value = ""
|
||||
|
||||
@@ -95,7 +95,11 @@ func (a *peerMongoAccessor) GetDefaultFilter(search string) *dbs.Filters {
|
||||
}
|
||||
return &dbs.Filters{
|
||||
And: map[string][]dbs.Filter{ // search by name if no filters are provided
|
||||
"state": {{Operator: dbs.NOT.String(), Value: 1}},
|
||||
"state": {{Operator: dbs.NOT.String(), Value: &dbs.Filters{
|
||||
And: map[string][]dbs.Filter{
|
||||
"state": {{Operator: dbs.EQUAL.String(), Value: 1}},
|
||||
},
|
||||
}}},
|
||||
},
|
||||
Or: map[string][]dbs.Filter{ // search by name if no filters are provided
|
||||
"abstractobject.name": {{Operator: dbs.LIKE.String(), Value: search}},
|
||||
|
||||
Reference in New Issue
Block a user