Class: TreasureData::Schema

Inherits:
Object
  • Object
show all
Defined in:
lib/td/client/model.rb

Defined Under Namespace

Classes: Field

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(fields = []) ⇒ Schema

Returns a new instance of Schema.

Parameters:

  • fields (Array) (defaults to: [])


317
318
319
320
321
322
323
324
325
326
327
328
# File 'lib/td/client/model.rb', line 317

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
      raise ArgumentError, "SQL Column alias '#{f.sql_alias}' is duplicated." if @names.key?(f.sql_alias)
      @names[f.sql_alias] = true
    end
  end
end

Instance Attribute Details

#fieldsObject (readonly)

Returns the value of attribute fields.



331
332
333
# File 'lib/td/client/model.rb', line 331

def fields
  @fields
end

Class Method Details

.parse(columns) ⇒ Schema

Parameters:

  • columns (String)

Returns:



305
306
307
308
309
310
311
312
313
314
# File 'lib/td/client/model.rb', line 305

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

Instance Method Details

#add_field(name, type, sql_alias = nil) ⇒ Array

Parameters:

  • name (String)
  • type (String)

Returns:

  • (Array)


336
337
338
339
340
341
342
343
344
345
346
# File 'lib/td/client/model.rb', line 336

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 && @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) ⇒ self

Parameters:

  • obj (Object)

Returns:

  • (self)


369
370
371
372
373
374
# File 'lib/td/client/model.rb', line 369

def from_json(obj)
  @fields = obj.map {|f|
    Field.new(*f)
  }
  self
end

#merge(schema) ⇒ Schema

Parameters:

Returns:



350
351
352
353
354
355
356
357
358
359
360
# File 'lib/td/client/model.rb', line 350

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) ⇒ Array<Field>

Returns:



363
364
365
# File 'lib/td/client/model.rb', line 363

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