class DbTextSearch::CaseInsensitive::CollateNocaseAdapter

Provides case-insensitive string-in-set querying via COLLATE NOCASE. @api private

Public Class Methods

add_index(connection, table_name, column_name, options = {}) click to toggle source

(see AbstractAdapter.add_index)

# File lib/db_text_search/case_insensitive/collate_nocase_adapter.rb, line 31
def self.add_index(connection, table_name, column_name, options = {})
  # TODO: Switch to the native Rails solution once it's landed, as the current one requires SQL dump format.
  # https://github.com/rails/rails/pull/18499
  options              = options.dup
  options[:name]       ||= "#{column_name}_nocase"
  options[:expression] = "(#{connection.quote_column_name(column_name)} COLLATE NOCASE)"
  connection.exec_query quoted_create_index(connection, table_name, **options)
end

Public Instance Methods

column_for_order(asc_or_desc) click to toggle source

(see AbstractAdapter#column_for_order)

# File lib/db_text_search/case_insensitive/collate_nocase_adapter.rb, line 26
def column_for_order(asc_or_desc)
  Arel.sql("#{quoted_scope_column} COLLATE NOCASE #{asc_or_desc}")
end
in(values) click to toggle source

(see AbstractAdapter#in)

# File lib/db_text_search/case_insensitive/collate_nocase_adapter.rb, line 10
def in(values)
  conn = @scope.connection
  @scope.where "#{quoted_scope_column} COLLATE NOCASE IN (#{values.map { |v| conn.quote(v.to_s) }.join(', ')})"
end
prefix(query) click to toggle source

(see AbstractAdapter#prefix)

# File lib/db_text_search/case_insensitive/collate_nocase_adapter.rb, line 16
def prefix(query)
  escape        = '\\'
  escaped_query = "#{sanitize_sql_like(query, escape)}%"
  # assuming case_sensitive_prefix mode to be disabled, prefix it is by default.
  # this is to avoid adding COLLATE NOCASE here, which prevents index use in SQLite LIKE.
  @scope.where "#{quoted_scope_column} LIKE ?#{" ESCAPE '#{escape}'" if escaped_query.include?(escape)}",
               escaped_query
end