Skip to content

Commit edb1b5a

Browse files
committed
Add sum(map()) optimization
1 parent 38f9496 commit edb1b5a

File tree

4 files changed

+61
-1
lines changed

4 files changed

+61
-1
lines changed

optimizer/optimizer.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,6 @@ func Optimize(node *Node, config *conf.Config) error {
3737
Walk(node, &filterLast{})
3838
Walk(node, &filterFirst{})
3939
Walk(node, &predicateCombination{})
40+
Walk(node, &sumMap{})
4041
return nil
4142
}

optimizer/sum_map.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package optimizer
2+
3+
import (
4+
. "github.com/expr-lang/expr/ast"
5+
)
6+
7+
type sumMap struct{}
8+
9+
func (*sumMap) Visit(node *Node) {
10+
if sumBuiltin, ok := (*node).(*BuiltinNode); ok &&
11+
sumBuiltin.Name == "sum" &&
12+
len(sumBuiltin.Arguments) == 1 {
13+
if mapBuiltin, ok := sumBuiltin.Arguments[0].(*BuiltinNode); ok &&
14+
mapBuiltin.Name == "map" &&
15+
len(mapBuiltin.Arguments) == 2 {
16+
Patch(node, &BuiltinNode{
17+
Name: "sum",
18+
Arguments: []Node{
19+
mapBuiltin.Arguments[0],
20+
mapBuiltin.Arguments[1],
21+
},
22+
})
23+
}
24+
}
25+
}

optimizer/sum_map_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package optimizer_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
"github.com/stretchr/testify/require"
8+
9+
"github.com/expr-lang/expr/ast"
10+
"github.com/expr-lang/expr/optimizer"
11+
"github.com/expr-lang/expr/parser"
12+
)
13+
14+
func TestOptimize_sum_map(t *testing.T) {
15+
tree, err := parser.Parse(`sum(map(users, {.Age}))`)
16+
require.NoError(t, err)
17+
18+
err = optimizer.Optimize(&tree.Node, nil)
19+
require.NoError(t, err)
20+
21+
expected := &ast.BuiltinNode{
22+
Name: "sum",
23+
Arguments: []ast.Node{
24+
&ast.IdentifierNode{Value: "users"},
25+
&ast.ClosureNode{
26+
Node: &ast.MemberNode{
27+
Node: &ast.PointerNode{},
28+
Property: &ast.StringNode{Value: "Age"},
29+
},
30+
},
31+
},
32+
}
33+
34+
assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node))
35+
}

test/fuzz/fuzz_corpus.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5608,7 +5608,6 @@ findLastIndex(list, f64 == f64)
56085608
findLastIndex(list, false == false)
56095609
findLastIndex(list, false and false)
56105610
findLastIndex(list, false and ok)
5611-
findLastIndex(list, false) != i
56125611
findLastIndex(list, foo != #)
56135612
findLastIndex(list, foo == foo)
56145613
findLastIndex(list, greet != half)

0 commit comments

Comments
 (0)