class PgSearch::Multisearch::Rebuilder

Attributes

model[R]

Public Class Methods

new(model, time_source = Time.method(:now)) click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 6
def initialize(model, time_source = Time.method(:now))
  raise ModelNotMultisearchable, model unless model.respond_to?(:pg_search_multisearchable_options)

  @model = model
  @time_source = time_source
end

Public Instance Methods

rebuild() click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 13
def rebuild
  if model.respond_to?(:rebuild_pg_search_documents)
    model.rebuild_pg_search_documents
  elsif conditional? || dynamic? || additional_attributes?
    model.find_each(&:update_pg_search_document)
  else
    model.connection.execute(rebuild_sql)
  end
end

Private Instance Methods

additional_attributes?() click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 36
def additional_attributes?
  model.pg_search_multisearchable_options.key?(:additional_attributes)
end
base_model_name() click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 96
def base_model_name
  connection.quote(model.base_class.name)
end
columns() click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 88
def columns
  Array(model.pg_search_multisearchable_options[:against])
end
conditional?() click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 27
def conditional?
  model.pg_search_multisearchable_options.key?(:if) || model.pg_search_multisearchable_options.key?(:unless)
end
connection() click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 40
def connection
  model.connection
end
content_expressions() click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 82
def content_expressions
  columns.map do |column|
    %{coalesce(:model_table.#{connection.quote_column_name(column)}::text, '')}
  end.join(" || ' ' || ")
end
current_time() click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 108
def current_time
  connection.quote(connection.quoted_date(@time_source.call))
end
documents_table() click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 104
def documents_table
  PgSearch::Document.quoted_table_name
end
dynamic?() click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 31
def dynamic?
  column_names = model.columns.map(&:name)
  columns.any? { |column| column_names.exclude?(column.to_s) }
end
model_name() click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 92
def model_name
  connection.quote(model.name)
end
model_table() click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 100
def model_table
  model.quoted_table_name
end
primary_key() click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 44
def primary_key
  model.primary_key
end
rebuild_sql() click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 62
def rebuild_sql
  replacements.inject(rebuild_sql_template) do |sql, key|
    sql.gsub ":#{key}", send(key)
  end
end
rebuild_sql_template() click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 48
      def rebuild_sql_template
        <<~SQL.squish
          INSERT INTO :documents_table (searchable_type, searchable_id, content, created_at, updated_at)
            SELECT :base_model_name AS searchable_type,
                   :model_table.#{primary_key} AS searchable_id,
                   (
                     :content_expressions
                   ) AS content,
                   :current_time AS created_at,
                   :current_time AS updated_at
            FROM :model_table :sti_clause
        SQL
      end
replacements() click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 78
def replacements
  %w[content_expressions base_model_name model_name model_table documents_table current_time sti_clause]
end
sti_clause() click to toggle source
# File lib/pg_search/multisearch/rebuilder.rb, line 68
def sti_clause
  clause = ""
  if model.column_names.include? model.inheritance_column
    clause = "WHERE"
    clause = "#{clause} #{model.inheritance_column} IS NULL OR" if model.base_class == model
    clause = "#{clause} #{model.inheritance_column} = #{model_name}"
  end
  clause
end