class GroongaClientModel::Migration

Attributes

client[R]
output[RW]

Public Class Methods

new(client) click to toggle source
# File lib/groonga_client_model/migration.rb, line 51
def initialize(client)
  @client = client
  @output = nil
  @reverting = false
  @pending_actions = []
end

Public Instance Methods

add_column(table_name, column_name, value_type, flags: nil, type: nil, sources: nil, source: nil) click to toggle source
# File lib/groonga_client_model/migration.rb, line 140
def add_column(table_name, column_name, value_type,
               flags: nil,
               type: nil,
               sources: nil,
               source: nil)
  if @reverting
    @pending_actions << [:remove_column, table_name, column_name]
    return
  end

  value_type = normalize_type(value_type)
  type = normalize_column_type(type || :scalar)
  sources ||= source || []
  flags = Array(flags) | [type]
  if type == "COLUMN_INDEX"
    schema = GroongaClientModel::Schema.new
    case schema.tables[table_name].tokenizer
    when nil, "TokenDelimit"
      # do nothing
    else
      flags |= ["WITH_POSITION"]
    end
    if sources.size > 1
      flags |= ["WITH_SECTION"]
    end
  end
  options = {
    flags: flags,
    value_type: value_type,
  }
  options[:sources] = sources unless sources.blank?
  report(__method__, [table_name, column_name, options]) do
    @client.request(:column_create).
      parameter(:table, table_name).
      parameter(:name, column_name).
      flags_parameter(:flags, flags).
      parameter(:type, value_type).
      values_parameter(:source, sources).
      response
  end
end
add_index(table_name, source_table_name, source_column_names, **options) click to toggle source
# File lib/groonga_client_model/migration.rb, line 242
def add_index(table_name, source_table_name, source_column_names, **options)
  source_column_names = Array(source_column_names)
  column_name = options.delete(:name)
  column_name ||= [source_table_name, *source_column_names].join("_")
  add_column(table_name,
             column_name,
             source_table_name,
             **options.merge(:type => :index,
                             :sources => source_column_names))
end
add_timestamp_columns(table_name) click to toggle source
# File lib/groonga_client_model/migration.rb, line 212
def add_timestamp_columns(table_name)
  add_column(table_name, :created_at, :time)
  add_column(table_name, :updated_at, :time)
end
copy_column(from_full_column_name, to_full_column_name) click to toggle source
# File lib/groonga_client_model/migration.rb, line 222
def copy_column(from_full_column_name,
                to_full_column_name)
  if @reverting
    message = "can't revert copy_column"
    message << "(#{from_full_column_name}, #{to_full_column_name})"
    raise IrreversibleMigrationError, message
  end

  from_table_name, from_column_name = from_full_column_name.split(".", 2)
  to_table_name, to_column_name = to_full_column_name.split(".", 2)
  report(__method__, [from_full_column_name, to_full_column_name]) do
    @client.request(:column_copy).
      parameter(:from_table, from_table_name).
      parameter(:from_name, from_column_name).
      parameter(:to_table, to_table_name).
      parameter(:to_name, to_column_name).
      response
  end
end
copy_table(from_table_name, to_table_name) click to toggle source
# File lib/groonga_client_model/migration.rb, line 126
def copy_table(from_table_name, to_table_name)
  if @reverting
    message = "can't revert copy_table(#{from_table_name}, #{to_table_name})"
    raise IrreversibleMigrationError, message
  end

  report(__method__, [from_table_name, to_table_name]) do
    @client.request(:table_copy).
      parameter(:from_name, from_table_name).
      parameter(:to_name, to_table_name).
      response
  end
