diff --git a/optimizer/fold.go b/optimizer/fold.go index bb40eab93..2e5498fa5 100644 --- a/optimizer/fold.go +++ b/optimizer/fold.go @@ -296,10 +296,12 @@ func (fold *fold) Visit(node *Node) { Name: "filter", Arguments: []Node{ base.Arguments[0], - &BinaryNode{ - Operator: "&&", - Left: base.Arguments[1].(*PredicateNode).Node, - Right: n.Arguments[1].(*PredicateNode).Node, + &PredicateNode{ + Node: &BinaryNode{ + Operator: "&&", + Left: base.Arguments[1].(*PredicateNode).Node, + Right: n.Arguments[1].(*PredicateNode).Node, + }, }, }, }) diff --git a/optimizer/fold_test.go b/optimizer/fold_test.go index d3f44fcf4..026a4f59b 100644 --- a/optimizer/fold_test.go +++ b/optimizer/fold_test.go @@ -70,8 +70,10 @@ func TestOptimize_constant_folding_filter_filter(t *testing.T) { Value: 2, }, }, - &ast.BoolNode{ - Value: true, + &ast.PredicateNode{ + Node: &ast.BoolNode{ + Value: true, + }, }, }, Throws: false, diff --git a/test/issues/857/issue_test.go b/test/issues/857/issue_test.go new file mode 100644 index 000000000..25a8ef109 --- /dev/null +++ b/test/issues/857/issue_test.go @@ -0,0 +1,39 @@ +package main + +import ( + "testing" + + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/internal/testify/require" +) + +func TestIssue857(t *testing.T) { + foo := map[string]any{ + "entry": map[string]any{ + "alpha": "x", + "beta": 1, + }, + } + bar := map[string]any{ + "entry": map[string]any{ + "alpha": "x", + "beta": 1, + }, + } + + env := map[string]any{ + "foo": foo, + "bar": bar, + } + + code := ` + foo + | keys() + | filter(# in bar) + | filter(foo[#].alpha == bar[#].alpha) + | filter(foo[#].beta == bar[#].beta) + ` + + _, err := expr.Compile(code, expr.Env(env)) + require.NoError(t, err) +}