From 347ced5cb565768eb0c07e61dc3c810c4ae7d996 Mon Sep 17 00:00:00 2001 From: lack30 <598223084@qq.com> Date: Fri, 29 Nov 2024 18:52:48 +0800 Subject: [PATCH] expr --- pkg/data/impl.go | 6 +++--- pkg/expression/expr/expr.go | 8 ++++++-- pkg/expression/expr/expr_test.go | 34 +++++++++++++++++++++++++++++--- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/pkg/data/impl.go b/pkg/data/impl.go index a4065fb..bea7f29 100644 --- a/pkg/data/impl.go +++ b/pkg/data/impl.go @@ -29,9 +29,9 @@ import ( ) const ( - LocatorObject = "$" - LocatorHeader = "#" - LocatorProperty = "@" + LocatorObject = "d$" // data object + LocatorHeader = "h$" // headers + LocatorProperty = "p$" // properties ) type ObjectContainer struct { diff --git a/pkg/expression/expr/expr.go b/pkg/expression/expr/expr.go index c367f97..f5e75a0 100644 --- a/pkg/expression/expr/expr.go +++ b/pkg/expression/expr/expr.go @@ -68,14 +68,18 @@ func New(ctx context.Context) *Expr { itemAwareLocators: map[string]data.IItemAwareLocator{}, } engine.env = map[string]interface{}{ - data.LocatorObject: engine.fetchItem(data.LocatorObject), data.LocatorHeader: engine.fetchItem(data.LocatorHeader), + data.LocatorObject: engine.fetchItem(data.LocatorObject), } return engine } func (engine *Expr) CompileExpression(source string) (result expression.ICompiledExpression, err error) { - result, err = expr.Compile(source, expr.Env(engine.env), expr.AllowUndefinedVariables()) + opts := []expr.Option{ + expr.Env(engine.env), + expr.AllowUndefinedVariables(), + } + result, err = expr.Compile(source, opts...) return } diff --git a/pkg/expression/expr/expr_test.go b/pkg/expression/expr/expr_test.go index 163f88f..3dacfb1 100644 --- a/pkg/expression/expr/expr_test.go +++ b/pkg/expression/expr/expr_test.go @@ -21,6 +21,7 @@ import ( "context" "testing" + "github.com/expr-lang/expr/ast" "github.com/stretchr/testify/assert" "github.com/olive-io/bpmn/schema" @@ -52,6 +53,16 @@ func TestExprSum(t *testing.T) { assert.True(t, ok) } +type Visitor struct { + Identifiers []string +} + +func (v *Visitor) Visit(node *ast.Node) { + if n, ok := (*node).(*ast.IdentifierNode); ok { + v.Identifiers = append(v.Identifiers, n.Value) + } +} + type dataObjects map[string]data.IItemAware func (d dataObjects) PutItemAwareById(id schema.IdRef, itemAware data.IItemAware) { @@ -85,11 +96,28 @@ func TestExpr_getDataObject(t *testing.T) { "dataObject1": container1, } engine.SetItemAwareLocator(data.LocatorObject, objs) - compiled, err := engine.CompileExpression("$('dataObject1').msg == 'hello'") - assert.Nil(t, err) - compiled, err = engine.CompileExpression("$('dataObject') == 1") + + h1 := data.NewContainer(nil) + h1.Put(2) + var headers dataObjects = map[string]data.IItemAware{ + "a": h1, + } + engine.SetItemAwareLocator(data.LocatorHeader, headers) + + compiled, err := engine.CompileExpression("d$('dataObject1').msg == 'hello'") assert.Nil(t, err) result, err := engine.EvaluateExpression(compiled, map[string]interface{}{}) assert.Nil(t, err) assert.True(t, result.(bool)) + compiled, err = engine.CompileExpression("d$('dataObject') == 1") + assert.Nil(t, err) + result, err = engine.EvaluateExpression(compiled, map[string]interface{}{}) + assert.Nil(t, err) + assert.True(t, result.(bool)) + + compiled, err = engine.CompileExpression("h$('a') + 1") + assert.Nil(t, err) + result, err = engine.EvaluateExpression(compiled, map[string]interface{}{}) + assert.Nil(t, err) + assert.Equal(t, result.(int), int(3)) }