Skip to content

Commit 974d11c

Browse files
authored
collect(): defuse incoming values (#7171)
1 parent 1702e10 commit 974d11c

6 files changed

Lines changed: 19 additions & 49 deletions

File tree

compiler/rungen/vop.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ func (b *Builder) compileVamAgg(agg *dag.AggExpr) (*vamexpr.Aggregator, error) {
429429
return nil, err
430430
}
431431
}
432-
pattern, err := vamagg.NewPattern(name, agg.Distinct, agg.Expr != nil)
432+
pattern, err := vamagg.NewPattern(b.sctx(), name, agg.Distinct, agg.Expr != nil)
433433
if err != nil {
434434
return nil, err
435435
}

runtime/vam/expr/agg/agg.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ package agg
33
import (
44
"fmt"
55

6+
"github.com/brimdata/super"
67
"github.com/brimdata/super/runtime/vam/expr"
78
)
89

9-
func NewPattern(op string, distinct, hasarg bool) (expr.AggPattern, error) {
10+
func NewPattern(sctx *super.Context, op string, distinct, hasarg bool) (expr.AggPattern, error) {
1011
needarg := true
1112
var pattern expr.AggPattern
1213
switch op {
@@ -25,7 +26,7 @@ func NewPattern(op string, distinct, hasarg bool) (expr.AggPattern, error) {
2526
}
2627
case "array_agg":
2728
pattern = func() expr.AggFunc {
28-
return &arrayAgg{}
29+
return &arrayAgg{*newCollect(sctx)}
2930
}
3031
case "blend":
3132
pattern = func() expr.AggFunc {
@@ -57,7 +58,7 @@ func NewPattern(op string, distinct, hasarg bool) (expr.AggPattern, error) {
5758
}
5859
case "collect":
5960
pattern = func() expr.AggFunc {
60-
return &collect{}
61+
return newCollect(sctx)
6162
}
6263
case "collect_map":
6364
pattern = func() expr.AggFunc {

runtime/vam/expr/agg/collect.go

Lines changed: 10 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,31 @@
11
package agg
22

33
import (
4-
"github.com/RoaringBitmap/roaring/v2"
54
"github.com/brimdata/super"
5+
"github.com/brimdata/super/runtime/vam/expr"
66
"github.com/brimdata/super/vector"
77
"github.com/brimdata/super/vector/vbuild"
88
)
99

1010
type collect struct {
1111
builder *vbuild.DynamicBuilder
12+
defuse *expr.Defuse
13+
}
14+
15+
func newCollect(sctx *super.Context) *collect {
16+
return &collect{defuse: expr.NewDefuse(sctx)}
1217
}
1318

1419
func (c *collect) NoRip() bool { return true }
1520

1621
func (c *collect) Consume(vec vector.Any) {
17-
vector.Apply(vector.ApplyRipUnions, c.consume, vec)
22+
vector.Apply(vector.ApplyRipUnions, c.consume, c.defuse.Eval(vec))
1823
}
1924

2025
func (c *collect) consume(vecs ...vector.Any) vector.Any {
21-
vec := filterNones(vecs[0])
22-
if vec.Len() == 0 {
23-
return vector.NewNone(vecs[0].Len())
26+
vec := vecs[0]
27+
if vec.Kind() == vector.KindNone || vec.Len() == 0 {
28+
return vector.NewNull(vecs[0].Len())
2429
}
2530
if c.builder == nil {
2631
c.builder = vbuild.NewDynamicBuilder()
@@ -29,36 +34,6 @@ func (c *collect) consume(vecs ...vector.Any) vector.Any {
2934
return vector.NewNone(vecs[0].Len())
3035
}
3136

32-
func filterNones(vec vector.Any) vector.Any {
33-
switch mask := nonesMask(vec); {
34-
case mask.IsEmpty():
35-
return vec
36-
case mask.GetCardinality() == uint64(vec.Len()):
37-
return vector.NewNone(0)
38-
default:
39-
return vector.ReversePick(vec, mask.ToArray())
40-
}
41-
}
42-
43-
func nonesMask(vec vector.Any) *roaring.Bitmap {
44-
vec = vector.Apply(vector.ApplyRipFusions|vector.ApplyRipUnions, func(vecs ...vector.Any) vector.Any {
45-
return vecs[0]
46-
}, vec)
47-
bm := roaring.New()
48-
if dynamic, ok := vec.(*vector.Dynamic); ok {
49-
for i, vec := range dynamic.Values {
50-
if vec.Len() > 0 && vec.Kind() == vector.KindNone {
51-
bm.AddMany(dynamic.ReverseTagMap()[i])
52-
}
53-
}
54-
return bm
55-
}
56-
if vec.Len() > 0 && vec.Kind() == vector.KindNone {
57-
bm.AddRange(0, uint64(vec.Len()))
58-
}
59-
return bm
60-
}
61-
6237
func (c *collect) Result(sctx *super.Context) vector.Any {
6338
if c.builder == nil {
6439
atyp := sctx.LookupTypeArray(super.TypeNone)

runtime/ztests/op/aggregate/array_agg.yaml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,9 @@ input: |
1212
fusion(1::(int64|null),<int64>)
1313
fusion(null::(int64|null),<null>)
1414
15-
output-flags: -fusion
16-
1715
output: |
1816
type foo=int64
19-
[{a:1},{a:2},null,{b:1.5},error("missing"),1::foo,fusion(1::(int64|null),<int64>),fusion(null::(int64|null),<null>)]
17+
[{a:1},{a:2},null,null,{b:1.5},error("missing"),1::foo,1]
2018
2119
---
2220

runtime/ztests/op/aggregate/collect.yaml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,9 @@ input: |
1212
fusion(1::(int64|null),<int64>)
1313
fusion(null::(int64|null),<null>)
1414
15-
output-flags: -fusion
16-
1715
output: |
1816
type foo=int64
19-
[{a:1},{a:2},null,{b:1.5},error("missing"),1::foo,fusion(1::(int64|null),<int64>),fusion(null::(int64|null),<null>)]
17+
[{a:1},{a:2},null,null,{b:1.5},error("missing"),1::foo,1]
2018
2119
---
2220

runtime/ztests/op/fuse.yaml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,9 @@ input: |
191191
[fusion({x?:1,y?:_::int64},<{x:int64}>),fusion({x?:_::int64,y?:2},<{y:int64}>)]
192192
[1,fusion(2::(int64|null),<int64>)]
193193
194-
output-flags: -fusion
195-
196194
output: |
197195
{x:1}
198-
fusion({x?:1,y?:_::int64},<{x:int64}>)
199-
fusion({x?:_::int64,y?:2},<{y:int64}>)
196+
{x:1}
197+
{y:2}
200198
1
201199
2

0 commit comments

Comments
 (0)