class Groonga::DatabaseViewerGtk::Table

Constants

ID_COLUMN_INDEX
KEY_COLUMN_INDEX

Attributes

grn_table[R]
updated[R]

Public Class Methods

new(grn_table, db_path, options={}) click to toggle source
Calls superclass method
# File lib/groonga/database-viewer-gtk/table.rb, line 31
def initialize(grn_table, db_path, options={})
  super()
  @grn_table = grn_table
  @tooltip_column_index = @grn_table.columns.size + 2
  @wrap_width = options[:wrap_width]
  @db_path = db_path
  @updated = false
  @threads = []
  signal_connect("destroy") do
    @threads.each do |thread|
      thread.kill
    end
  end
  create_tree_view
end

Public Instance Methods

create_column(name, index) click to toggle source
# File lib/groonga/database-viewer-gtk/table.rb, line 68
def create_column(name, index)
  gtk_column = Gtk::TreeViewColumn.new
  gtk_column.title = name.gsub(/_/, "__")
  gtk_column.resizable = true
  gtk_column.set_sort_column_id(index)
  append_column(gtk_column)

  renderer = Gtk::CellRendererText.new
  renderer.wrap_width = @wrap_width if @wrap_width
  gtk_column.pack_start(renderer, :expand => false)
  gtk_column.add_attribute(renderer, :text, index)
end
create_tree_view() click to toggle source
# File lib/groonga/database-viewer-gtk/table.rb, line 57
def create_tree_view
  self.rules_hint = true

  create_column("_id", ID_COLUMN_INDEX)
  create_column("_key", KEY_COLUMN_INDEX)

  @grn_table.columns.each_with_index do |grn_column, i|
    create_column(grn_column.local_name, i + 2)
  end
end
each_records(limit, query=nil) { |grn_record| ... } click to toggle source
# File lib/groonga/database-viewer-gtk/table.rb, line 136
def each_records(limit, query=nil)
  grn_records = Groonga[@grn_table.name]
  if query
    grn_records = grn_records.select(query)
  end
  if block_given?
    grn_records.take(limit).each do |grn_record|
      yield(grn_record)
    end
  else
    grn_records.take(limit)
  end
end
load_record(model, grn_record) click to toggle source
# File lib/groonga/database-viewer-gtk/table.rb, line 109
def load_record(model, grn_record)
  tooltips = {}
  iter = model.append
  iter.set_value(ID_COLUMN_INDEX, grn_record._id)
  tooltips["_id"] = grn_record._id
  if grn_record.respond_to?(:_key)
    key = grn_record._key.to_s
    iter.set_value(KEY_COLUMN_INDEX, key)
    tooltips["_key"] = key
  end
  @grn_table.columns.each_with_index do |grn_column, i|
    value = nil
    if grn_column.index?
      ids = grn_column.search(grn_record._id).records.collect {|record| record._id}
      value = "#{ids.size}, #{ids.to_s}"
    else
      value = grn_record[grn_column.local_name].to_s
    end
    tooltips[grn_column.local_name] = value
    iter.set_value(2 + i, value)
    GC.start if i % 100 == 0
  end
  tooltip_json = tooltips.to_json
  escaped_tooltip_json = CGI.escapeHTML(tooltip_json)
  iter.set_value(@tooltip_column_index, escaped_tooltip_json)
end
selected_iter() click to toggle source
# File lib/groonga/database-viewer-gtk/table.rb, line 53
def selected_iter
  selection.selected
end
selected_text() click to toggle source
# File lib/groonga/database-viewer-gtk/table.rb, line 47
def selected_text
  return nil unless selected_iter
  escaped_text = selected_iter.get_value(@tooltip_column_index)
  CGI.unescapeHTML(escaped_text)
end
update_model(limit, query=nil) click to toggle source
# File lib/groonga/database-viewer-gtk/table.rb, line 81
def update_model(limit, query=nil)
  @threads.reject! do |thread|
    thread.kill
    true
  end

  column_types = @grn_table.columns.collect do |column|
                   # TODO
                   String
                 end
  column_types.unshift(String)   # _key
  column_types.unshift(Integer)  # _id
  column_types.push(String)      # TOOLTIP

  model = Gtk::ListStore.new(*column_types)
  self.model = model
  self.tooltip_column = @tooltip_column_index

  thread = ::Thread.new do
    each_records(limit, query).each do |grn_record|
      load_record(model, grn_record)
    end
  end
  @threads << thread

  @updated = true
end