end
create_table(name, type: nil, key_type: nil, tokenizer: nil, default_tokenizer: nil, normalizer: nil, propose: nil) { |create_table_migration| ... } click to toggle source
# File lib/groonga_client_model/migration.rb, line 68
def create_table(name,
                 type: nil,
                 key_type: nil,
                 tokenizer: nil,
                 default_tokenizer: nil,
                 normalizer: nil,
                 propose: nil)
  if @reverting
    @pending_actions << [:remove_table, name]
    return
  end

  case propose
  when :full_text_search
    type ||= :patricia_trie
    tokenizer ||= :bigram
    normalizer ||= :auto
  end

  type = normalize_table_type(type || :array)
  if type != "TABLE_NO_KEY" and key_type.nil?
    key_type ||= "ShortText"
  end
  key_type = normalize_type(key_type)
  if type != "TABLE_NO_KEY" and key_type == "ShortText"
    tokenizer ||= default_tokenizer
    tokenizer = normalize_tokenizer(tokenizer)
    normalizer = normalize_normalizer(normalizer)
  end
  options = {type: type}
  options[:key_type] = key_type if key_type
  options[:tokenizer] = tokenizer if tokenizer
  options[:normalizer] = normalizer if normalizer
  report(__method__, [name, options]) do
    @client.request(:table_create).
      parameter(:name, name).
      flags_parameter(:flags, [type]).
      parameter(:key_type, key_type).
      parameter(:default_tokenizer, tokenizer).
      parameter(:normalizer, normalizer).
      response
  end

  yield(CreateTableMigration.new(self, name)) if block_given?
end
delete_config(key) click to toggle source
# File lib/groonga_client_model/migration.rb, line 267
def delete_config(key)
  if @reverting
    message = "can't revert delete_config(#{key.inspect})"
    raise IrreversibleMigrationError, message
  end

  report(__method__, [key]) do
    @client.request(:config_delete).
      parameter(:key, key).
      response
  end
end
down() click to toggle source
# File lib/groonga_client_model/migration.rb, line 62
def down
  revert do
    change
  end
end
exist?(name) click to toggle source
# File lib/groonga_client_model/migration.rb, line 303
def exist?(name)
  @client.request(:object_exist).
    parameter(:name, name).
    response.
    body
end
load(table_name, values, options={}) click to toggle source
# File lib/groonga_client_model/migration.rb, line 280
def load(table_name, values, options={})
  if @reverting
    message = "can't revert load(#{table_name.inspect})"
    raise IrreversibleMigrationError, message
  end

  case values
  when Hash
    json_values = [values].to_json
  when Array
    json_values = values.to_json
  else
    json_values = values
  end
  report(__method__, [table_name]) do
    @client.request(:load).
      parameter(:table, table_name).
      values_parameter(:columns, options[:columns]).
      parameter(:values, json_values).
      response
  end
end
remove_column(table_name, column_name) click to toggle source
# File lib/groonga_client_model/migration.rb, line 198
def remove_column(table_name, column_name)
  if @reverting
    message = "can't revert remove_column(#{table_name}, #{column_name})"
    raise IrreversibleMigrationError, message
  end

  report(__method__, [table_name, column_name]) do
    @client.request(:column_remove).
      parameter(:table, table_name).
      parameter(:name, column_name).
      response
  end
end
remove_table(name) click to toggle source
# File lib/groonga_client_model/migration.rb, line 114
def remove_table(name)
  if @reverting
    raise IrreversibleMigrationError, "can't revert remove_table(#{name})"
  end

  report(__method__, [name]) do
    @client.request(:table_remove).
      parameter(:name, name).
      response
  end
end
remove_timestamp_columns(table_name) click to toggle source
# File lib/groonga_client_model/migration.rb, line 217
def remove_timestamp_columns(table_name)
  remove_column(table_name, :updated_at)
  remove_column(table_name, :created_at)
end
rename_column(table_name, old_column_name, new_column_name) click to toggle source
# File lib/groonga_client_model/migration.rb, line 182
def rename_column(table_name,
                  old_column_name, new_column_name)
  if @reverting
    @pending_actions << [:rename_column, table_name, new_column_name, old_column_name]
    return
  end

  report(__method__, [table_name, old_column_name, new_column_name]) do
    @client.request(:column_rename).
      parameter(:table, table_name).
      parameter(:name, old_column_name).
      parameter(:new_name, new_column_name).
      response
  end
end
reverting?() click to toggle source
# File lib/groonga_client_model/migration.rb, line 310
def reverting?
  @reverting
end
set_config(key, value) click to toggle source
# File lib/groonga_client_model/migration.rb, line 253
def set_config(key, value)
  if @reverting
    message = "can't revert set_config(#{key.inspect}, #{value.inspect})"
    raise IrreversibleMigrationError, message
  end

  report(__method__, [key, value]) do
    @client.request(:config_set).
      parameter(:key, key).
      parameter(:value, value).
      response
  end
