Select Git revision
mongo.go 15.17 KiB
package expr
import (
"context"
"fmt"
"regexp"
"strings"
"github.com/expr-lang/expr"
"github.com/expr-lang/expr/ast"
exprcompiler "github.com/expr-lang/expr/compiler"
"github.com/expr-lang/expr/conf"
"github.com/expr-lang/expr/parser"
"go.mongodb.org/mongo-driver/bson"
)
var geoTypes = map[string]string{
"box": "$box",
"polygon": "$polygon",
}
func ConvertToMongo(ctx context.Context, exp string, env map[string]interface{}, identifierRenameFn func(string) string, ops ...expr.Option) (b bson.M, err error) {
if exp == "" {
return bson.M{}, nil
}
tree, err := parser.Parse(exp)
if err != nil {
return nil, err
}
return convertToMongo(ctx, tree, env, identifierRenameFn, ops...)
}
func convertToMongo(ctx context.Context, tree *parser.Tree, env map[string]interface{}, identifierRenameFn func(string) string, ops ...expr.Option) (b bson.M, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("%v", r)
}
}()
if env == nil {
env = make(map[string]interface{})
}
env[EnvContextKey] = ctx
config := GetDefaultConfig(env)
for _, op := range ops {
op(config)
}
env = config.Env.(map[string]interface{})
if len(config.Visitors) >= 0 {
for _, v := range config.Visitors {
ast.Walk(&tree.Node, v)
}
}
c := &compiler{tree: tree, env: env, config: config, identifierRenameFn: identifierRenameFn}
v, ok := c.compile(tree.Node).(bson.M)
if !ok || v == nil {
return nil, fmt.Errorf("invalid expression")
}
return v, nil
}
type compiler struct {
env map[string]interface{}
tree *parser.Tree
config *conf.Config