Sha256: 16ea2e208ff7ebe49aefa167414ad17dcb93c7af1aa44e88cb70ac0517f1f23b

Contents?: true

Size: 1.89 KB

Versions: 14

Compression:

Stored size: 1.89 KB

Contents

# frozen_string_literal: true

require 'rom/sql/type_extensions'

module ROM
  module SQL
    module Postgres
      module Types
        # @api private
        class ArrayTypes
          attr_reader :elements

          attr_reader :constructor

          attr_reader :base_write_type

          attr_reader :base_read_type

          def initialize(base_write_type, base_read_type)
            @elements = {}
            @base_write_type = base_write_type
            @base_read_type = base_read_type
            @constructor = proc { |db_type, member|
              if member
                -> arr { Sequel.pg_array(arr.map { |v| member[v] }, db_type) }
              else
                -> arr { Sequel.pg_array(arr, db_type) }
              end
            }
          end

          def [](db_type, member_type = nil)
            elements.fetch(db_type) do
              name = "#{db_type}[]"

              write_type = build_write_type(db_type, member_type)
              read_type = build_read_type(db_type, member_type)

              array_type = Types.Type(name, write_type).meta(type: db_type, read: read_type)

              register_extension(array_type)

              elements[db_type] = array_type
            end
          end

          private

          def build_write_type(db_type, member_type)
            if member_type
              base_write_type.constructor(constructor[db_type, member_type])
            else
              base_write_type.constructor(constructor[db_type])
            end
          end

          def build_read_type(_db_type, member_type)
            if member_type && member_type.meta[:read]
              base_read_type.of(member_type.meta[:read])
            else
              base_read_type
            end
          end

          def register_extension(type)
            TypeExtensions.register(type) { include ArrayMethods }
          end
        end
      end
    end
  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
rom-sql-3.7.0 lib/rom/sql/extensions/postgres/types/array_types.rb
rom-sql-3.6.5 lib/rom/sql/extensions/postgres/types/array_types.rb
rom-sql-3.6.4 lib/rom/sql/extensions/postgres/types/array_types.rb
rom-sql-3.6.3 lib/rom/sql/extensions/postgres/types/array_types.rb
rom-sql-3.6.2 lib/rom/sql/extensions/postgres/types/array_types.rb
rom-sql-3.6.1 lib/rom/sql/extensions/postgres/types/array_types.rb
rom-sql-3.6.0 lib/rom/sql/extensions/postgres/types/array_types.rb
rom-sql-3.5.0 lib/rom/sql/extensions/postgres/types/array_types.rb
rom-sql-3.4.0 lib/rom/sql/extensions/postgres/types/array_types.rb
rom-sql-3.3.3 lib/rom/sql/extensions/postgres/types/array_types.rb
rom-sql-3.3.2 lib/rom/sql/extensions/postgres/types/array_types.rb
rom-sql-3.3.1 lib/rom/sql/extensions/postgres/types/array_types.rb
rom-sql-3.3.0 lib/rom/sql/extensions/postgres/types/array_types.rb
rom-sql-3.2.0 lib/rom/sql/extensions/postgres/types/array_types.rb