class Egis::TableDDLGenerator

@!visibility private

Public Instance Methods

create_table_sql(table, permissive: false) click to toggle source
# File lib/egis/table_ddl_generator.rb, line 6
    def create_table_sql(table, permissive: false)
      <<~SQL
        CREATE EXTERNAL TABLE #{permissive_statement(permissive)}#{table.name} (
          #{column_definition_sql(table.schema.columns)}
        )
        #{partition_statement(table.schema)}
        #{row_format_statement(table.format)}
        LOCATION '#{table.location}';
      SQL
    end

Private Instance Methods

column_definition_sql(columns) click to toggle source
# File lib/egis/table_ddl_generator.rb, line 33
def column_definition_sql(columns)
  columns.map { |column| "`#{column.name}` #{column.type}" }.join(",\n")
end
delimited_row_format_statement(format) click to toggle source
# File lib/egis/table_ddl_generator.rb, line 60
def delimited_row_format_statement(format)
  case format
  when :csv
    "ROW FORMAT DELIMITED FIELDS TERMINATED BY ','"
  when :tsv
    "ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t'"
  when :orc
    'STORED AS ORC'
  else
    raise Errors::UnsupportedTableFormat, format.to_s
  end
end
partition_statement(table_schema) click to toggle source
# File lib/egis/table_ddl_generator.rb, line 23
    def partition_statement(table_schema)
      return if table_schema.partitions.empty?

      <<~SQL
        PARTITIONED BY (
          #{column_definition_sql(table_schema.partitions)}
        )
      SQL
    end
permissive_statement(permissive_flag) click to toggle source
# File lib/egis/table_ddl_generator.rb, line 19
def permissive_statement(permissive_flag)
  'IF NOT EXISTS ' if permissive_flag
end
row_format_statement(format) click to toggle source
# File lib/egis/table_ddl_generator.rb, line 41
def row_format_statement(format)
  return serde_row_format_statement(format) if serde?(format)

  delimited_row_format_statement(format)
end
serde?(format) click to toggle source
# File lib/egis/table_ddl_generator.rb, line 37
def serde?(format)
  format.is_a?(Hash) && format.key?(:serde)
end
serde_row_format_statement(format) click to toggle source
# File lib/egis/table_ddl_generator.rb, line 47
    def serde_row_format_statement(format)
      row_format = "ROW FORMAT SERDE '#{format[:serde]}'"
      return row_format unless format.key?(:serde_properties)

      serde_properties = format[:serde_properties].map { |property, value| "'#{property}' = '#{value}'" }
      <<-SQL
        #{row_format}
        WITH SERDEPROPERTIES (
          #{serde_properties.join(",\n")}
        )
      SQL
    end