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