def compress()

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
    }
  }