Class: ClickHouse::Client::Formatter

Inherits:
Object
  • Object
show all
Defined in:
lib/click_house/client/formatter.rb

Constant Summary collapse

DEFAULT =
->(value) { value }
BASIC_TYPE_CASTERS =
{
  'UInt8' => ->(value) { Integer(value) },
  'Int32' => ->(value) { Integer(value) },
  'UInt32' => ->(value) { Integer(value) },
  'Int64' => ->(value) { Integer(value) },
  'UInt64' => ->(value) { Integer(value) },
  'Float32' => ->(value) { Float(value) },
  'Float64' => ->(value) { Float(value) },
  "DateTime64(6, 'UTC')" => ->(value) { ActiveSupport::TimeZone['UTC'].parse(value) },
  "DateTime64(3, 'UTC')" => ->(value) { ActiveSupport::TimeZone['UTC'].parse(value) },
  "DateTime64(0, 'UTC')" => ->(value) { ActiveSupport::TimeZone['UTC'].parse(value) },
  "DateTime('UTC')" => ->(value) { ActiveSupport::TimeZone['UTC'].parse(value) },
  "Date" => ->(value) { Date.parse(value) },
  "Date32" => ->(value) { Date.parse(value) },
  "IntervalSecond" => ->(value) { ActiveSupport::Duration.build(value.to_i) },
  "IntervalMillisecond" => ->(value) { ActiveSupport::Duration.build(value.to_i / 1000.0) }
}.freeze
TYPE_CASTERS =
BASIC_TYPE_CASTERS.merge(
  BASIC_TYPE_CASTERS.transform_keys { |type| "Nullable(#{type})" }
).merge(
  BASIC_TYPE_CASTERS.transform_keys { |type| "LowCardinality(#{type})" }
)

Class Method Summary collapse

Class Method Details

.format(result) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
# File 'lib/click_house/client/formatter.rb', line 32

def self.format(result)
  column_typecasters = result['meta'].each_with_object({}) do |column, hash|
    hash[column['name']] = TYPE_CASTERS.fetch(column['type'], DEFAULT)
  end

  result['data'].map do |row|
    row.each_with_object({}) do |(column, value), casted_row|
      casted_row[column] = value.nil? ? value : column_typecasters[column].call(value)
    end
  end
end