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



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

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



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

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



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

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

#fts_indexes(table_name) ⇒ Object



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

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



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

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



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

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



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

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



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

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)


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

def supports_virtual_tables?
  true
end

#tables(name = nil) ⇒ Object



7
8
9
10
11
12
13
14
15
16
# 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_%'
      AND name NOT LIKE '__turso_internal_%'
  SQL
end

#viewsObject



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

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

#virtual_tablesObject



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

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