Select Git revision
mongo.go 18.55 KiB
package expr
import (
"context"
"fmt"
"regexp"
"strconv"
"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",
}
type MongoExprConfig struct {
Env map[string]any
IdentifierRenameFn func(s string) string
Visitors []ast.Visitor
Ops []expr.Option
}
func ConvertToMongo(ctx context.Context, config *MongoExprConfig, expressions ...string) (b bson.M, err error) {
if len(expressions) == 0 {
return bson.M{}, nil
}
tree, err := parser.Parse("(" + strings.Join(expressions, ") && (") + ")")
if err != nil {
return nil, err
}
return convertToMongo(ctx, config, tree)
}
func convertToMongo(ctx context.Context, config *MongoExprConfig, tree *parser.Tree) (b bson.M, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("%v", r)
}
}()
if config == nil {
config = new(MongoExprConfig)
}
env := config.Env
if env == nil {
env = make(map[string]interface{})
}
env[EnvContextKey] = ctx
exprConfig := GetDefaultConfig(env)
exprConfig.Visitors = config.Visitors
for _, op := range config.Ops {
op(exprConfig)
}
env = exprConfig.Env.(map[string]interface{})
c := &compiler{
tree: tree,
env: env,
config: exprConfig,