Sha256: 66f213cf0782a804ff71aa5addd963138be4d3271c50206b545bce8862d0f753

Contents?: true

Size: 1.63 KB

Versions: 1

Compression:

Stored size: 1.63 KB

Contents

require 'avro-patches'

module Avro
  class ResolutionCanonicalForm < SchemaNormalization
    DECIMAL_LOGICAL_TYPE = 'decimal'.freeze

    def self.to_resolution_form(schema)
      new.to_resolution_form(schema)
    end

    def to_resolution_form(schema)
      MultiJson.dump(normalize_schema(schema))
    end

    private

    def normalize_schema(schema)
      if schema.type_sym == :bytes && schema.logical_type == DECIMAL_LOGICAL_TYPE
        add_logical_type(schema, type: schema.type)
      else
        super
      end
    end

    def normalize_field(field)
      extensions = {}
      extensions[:default] = field.default if field.default?
      if field.aliases && !field.aliases.empty?
        extensions[:aliases] = field.aliases.sort
      end

      super.merge(extensions)
    end

    def add_logical_type(schema, serialized)
      if schema.logical_type == DECIMAL_LOGICAL_TYPE
        extensions = { logicalType: DECIMAL_LOGICAL_TYPE }
        extensions[:precision] = schema.precision if schema.respond_to?(:precision) && schema.precision
        extensions[:scale] = schema.scale if schema.respond_to?(:scale) && schema.scale
        serialized.merge(extensions)
      else
        serialized
      end
    end

    def normalize_named_type(schema, attributes = {})
      extensions = {}
      if schema.respond_to?(:default)
        # For enum defaults
        extensions[:default] = schema.default unless schema.default.nil?
      end

      aliases = schema.fullname_aliases
      extensions[:aliases] = aliases.sort unless aliases.empty?
      extensions = add_logical_type(schema, extensions)
      super.merge(extensions)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
avro-resolution_canonical_form-0.3.0 lib/avro/resolution_canonical_form.rb