class Groonga::Client::Searcher::SchemaSynchronizer

Public Class Methods

new(schema, current_schema) click to toggle source
# File lib/groonga/client/searcher/schema_synchronizer.rb, line 21
def initialize(schema, current_schema)
  @schema = schema
  @current_schema = current_schema
end

Public Instance Methods

sync() click to toggle source
# File lib/groonga/client/searcher/schema_synchronizer.rb, line 26
def sync
  sync_table
  sync_columns
end

Private Instance Methods

create_index_column(column, lexicon_name, index_column_name) click to toggle source
# File lib/groonga/client/searcher/schema_synchronizer.rb, line 133
def create_index_column(column, lexicon_name, index_column_name)
  flags = "COLUMN_INDEX"
  flags += "|WITH_POSITION" if column.have_full_text_search_index?
  execute(:column_create,
          :table => lexicon_name,
          :name => index_column_name,
          :flags => flags,
          :type => @schema.table,
          :source => column.name)
end
decide_normalizer(custom_normalizer) click to toggle source
# File lib/groonga/client/searcher/schema_synchronizer.rb, line 166
def decide_normalizer(custom_normalizer)
  if custom_normalizer == false
    nil
  else
    custom_normalizer || "NormalizerAuto"
  end
end
execute(name, parameters) click to toggle source
# File lib/groonga/client/searcher/schema_synchronizer.rb, line 174
def execute(name, parameters)
  Client.open do |client|
    response = client.execute(name, parameters)
    unless response.success?
      raise Client::Request::ErrorResponse.new(response)
    end
    response
  end
end
find_current_columns() click to toggle source
# File lib/groonga/client/searcher/schema_synchronizer.rb, line 157
def find_current_columns
  current_table = find_current_table
  if current_table.nil?
    {}
  else
    current_table.columns
  end
end
find_current_table() click to toggle source
# File lib/groonga/client/searcher/schema_synchronizer.rb, line 153
def find_current_table
  @current_schema.tables[@schema.table]
end
generate_lexicon_name(column) click to toggle source
# File lib/groonga/client/searcher/schema_synchronizer.rb, line 188
def generate_lexicon_name(column)
  "lexicon_#{@schema.table}_#{column.name}"
end
generate_reference_table_name(column) click to toggle source
# File lib/groonga/client/searcher/schema_synchronizer.rb, line 184
def generate_reference_table_name(column)
  "reference_#{@schema.table}_#{column.name}"
end
remove_indexes(current_column) click to toggle source
# File lib/groonga/client/searcher/schema_synchronizer.rb, line 144
def remove_indexes(current_column)
  return if current_column.nil?
  current_column.indexes.each do |index|
    execute(:column_remove,
            :table => index.table.name,
            :name => index.name)
  end
end
sync_column(column, current_column) click to toggle source
# File lib/groonga/client/searcher/schema_synchronizer.rb, line 49
def sync_column(column, current_column)
  if current_column.nil?
    flags = []
    if column.vector?
      flags << "COLUMN_VECTOR"
    else
      flags << "COLUMN_SCALAR"
    end
    if column.reference?
      reference_table_name = generate_reference_table_name(column)
      sync_reference_table(column, reference_table_name)
      type = reference_table_name
    else
      type = column.type
    end
    execute(:column_create,
            :table => @schema.table,
            :name => column.name,
            :type => type,
            :flags => flags.join("|"))
  end

  sync_column_index(column, current_column)
end
sync_column_index(column, current_column) click to toggle source
# File lib/groonga/client/searcher/schema_synchronizer.rb, line 88
def sync_column_index(column, current_column)
  if column.have_index?
    if column.reference?
      lexicon_name = generate_reference_table_name(column)
    else
      lexicon_name = generate_lexicon_name(column)
    end
    index_column_name = "index"
    if current_column
      indexes = current_column.indexes
    else
      indexes = []
    end
    indexes.each do |index|
      return if index.full_name == "#{lexicon_name}.#{index_column_name}"
    end
    sync_lexicon(column, lexicon_name) unless column.reference?
    create_index_column(column, lexicon_name, index_column_name)
  else
    remove_indexes(current_column)
  end
end
sync_columns() click to toggle source
# File lib/groonga/client/searcher/schema_synchronizer.rb, line 42
def sync_columns
  current_columns = find_current_columns
  @schema.columns.each do |_, column|
    sync_column(column, current_columns[column.name])
  end
end
sync_lexicon(column, lexicon_name) click to toggle source
# File lib/groonga/client/searcher/schema_synchronizer.rb, line 111
def sync_lexicon(column, lexicon_name)
  return if @current_schema.tables[lexicon_name]

  parameters = {
    :name => lexicon_name,
    :flags => "TABLE_PAT_KEY",
  }
  if column.have_full_text_search_index?
    parameters[:key_type] = "ShortText"
    parameters[:default_tokenizer] = "TokenBigram"
    parameters[:normalizer] = decide_normalizer(column.normalizer)
  elsif column.reference?
    parameters[:key_type] = generate_reference_table_name(column)
  else
    parameters[:key_type] = column.type
    if column.text_family_type?
      parameters[:normalizer] = decide_normalizer(column.normalizer)
    end
  end
  execute(:table_create, parameters)
end
sync_reference_table(column, reference_table_name) click to toggle source
# File lib/groonga/client/searcher/schema_synchronizer.rb, line 74
def sync_reference_table(column, reference_table_name)
  return if @current_schema.tables[reference_table_name]

  parameters = {
    :name => reference_table_name,
    :flags => "TABLE_PAT_KEY",
  }
  parameters[:key_type] = column.type
  if column.text_family_type?
    parameters[:normalizer] = decide_normalizer(column.normalizer)
  end
  execute(:table_create, parameters)
end
sync_table() click to toggle source
# File lib/groonga/client/searcher/schema_synchronizer.rb, line 32
def sync_table
  current_table = find_current_table
  return if current_table # TODO: validation

  execute(:table_create,
          :name => @schema.table,
          :flags => "TABLE_PAT_KEY",
          :key_type => "ShortText")
end