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