class Groonga::Client::CommandLine::GroongaClientIndexCheck::Checker

Public Class Methods

new(client, methods, target_names) click to toggle source
Calls superclass method
# File lib/groonga/client/command-line/groonga-client-index-check.rb, line 72
def initialize(client, methods, target_names)
  super(client)
  @methods = methods
  @target_names = target_names
end

Private Instance Methods

check_content(index_column) click to toggle source
# File lib/groonga/client/command-line/groonga-client-index-check.rb, line 161
def check_content(index_column)
  return if index_column.source.empty?

  lexicon_name = index_column.domain
  index_column_name = index_column.name
  suffix = Time.now.strftime("%Y%m%d%H%M%S_%N")
  new_index_column_name = "#{index_column_name}_#{suffix}"
  full_index_column_name = index_column.full_name
  full_new_index_column_name = "#{full_index_column_name}_#{suffix}"
  source_table = index_column.range
  column_create_similar(lexicon_name,
                        new_index_column_name,
                        index_column_name)
  begin
    response = select(lexicon_name,
                      :limit => "-1",
                      :output_columns => "_key")
    response.records.each do |record|
      token = record["_key"]
      unless valid_token?(source_table,
                          full_index_column_name,
                          full_new_index_column_name,
                          token)
        token = token.to_f if token.is_a?(Time)
        $stderr.puts("Broken: #{index_column.full_name}: <#{token}>")
        return false
      end
    end
    true
  ensure
    column_remove(lexicon_name, new_index_column_name)
  end
end
check_source(column) click to toggle source
# File lib/groonga/client/command-line/groonga-client-index-check.rb, line 125
def check_source(column)
  return true unless column.source.empty?
  $stderr.puts("Source is missing: <#{column.full_name}>")
  false
end
each_target_index_column() { |column| ... } click to toggle source
# File lib/groonga/client/command-line/groonga-client-index-check.rb, line 91
def each_target_index_column
  table_list.each do |table|
    next unless target_table?(table)
    column_list(table.name).each do |column|
      next unless column.index?
      next unless target_column?(column)
      yield(column)
    end
  end
end
run_internal() click to toggle source
# File lib/groonga/client/command-line/groonga-client-index-check.rb, line 79
def run_internal
  succeeded = true
  each_target_index_column do |index_column|
    @methods.each do |method|
      unless __send__("check_#{method}", index_column)
        succeeded = false
      end
    end
  end
  succeeded
end
target_column?(column) click to toggle source
# File lib/groonga/client/command-line/groonga-client-index-check.rb, line 114
def target_column?(column)
  return true if @target_names.empty?
  @target_names.any? do |name|
    if name.include?(".")
      name == column.full_name
    else
      name == column.domain
    end
  end
end
target_table?(table) click to toggle source
# File lib/groonga/client/command-line/groonga-client-index-check.rb, line 102
def target_table?(table)
  return true if @target_names.empty?
  @target_names.any? do |name|
    if name.include?(".")
      index_table_name = name.split(".").first
      index_table_name == table.name
    else
      name == table.name
    end
  end
end
valid_token?(source_table_name, full_index_column_name1, full_index_column_name2, token) click to toggle source
# File lib/groonga/client/command-line/groonga-client-index-check.rb, line 131
def valid_token?(source_table_name,
                 full_index_column_name1,
                 full_index_column_name2,
                 token)
  case token
  when String
    value = Groonga::Client::ScriptSyntax.format_string(token)
  when Time
    if token.usec.zero?
      value = token.to_i
    else
      value = token.strftime("%Y-%m-%d %H:%M:%S.%6N")
      value = Groonga::Client::ScriptSyntax.format_string(value)
    end
  else
    value = token
  end
  response1 = select(source_table_name,
                     :filter => "#{full_index_column_name1} @ #{value}",
                     :output_columns => "_id",
                     :limit => "-1",
                     :sort_keys => "_id")
  response2 = select(source_table_name,
                     :filter => "#{full_index_column_name2} @ #{value}",
                     :output_columns => "_id",
                     :limit => "-1",
                     :sort_keys => "_id")
  response1.records == response2.records
end