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