in atlas-core/src/main/scala/com/netflix/atlas/core/model/Block.scala [44:93]
def compress(block: ArrayBlock): Block = {
if (block.size < 10) {
block
} else {
// Keeps track of values we have already seen and maps them to an index. NaN doesn't equal
// anything so it cannot be found in the map. We special case it to always have index -1.
// val idxMap = new TDoubleIntHashMap(10, 0.5f, Double.NaN, SparseBlock.NOT_FOUND)
val idxMap = new DoubleIntHashMap
var nextIdx = 0
// Index into the value array
val indexes = new Array[Byte](block.size)
// Populate index array and value map from the array block
var isConstant = true
var prev = 0
var i = 0
while (i < block.size) {
val v = block.buffer(i)
val predefIdx = SparseBlock.predefinedIndex(v)
var idx =
if (predefIdx == SparseBlock.UNDEFINED) idxMap.get(v, SparseBlock.NOT_FOUND)
else predefIdx
if (idx == SparseBlock.NOT_FOUND) {
if (nextIdx == MAX_SIZE) return block
idx = nextIdx
nextIdx += 1
idxMap.put(v, idx)
}
indexes(i) = idx.asInstanceOf[Byte]
if (i > 0) isConstant &&= (prev == idx)
prev = idx.asInstanceOf[Byte]
i += 1
}
// Populate values array
val values = new Array[Double](idxMap.size)
idxMap.foreach { (k, v) =>
values(v) = k
}
// Choose the appropriate block type
if (isConstant)
ConstantBlock(block.start, block.size, SparseBlock.get(indexes(0), values))
else if (idxMap.size < block.size / 2)
SparseBlock(block.start, indexes, values)
else
block
}
}