Sha256: fabaa9a64c126f43b43c7e586d92cfd43f52e541fb4459138dcb4e1af89b3bb3

Contents?: true

Size: 1.23 KB

Versions: 8

Compression:

Stored size: 1.23 KB

Contents

require 'date'

module Avro
  module LogicalTypes
    module IntDate
      EPOCH_START = Date.new(1970, 1, 1)

      def self.encode(date)
        (date - EPOCH_START).to_i
      end

      def self.decode(int)
        EPOCH_START + int
      end
    end

    module TimestampMillis
      def self.encode(value)
        time = value.to_time
        time.to_i * 1000 + time.usec / 1000
      end

      def self.decode(int)
        s, ms = int / 1000, int % 1000
        Time.at(s, ms * 1000).utc
      end
    end

    module TimestampMicros
      def self.encode(value)
        time = value.to_time
        time.to_i * 1000_000 + time.usec
      end

      def self.decode(int)
        s, us = int / 1000_000, int % 1000_000
        Time.at(s, us).utc
      end
    end

    module Identity
      def self.encode(datum)
        datum
      end

      def self.decode(datum)
        datum
      end
    end

    TYPES = {
      "int" => {
        "date" => IntDate
      },
      "long" => {
        "timestamp-millis" => TimestampMillis,
        "timestamp-micros" => TimestampMicros
      },
    }.freeze

    def self.type_adapter(type, logical_type)
      return unless logical_type

      TYPES.fetch(type, {}).fetch(logical_type, Identity)
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
avro-patches-0.3.4 lib/avro-patches/logical_types/logical_types.rb
avro-patches-0.3.3 lib/avro-patches/logical_types/logical_types.rb
avro-patches-0.3.2 lib/avro-patches/logical_types/logical_types.rb
avro-patches-0.3.1 lib/avro-patches/logical_types/logical_types.rb
avro-patches-0.3.0 lib/avro-patches/logical_types/logical_types.rb
avro-patches-0.2.0 lib/avro-patches/logical_types/logical_types.rb
avro-patches-0.1.0 lib/avro-patches/logical_types/logical_types.rb
avro-patches-0.1.0.rc0 lib/avro-patches/logical_types/logical_types.rb