Class: FullSearch::Index

Inherits:
Object
  • Object
show all
Defined in:
lib/full_search/index.rb

Class Method Summary collapse

Class Method Details

.drop!(model) ⇒ Object



60
61
62
63
64
# File 'lib/full_search/index.rb', line 60

def drop!(model)
  drop_triggers!(model)
  connection.execute("DROP TABLE IF EXISTS #{fts_table_name(model)};")
  connection.execute("DROP TABLE IF EXISTS #{trigram_table_name(model)};")
end

.ensure_table!(model) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/full_search/index.rb', line 8

def ensure_table!(model)
  return unless FullSearch::Index.sqlite?

  conn = connection
  dsl = model.full_search_dsl
  return unless dsl

  

  unless table_exists?(model)
    conn.execute(create_virtual_table_sql(model))
  end

  if dsl.typo_tolerance? && !trigram_table_exists?(model)
    FullSearch::Typo.warn_unsupported! unless FullSearch::Typo.supported?
    conn.execute(create_trigram_virtual_table_sql(model))
  end

  ensure_triggers!(model) if model_table_exists?(model)
  store_config_hash!(model)
end

.fts_table_name(model) ⇒ Object



66
67
68
# File 'lib/full_search/index.rb', line 66

def fts_table_name(model)
  "#{model.table_name}_fts"
end

.optimize!(model) ⇒ Object



56
57
58
# File 'lib/full_search/index.rb', line 56

def optimize!(model)
  connection.execute("INSERT INTO #{fts_table_name(model)}(#{fts_table_name(model)}) VALUES('optimize');")
end

.rebuild!(model) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/full_search/index.rb', line 30

def rebuild!(model)
  return unless FullSearch::Index.sqlite?

  dsl = model.full_search_dsl
  return unless dsl
  conn = connection

  

  with_rebuild_lock(model) do
    drop_triggers!(model)
    conn.execute("DROP TABLE IF EXISTS #{fts_table_name(model)};")
    conn.execute("DROP TABLE IF EXISTS #{trigram_table_name(model)};")
    conn.execute(create_virtual_table_sql(model))
    if dsl.typo_tolerance?
      FullSearch::Typo.warn_unsupported! unless FullSearch::Typo.supported?
      conn.execute(create_trigram_virtual_table_sql(model))
    end
    conn.execute(backfill_sql(model))
    conn.execute(backfill_trigram_sql(model)) if dsl.typo_tolerance?
    create_triggers!(model)
    optimize!(model)
    store_config_hash!(model, rebuilt_at: Time.current)
  end
end

.sqlite?Boolean

Returns:

  • (Boolean)


74
75
76
# File 'lib/full_search/index.rb', line 74

def sqlite?
  connection.adapter_name.downcase.include?("sqlite")
end

.stored_config_hash(model) ⇒ Object



78
79
80
81
82
83
# File 'lib/full_search/index.rb', line 78

def stored_config_hash(model)
  row = connection.execute(
    "SELECT config_hash FROM full_search_index_versions WHERE table_name=#{q(model.table_name)}"
  ).first
  row&.[]("config_hash")
end

.trigram_table_name(model) ⇒ Object



70
71
72
# File 'lib/full_search/index.rb', line 70

def trigram_table_name(model)
  "#{fts_table_name(model)}_trigram"
end