11package agg
22
33import (
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
1010type 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
1419func (c * collect ) NoRip () bool { return true }
1520
1621func (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
2025func (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-
6237func (c * collect ) Result (sctx * super.Context ) vector.Any {
6338 if c .builder == nil {
6439 atyp := sctx .LookupTypeArray (super .TypeNone )
0 commit comments