Module: ActiveRecord::ConnectionAdapters::TursoAdapter::SchemaStatements

Included in:
ActiveRecord::ConnectionAdapters::TursoAdapter
Defined in:
lib/active_record/connection_adapters/turso_adapter/schema_statements.rb

Instance Method Summary collapse

Instance Method Details

#add_fts_index(table_name, columns, tokenizer: :default, weights: {}) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/active_record/connection_adapters/turso_adapter/schema_statements.rb', line 50

def add_fts_index(table_name, columns, tokenizer: :default, weights: {})
  columns = Array(columns)
  name = "fts_#{table_name}_#{columns.join('_')}"
  weights_str = weights.map { |col, w| "#{col}=#{w}" }.join(",")
  with_clause = ["tokenizer = '#{tokenizer}'"]
  with_clause << "weights = '#{weights_str}'" unless weights_str.empty?

  execute(<<~SQL)
    CREATE INDEX #{quote_table_name(name)}
    ON #{quote_table_name(table_name)} USING fts (#{columns.join(", ")})
    WITH (#{with_clause.join(", ")})
  SQL
end

#create_virtual_table(table_name, type_name, columns_or_options = [], **options) ⇒ Object



38
39
40
41
42
43
44
# File 'lib/active_record/connection_adapters/turso_adapter/schema_statements.rb', line 38

def create_virtual_table(table_name, type_name, columns_or_options = [], **options)
  type_name = type_name.to_s
  columns = columns_or_options.is_a?(Array) ? columns_or_options : (columns_or_options[:columns] || [])
  options = columns_or_options.is_a?(Hash) ? columns_or_options : options
  options_str = options_to_fts_options(options)
  execute("CREATE VIRTUAL TABLE #{quote_table_name(table_name)} USING #{type_name} (#{columns.join(", ")})#{options_str}")
end

#drop_virtual_table(table_name, **options) ⇒ Object



46
47
48
# File 'lib/active_record/connection_adapters/turso_adapter/schema_statements.rb', line 46

def drop_virtual_table(table_name, **options)
  execute("DROP TABLE IF EXISTS #{quote_table_name(table_name)}")
end

#fts_indexes(table_name) ⇒ Object



69
70
71
72
73
74
75
76
# File 'lib/active_record/connection_adapters/turso_adapter/schema_statements.rb', line 69

def fts_indexes(table_name)
  query_values(<<~SQL, "SCHEMA")
    SELECT name FROM sqlite_master
    WHERE type = 'index'
      AND tbl_name = #{quote(table_name)}
      AND sql LIKE '%USING fts%'
  SQL
end

#fts_match(_table_name, columns, query) ⇒ Object



78
79
80
81
# File 'lib/active_record/connection_adapters/turso_adapter/schema_statements.rb', line 78

def fts_match(_table_name, columns, query)
  cols = Array(columns).map { |c| quote_table_name(c) }.join(", ")
  Arel.sql("fts_match(#{cols}, #{quote(query)})")
end

#fts_score(_table_name, columns, query) ⇒ Object



83
84
85
86
# File 'lib/active_record/connection_adapters/turso_adapter/schema_statements.rb', line 83

def fts_score(_table_name, columns, query)
  cols = Array(columns).map { |c| quote_table_name(c) }.join(", ")
  Arel.sql("fts_score(#{cols}, #{quote(query)})")
end

#indexes(table_name) ⇒ Object



30
31
32
# File 'lib/active_record/connection_adapters/turso_adapter/schema_statements.rb', line 30

def indexes(table_name)
  super.reject { |idx| idx.name.to_s.start_with?("fts_dir_") || idx.name.to_s.start_with?("sqlite_fts_") }
end

#remove_fts_index(table_name, name = nil) ⇒ Object



64
65
66
67
# File 'lib/active_record/connection_adapters/turso_adapter/schema_statements.rb', line 64

def remove_fts_index(table_name, name = nil)
  name ||= "fts_#{table_name}"
  execute("DROP INDEX IF EXISTS #{quote_table_name(name)}")
end

#supports_virtual_tables?Boolean

Returns:

  • (Boolean)


34
35
36
# File 'lib/active_record/connection_adapters/turso_adapter/schema_statements.rb', line 34

def supports_virtual_tables?
  true
end

#tables(name = nil) ⇒ Object



7
8
9
10
11
12
13
14
15
# File 'lib/active_record/connection_adapters/turso_adapter/schema_statements.rb', line 7

def tables(name = nil)
  query_values(<<~SQL, "SCHEMA")
    SELECT name FROM sqlite_master
    WHERE type IN ('table', 'view')
      AND name NOT LIKE 'sqlite_%'
      AND name NOT LIKE 'fts_dir_%'
      AND name NOT LIKE 'sqlite_fts_%'
  SQL
end

#viewsObject



17
18
19
20
21
# File 'lib/active_record/connection_adapters/turso_adapter/schema_statements.rb', line 17

def views
  query_values(<<~SQL, "SCHEMA")
    SELECT name FROM sqlite_master WHERE type = 'view'
  SQL
end

#virtual_tablesObject



23
24
25
26
27
28
# File 'lib/active_record/connection_adapters/turso_adapter/schema_statements.rb', line 23

def virtual_tables
  query_values(<<~SQL, "SCHEMA")
    SELECT name FROM sqlite_master
    WHERE type = 'table' AND sql LIKE '%CREATE VIRTUAL TABLE%'
  SQL
end