@@ -112,7 +112,7 @@ type AggFuncExec interface {
112112 Flush () ([]* vector.Vector , error )
113113
114114 // Serialize intermediate result to bytes.
115- SaveIntermediateResult (buketIdx [] int64 , bucket int64 , buf * bytes.Buffer ) error
115+ SaveIntermediateResult (cnt int64 , flags [][] uint8 , buf * bytes.Buffer ) error
116116 SaveIntermediateResultOfChunk (chunk int , buf * bytes.Buffer ) error
117117
118118 Size () int64
@@ -309,36 +309,6 @@ func makeWindowExec(
309309 return makeRankDenseRankRowNumber (mg , info ), nil
310310}
311311
312- // given buckets, and a specific bucket, compute the flags for vector union.
313- func computeChunkFlags (bucketIdx []int64 , bucket int64 , chunkSize int ) (int64 , [][]uint8 ) {
314- // compute the number of chunks,
315- nChunks := (len (bucketIdx ) + chunkSize - 1 ) / chunkSize
316-
317- // return values
318- cnt := int64 (0 )
319- flags := make ([][]uint8 , nChunks )
320- for i := range flags {
321- flags [i ] = make ([]uint8 , chunkSize )
322- }
323-
324- nextX := 0
325- nextY := 0
326-
327- for _ , idx := range bucketIdx {
328- nextY += 1
329- if nextY == chunkSize {
330- nextX += 1
331- nextY = 0
332- }
333-
334- if idx == bucket {
335- flags [nextX ][nextY ] = 1
336- cnt += 1
337- }
338- }
339- return cnt , flags
340- }
341-
342312type dummyBinaryMarshaler struct {
343313 encoding.BinaryMarshaler
344314}
@@ -348,9 +318,8 @@ func (d dummyBinaryMarshaler) MarshalBinary() ([]byte, error) {
348318}
349319
350320func marshalRetAndGroupsToBuffer [T encoding.BinaryMarshaler ](
351- bucketIdx [] int64 , bucket int64 , buf * bytes.Buffer ,
321+ cnt int64 , flags [][] uint8 , buf * bytes.Buffer ,
352322 ret * optSplitResult , groups []T ) error {
353- cnt , flags := computeChunkFlags (bucketIdx , bucket , ret .optInformation .chunkSize )
354323 buf .Write (types .EncodeInt64 (& cnt ))
355324 if cnt == 0 {
356325 return nil
@@ -359,18 +328,19 @@ func marshalRetAndGroupsToBuffer[T encoding.BinaryMarshaler](
359328 return err
360329 }
361330 if len (groups ) > 0 {
362- if len ( groups ) != len ( bucketIdx ) {
363- return moerr . NewInternalErrorNoCtx ( "approx_count: the number of groups does not match the number of buckets" )
364- }
365- for i := range groups {
366- if bucketIdx [ i ] == bucket {
367- bs , err := groups [ i ]. MarshalBinary ()
368- if err != nil {
369- return err
370- }
371- if err = types . WriteSizeBytes ( bs , buf ); err != nil {
372- return err
331+ groupIdx := 0
332+ for i := range flags {
333+ for j := range flags [ i ] {
334+ if flags [ i ][ j ] == 1 {
335+ bs , err := groups [ groupIdx ]. MarshalBinary ()
336+ if err != nil {
337+ return err
338+ }
339+ if err = types . WriteSizeBytes ( bs , buf ); err != nil {
340+ return err
341+ }
373342 }
343+ groupIdx += 1
374344 }
375345 }
376346 }
0 commit comments