class Groonga::Client::CommandLine::GroongaClientIndexRecreate::Recreator
Public Class Methods
new(client, interval, target_indexes)
click to toggle source
Calls superclass method
# File lib/groonga/client/command-line/groonga-client-index-recreate.rb, line 76 def initialize(client, interval, target_indexes) super(client) @interval = interval @target_indexes = target_indexes @now = Time.now end
Private Instance Methods
ensure_alias_column()
click to toggle source
# File lib/groonga/client/command-line/groonga-client-index-recreate.rb, line 126 def ensure_alias_column alias_column = config_get("alias.column") if alias_column.empty? table = "Aliases" column = "real_name" alias_column = "#{table}.#{column}" unless object_exist?(table) execute_command(:table_create, :name => table, :flags => "TABLE_HASH_KEY", :key_type => "ShortText") end unless object_exist?(alias_column) execute_command(:column_create, :table => table, :name => column, :flags => "COLUMN_SCALAR", :type => "ShortText") end config_set("alias.column", alias_column) end alias_column end
generate_revision()
click to toggle source
# File lib/groonga/client/command-line/groonga-client-index-recreate.rb, line 199 def generate_revision case @interval when :day @now.strftime("%Y%m%d") else abort_run("Unsupported revision: #{@interval}") end end
recreate_index(full_index_name, alias_column)
click to toggle source
# File lib/groonga/client/command-line/groonga-client-index-recreate.rb, line 150 def recreate_index(full_index_name, alias_column) revision = generate_revision table_name, index_name = full_index_name.split(".", 2) real_index_name = "#{index_name}_#{revision}" real_full_index_name = "#{table_name}.#{real_index_name}" if object_exist?(full_index_name) set_alias(alias_column, full_index_name, real_full_index_name) column_rename(table_name, index_name, real_index_name) nil elsif object_exist?(real_full_index_name) nil else full_current_index_name = resolve_alias(alias_column, full_index_name) current_table_name, current_index_name = full_current_index_name.split(".", 2) if current_table_name != table_name abort_run("Different lexicon isn't supported: " + "<#{full_index_name}> -> <#{full_current_index_name}>") end if current_index_name == real_index_name abort_run("Alias doesn't specify real index column: " + "<#{full_current_index_name}>") end column_create_similar(table_name, real_index_name, current_index_name) set_alias(alias_column, full_index_name, real_full_index_name) full_current_index_name end end
remove_old_indexes(full_base_index_name, full_current_index_name)
click to toggle source
# File lib/groonga/client/command-line/groonga-client-index-recreate.rb, line 182 def remove_old_indexes(full_base_index_name, full_current_index_name) return if full_current_index_name.nil? table_name, base_index_name = full_base_index_name.split(".", 2) _, current_index_name = full_current_index_name.split(".", 2) target_index_columns = column_list(table_name).find_all do |column| column.name.start_with?("#{base_index_name}_") and column.index? end target_index_columns.collect(&:name).sort.each do |index_name| next unless /_(\d{4})(\d{2})(\d{2})\z/ =~ index_name next if index_name >= current_index_name column_remove(table_name, index_name) end end
resolve_alias(alias_column, key)
click to toggle source
# File lib/groonga/client/command-line/groonga-client-index-recreate.rb, line 116 def resolve_alias(alias_column, key) table, column = alias_column.split(".", 2) filter = "_key == #{ScriptSyntax.format_string(key)}" response = select(table, :filter => filter, :output_columns => column) return nil if response.n_hits.zero? response.records.first[column] end
run_internal() { || ... }
click to toggle source
# File lib/groonga/client/command-line/groonga-client-index-recreate.rb, line 84 def run_internal alias_column = ensure_alias_column @target_indexes.each do |index| current_index = recreate_index(index, alias_column) remove_old_indexes(index, current_index) end yield if block_given? true end
set_alias(alias_column, alias_name, real_name)
click to toggle source
# File lib/groonga/client/command-line/groonga-client-index-recreate.rb, line 94 def set_alias(alias_column, alias_name, real_name) table, column = alias_column.split(".", 2) values = [ { "_key" => alias_name, column => real_name, }, ] response = execute_command(:load, :table => table, :values => JSON.generate(values), :command_version => "3", :output_errors => "yes") response.errors.each do |error| unless error.return_code.zero? abort_run("Failed to set alias: " + "<#{alias_name}> -> <#{real_name}>: " + "#{error.message}(#{error.return_code})") end end end