Sha256: 2f5b04e72ed6914cb96d8523d95c24c9ee3963bdc22400166f704cca74e5e80b

Contents?: true

Size: 1.87 KB

Versions: 3

Compression:

Stored size: 1.87 KB

Contents

require 'bigdecimal'

class Riak::Client::BeefcakeProtobuffsBackend
  class TsCellCodec
    def cells_for(measures)
      measures.map{ |m| cell_for m }
    end

    def scalars_for(cells)
      cells.map{ |c| scalar_for c }
    end

    def cell_for(measure)
      TsCell.new case measure
                 when String
                   { varchar_value: measure }
                 when Fixnum
                   { sint64_value: measure }
                 when Bignum
                   { sint64_value: check_bignum_range(measure) }
                 when Float
                   { double_value: measure }
                 when BigDecimal
                   { double_value: measure.to_f }
                 when Rational
                   fail Riak::TimeSeriesError::SerializeRationalNumberError
                 when Complex
                   fail Riak::TimeSeriesError::SerializeComplexNumberError
                 when Time
                   seconds = measure.to_f
                   milliseconds = seconds * 1000
                   truncated_ms = milliseconds.to_i
                   { timestamp_value: truncated_ms }
                 when TrueClass, FalseClass
                   { boolean_value: measure }
                 when nil
                   {  }
                 end
    end

    def scalar_for(cell)
      cell.varchar_value ||
        cell.sint64_value ||
        cell.double_value ||
        timestamp(cell) ||
        cell.boolean_value # boolean_value is last, so we can get either false, nil, or true
    end

    private
    def check_bignum_range(bignum)
      if (bignum > -0x8000000000000000) && (bignum < 0x7FFFFFFFFFFFFFFF)
        return bignum
      end

      fail Riak::TimeSeriesError::SerializeBigIntegerError, bignum
    end

    def timestamp(cell)
      return false unless cell.timestamp_value.is_a? Integer
      Time.at(cell.timestamp_value.to_f / 1000)
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
riak-client-2.3.2 lib/riak/client/beefcake/ts_cell_codec.rb
riak-client-2.3.1 lib/riak/client/beefcake/ts_cell_codec.rb
riak-client-2.3.0 lib/riak/client/beefcake/ts_cell_codec.rb