in hll/hll_4array.go [124:170]
func convertToHll4(srcAbsHllArr hllArray) (hllSketchStateI, error) {
lgConfigK := srcAbsHllArr.GetLgConfigK()
hll4Array := newHll4Array(lgConfigK)
hll4Array.putOutOfOrder(srcAbsHllArr.isOutOfOrder())
// 1st pass: compute starting curMin and numAtCurMin:
pair, err := curMinAndNum(srcAbsHllArr)
if err != nil {
return nil, err
}
curMin := getPairValue(pair)
numAtCurMin := getPairLow26(pair)
// 2nd pass: Must know curMin to create auxHashMap.
// Populate KxQ registers, build auxHashMap if needed
srcItr := srcAbsHllArr.iterator()
auxHashMap := hll4Array.getAuxHashMap() //may be null
for srcItr.nextValid() {
slotNo := srcItr.getIndex()
actualValue, err := srcItr.getValue()
if err != nil {
return nil, err
}
err = hll4Array.hipAndKxQIncrementalUpdate(0, actualValue)
if err != nil {
return nil, err
}
if actualValue >= (curMin + 15) {
hll4Array.putNibble(slotNo, auxToken)
if auxHashMap == nil {
auxHashMap = newAuxHashMap(lgAuxArrInts[lgConfigK], lgConfigK)
hll4Array.putAuxHashMap(auxHashMap, false)
}
err := auxHashMap.mustAdd(slotNo, actualValue)
if err != nil {
return nil, err
}
} else {
hll4Array.putNibble(slotNo, byte(actualValue-curMin))
}
}
hll4Array.putCurMin(curMin)
hll4Array.putNumAtCurMin(numAtCurMin)
hll4Array.putHipAccum(srcAbsHllArr.getHipAccum()) //intentional overwrite
hll4Array.putRebuildCurMinNumKxQFlag(false)
return hll4Array, nil
}