class TreasureData::Schema

Attributes

fields[R]

@!attribute [r] fields

Public Class Methods

new(fields=[]) click to toggle source

@param [Array] fields

# File lib/td/client/model.rb, line 318
def initialize(fields=[])
  @fields = fields
  @names = {}
  @fields.each do |f|
    raise ArgumentError, "Column name '#{f.name}' is duplicated." if @names.key?(f.name)
    @names[f.name] = true
    if f.sql_alias && f.name != f.sql_alias
      raise ArgumentError, "SQL Column alias '#{f.sql_alias}' is duplicated." if @names.key?(f.sql_alias)
      @names[f.sql_alias] = true
    end
  end
end
parse(columns) click to toggle source

@param [String] columns @return [Schema]

# File lib/td/client/model.rb, line 306
def self.parse(columns)
  schema = Schema.new
  columns.each {|column|
    unless /\A(?<name>.*)(?::(?<type>[^:@]+))(?:@(?<sql_alias>[^:@]+))?\z/ =~ column
      raise ParameterValidationError, "type must be specified"
    end
    schema.add_field(name, type, sql_alias)
  }
  schema
end

Public Instance Methods

add_field(name, type, sql_alias=nil) click to toggle source

@param [String] name @param [String] type @return [Array]

# File lib/td/client/model.rb, line 337
def add_field(name, type, sql_alias=nil)
  if @names.key?(name)
    raise ParameterValidationError, "Column name '#{name}' is duplicated."
  end
  @names[name] = true
  if sql_alias && sql_alias != name && @names.key?(sql_alias)
    raise ParameterValidationError, "SQL Column alias '#{sql_alias}' is duplicated."
  end
  @names[sql_alias] = true
  @fields << Field.new(name, type, sql_alias)
end
from_json(obj) click to toggle source

@param [Object] obj @return [self]

# File lib/td/client/model.rb, line 370
def from_json(obj)
  @fields = obj.map {|f|
    Field.new(*f)
  }
  self
end
merge(schema) click to toggle source

@param [Schema] schema @return [Schema]

# File lib/td/client/model.rb, line 351
def merge(schema)
  nf = @fields.dup
  schema.fields.each {|f|
    if i = nf.find_index {|sf| sf.name == f.name }
      nf[i] = f
    else
      nf << f
    end
  }
  Schema.new(nf)
end
to_json(*args) click to toggle source

@return [Array<Field>]

# File lib/td/client/model.rb, line 364
def to_json(*args)
  @fields.map {|f| f.sql_alias ? [f.name, f.type, f.sql_alias] : [f.name, f.type] }.to_json(*args)
end