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