code: func splitBuckets(h *Histogram, feedback *QueryFeedback) ([]bucket, []bool, int64) {
  	bktID2FB, numTotalFBs := buildBucketFeedback(h, feedback)
  	buckets := make([]bucket, 0, h.Len())
  	isNewBuckets := make([]bool, 0, h.Len())
  	splitCount := getSplitCount(numTotalFBs, defaultBucketCount-h.Len())
  	for i := 0; i < h.Len(); i++ {
  		bktFB, ok := bktID2FB[i]
  		// No feedback, just use the original one.
  		if !ok {
  			buckets = append(buckets, bucket{h.GetLower(i), h.GetUpper(i), h.bucketCount(i), h.Buckets[i].Repeat})
  			isNewBuckets = append(isNewBuckets, false)
  			continue
  		}
  		// Distribute the total split count to bucket based on number of bucket feedback.
  		newBktNums := splitCount * len(bktFB.feedback) / numTotalFBs
  		bkts := bktFB.splitBucket(newBktNums, h.TotalRowCount(), float64(h.bucketCount(i)))
  		buckets = append(buckets, bkts...)
  		if len(bkts) == 1 {
  			isNewBuckets = append(isNewBuckets, false)
  		} else {
  			for i := 0; i < len(bkts); i++ {
  				isNewBuckets = append(isNewBuckets, true)
  			}
  		}
  	}
  	totCount := int64(0)
  	for _, bkt := range buckets {
  		totCount += bkt.Count
  	}
  	return buckets, isNewBuckets, totCount
  }
docs: // splitBuckets split the histogram buckets according to the feedback.