end
up() click to toggle source
# File lib/groonga_client_model/migration.rb, line 58
def up
  change
end

Private Instance Methods

normalize_column_type(type) click to toggle source
# File lib/groonga_client_model/migration.rb, line 364
def normalize_column_type(type)
  case type.to_s
  when "scalar", /\A(?:COLUMN_)?SCALAR\z/i
    "COLUMN_SCALAR"
  when "vector", /\A(?:COLUMN_)?VECTOR\z/i
    "COLUMN_VECTOR"
  when "index", /\A(?:COLUMN_)?INDEX\z/i
    "COLUMN_INDEX"
  else
    message = "column type must be one of "
    message << "[:scalar, :vector, :index]: #{type.inspect}"
    raise ArgumentError, message
  end
end
normalize_normalizer(normalizer) click to toggle source
# File lib/groonga_client_model/migration.rb, line 419
def normalize_normalizer(normalizer)
  case normalizer.to_s
  when /\A(?:normalizer_?)?auto\z/i
    "NormalizerAuto"
  else
    normalizer
  end
end
normalize_table_type(type) click to toggle source
# File lib/groonga_client_model/migration.rb, line 346
def normalize_table_type(type)
  case type.to_s
  when "array", /\A(?:TABLE_)?NO_KEY\z/i
    "TABLE_NO_KEY"
  when "hash", "hash_table", /\A(?:TABLE_)?HASH_KEY\z/i
    "TABLE_HASH_KEY"
  when "pat", "patricia_trie", /\A(?:TABLE_)?PAT_KEY\z/i
    "TABLE_PAT_KEY"
  when "dat", "double_array_trie", /\A(?:TABLE_)?DAT_KEY\z/i
    "TABLE_DAT_KEY"
  else
    message = "table type must be one of "
    message << "[:array, :hash_table, :patricia_trie, :double_array_trie]: "
    message << "#{type.inspect}"
    raise ArgumentError, message
  end
end
normalize_tokenizer(tokenizer) click to toggle source
# File lib/groonga_client_model/migration.rb, line 406
def normalize_tokenizer(tokenizer)
  case tokenizer.to_s
  when /\A(?:token_?)?bigram\z/i
    "TokenBigram"
  when /\A(?:token_?)?delimit\z/i
    "TokenDelimit"
  when /\A(?:token_?)?mecab\z/i
    "TokenMecab"
  else
    tokenizer
  end
end
normalize_type(type) click to toggle source
# File lib/groonga_client_model/migration.rb, line 379
def normalize_type(type)
  case type.to_s
  when /\Abool(?:ean)?\z/i
    "Bool"
  when /\Aint(8|16|32|64)\z/i
    "Int#{$1}"
  when /\Auint(8|16|32|64)\z/i
    "UInt#{$1}"
  when /\Afloat\z/i
    "Float"
  when /\Atime\z/i
    "Time"
  when /\Ashort_?text\z/i
    "ShortText"
  when /\Atext\z/i
    "Text"
  when /\Along_?text\z/i
    "LongText"
  when /\Atokyo_?geo_?point\z/i
    "TokyoGeoPoint"
  when /\A(?:wgs84)?_?geo_?point\z/i
    "WGS84GeoPoint"
  else
    type
  end
end
puts(*args) click to toggle source
Calls superclass method
# File lib/groonga_client_model/migration.rb, line 315
def puts(*args)
  if @output
    @output.puts(*args)
  else
    super
  end
end
report(method_name, arguments) { || ... } click to toggle source
# File lib/groonga_client_model/migration.rb, line 323
def report(method_name, arguments)
  argument_list = arguments.collect(&:inspect).join(", ")
  puts("-- #{method_name}(#{argument_list})")
  time = Benchmark.measure do
    yield
  end
  puts("   -> %.4fs" % time.real)
end
revert() { || ... } click to toggle source
# File lib/groonga_client_model/migration.rb, line 332
def revert
  @pending_actions.clear
  @reverting = true
  begin
    yield
  ensure
    @reverting = false
  end
  @pending_actions.reverse_each do |action|
    public_send(*action)
  end
  @pending_actions.clear
end