code: func (w *HashAggPartialWorker) shuffleIntermData(sc *stmtctx.StatementContext, finalConcurrency int) {
  	groupKeysSlice := make([][]string, finalConcurrency)
  	for groupKey := range w.partialResultsMap {
  		finalWorkerIdx := int(murmur3.Sum32([]byte(groupKey))) % finalConcurrency
  		if groupKeysSlice[finalWorkerIdx] == nil {
  			groupKeysSlice[finalWorkerIdx] = make([]string, 0, len(w.partialResultsMap)/finalConcurrency)
  		}
  		groupKeysSlice[finalWorkerIdx] = append(groupKeysSlice[finalWorkerIdx], groupKey)
  	}
  
  	for i := range groupKeysSlice {
  		if groupKeysSlice[i] == nil {
  			continue
  		}
  		w.outputChs[i] <- &HashAggIntermData{
  			groupKeys:        groupKeysSlice[i],
  			partialResultMap: w.partialResultsMap,
  		}
  	}
  }
docs: // shuffleIntermData shuffles the intermediate data of partial workers to corresponded final workers.
  // We only support parallel execution for single-machine, so process of encode and decode can be skipped.