Class: DbTextSearch::CaseInsensitive
- Inherits:
-
Object
- Object
- DbTextSearch::CaseInsensitive
- Defined in:
- lib/db_text_search/case_insensitive.rb,
lib/db_text_search/case_insensitive/lower_adapter.rb,
lib/db_text_search/case_insensitive/abstract_adapter.rb,
lib/db_text_search/case_insensitive/collate_nocase_adapter.rb,
lib/db_text_search/case_insensitive/insensitive_column_adapter.rb
Overview
Provides case-insensitive string-in-set querying, LIKE querying, and CI index creation.
Defined Under Namespace
Classes: AbstractAdapter, CollateNocaseAdapter, InsensitiveColumnAdapter, LowerAdapter
Class Method Summary collapse
- .adapter_class(connection, table_name, column_name) ⇒ Class<AbstractAdapter> private
-
.add_ci_text_column(connection, table_name, column_name, options = {}) ⇒ Object
Adds a case-insensitive column to the given table.
-
.add_index(connection, table_name, column_name, options = {}) ⇒ Object
Add an index for case-insensitive string search.
- .column_case_sensitive?(connection, table_name, column_name) ⇒ Boolean private
Instance Method Summary collapse
- #in(value_or_values) ⇒ ActiveRecord::Relation
-
#initialize(scope, column) ⇒ CaseInsensitive
constructor
A new instance of CaseInsensitive.
-
#prefix(query) ⇒ ActiveRecord::Relation
The scope of records with matching prefix.
Constructor Details
#initialize(scope, column) ⇒ CaseInsensitive
Returns a new instance of CaseInsensitive.
12 13 14 15 |
# File 'lib/db_text_search/case_insensitive.rb', line 12 def initialize(scope, column) @adapter = self.class.adapter_class(scope.connection, scope.table_name, column).new(scope, column) @scope = scope end |
Class Method Details
.adapter_class(connection, table_name, column_name) ⇒ Class<AbstractAdapter>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/db_text_search/case_insensitive.rb', line 71 def self.adapter_class(connection, table_name, column_name) lower_or_insensitive = -> { column_case_sensitive?(connection, table_name, column_name) ? LowerAdapter : InsensitiveColumnAdapter } DbTextSearch.match_adapter( connection, mysql: lower_or_insensitive, postgres: lower_or_insensitive, # Always use COLLATE NOCASE for SQLite, as we can't check if the column is case-sensitive. # It has no performance impact apart from slightly longer query strings for case-insensitive columns. sqlite: -> { CollateNocaseAdapter }) end |
.add_ci_text_column(connection, table_name, column_name, options = {}) ⇒ Object
Adds a case-insensitive column to the given table.
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/db_text_search/case_insensitive.rb', line 37 def self.add_ci_text_column(connection, table_name, column_name, = {}) connection.add_column table_name, column_name, *DbTextSearch.match_adapter( connection, mysql: -> { [:text, ] }, postgres: -> { connection.enable_extension 'citext' [(ActiveRecord::VERSION::STRING >= '4.2.0' ? :citext : 'CITEXT'), ] }, sqlite: -> { if ActiveRecord::VERSION::MAJOR >= 5 [:text, .merge(collation: 'NOCASE')] else ['TEXT COLLATE NOCASE', ] end }) end |
.add_index(connection, table_name, column_name, options = {}) ⇒ Object
Add an index for case-insensitive string search.
62 63 64 |
# File 'lib/db_text_search/case_insensitive.rb', line 62 def self.add_index(connection, table_name, column_name, = {}) adapter_class(connection, table_name, column_name).add_index(connection, table_name, column_name, ) end |
.column_case_sensitive?(connection, table_name, column_name) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
sqlite not supported.
90 91 92 93 94 95 96 97 |
# File 'lib/db_text_search/case_insensitive.rb', line 90 def self.column_case_sensitive?(connection, table_name, column_name) column = connection.schema_cache.columns(table_name).detect { |c| c.name == column_name.to_s } DbTextSearch.match_adapter( connection, mysql: -> { column.case_sensitive? }, postgres: -> { column.sql_type !~ /citext/i }, sqlite: -> { DbTextSearch.unsupported_adapter! connection }) end |
Instance Method Details
#in(value_or_values) ⇒ ActiveRecord::Relation
19 20 21 22 23 |
# File 'lib/db_text_search/case_insensitive.rb', line 19 def in(value_or_values) values = Array(value_or_values) return @scope.none if values.empty? @adapter.in(values) end |
#prefix(query) ⇒ ActiveRecord::Relation
Returns the scope of records with matching prefix.
27 28 29 30 |
# File 'lib/db_text_search/case_insensitive.rb', line 27 def prefix(query) return @scope.none if query.empty? @adapter.prefix(query) end |