diff --git a/coperator.go b/coperator.go index ee037e0..3b6cc5d 100644 --- a/coperator.go +++ b/coperator.go @@ -159,4 +159,7 @@ func init() { operatorMap["$ne"] = operatorNe operatorMap["$in"] = operatorIn operatorMap["$nin"] = operatorNotIn + operatorMap["$and"] = operatorAnd + operatorMap["$or"] = operatorOr + operatorMap["$nor"] = operatorNor } diff --git a/logic.go b/logic.go new file mode 100644 index 0000000..20751c4 --- /dev/null +++ b/logic.go @@ -0,0 +1,51 @@ +package coperator + +import "errors" + +func operatorAnd(doc *Document, filter Filter, key string, value interface{}) (bool, error) { + vfilter, ok := filter.([]interface{}) + if !ok { + return false, errors.New("filter must be a slice") + } + for _, v := range vfilter { + ret, err := DocumentOperator(doc, v.(Filter), "", nil) + if !ret { + return ret, err + } + } + return true, nil +} + +func operatorOr(doc *Document, filter Filter, key string, value interface{}) (bool, error) { + vfilter, ok := filter.([]interface{}) + if !ok { + return false, errors.New("filter must be a slice") + } + for _, v := range vfilter { + ret, err := DocumentOperator(doc, v.(Filter), "", nil) + if err != nil { + return false, err + } + if ret { + return ret, err + } + } + return false, nil +} + +func operatorNor(doc *Document, filter Filter, key string, value interface{}) (bool, error) { + vfilter, ok := filter.([]interface{}) + if !ok { + return false, errors.New("filter must be a slice") + } + for _, v := range vfilter { + ret, err := DocumentOperator(doc, v.(Filter), "", nil) + if err != nil { + return false, err + } + if ret { + return false, nil + } + } + return true, nil +}