The PostgreSQLAdapter make sure that
searches are case sensitive when using the like/unlike operators, by using
the PostrgeSQL-specific ILIKE operator
instead of
LIKE
.
# File lib/scoped_search/query_builder.rb, line 494 def order_by(order, &block) sql = super(order, &block) sql += sql.include?('DESC') ? ' NULLS LAST ' : ' NULLS FIRST ' if sql sql end
Switches out the default LIKE operator in the default
sql_operator
method for ILIKE or @@ if full text searching is
enabled.
# File lib/scoped_search/query_builder.rb, line 479 def sql_operator(operator, field) raise ScopedSearch::QueryNotSupported, "the operator '#{operator}' is not supported for field type '#{field.type}'" if [:like, :unlike].include?(operator) and !field.textual? return '@@' if [:like, :unlike].include?(operator) and field.full_text_search case operator when :like then 'ILIKE' when :unlike then 'NOT ILIKE' else super(operator, field) end end
Switches out the default query generation of the sql_test
method if full text searching is enabled and a text search is being
performed.
# File lib/scoped_search/query_builder.rb, line 466 def sql_test(field, operator, value, lhs, &block) if [:like, :unlike].include?(operator) and field.full_text_search yield(:parameter, value) negation = (operator == :unlike) ? "NOT " : "" locale = (field.full_text_search == true) ? 'english' : field.full_text_search return "#{negation}to_tsvector('#{locale}', #{field.to_sql(operator, &block)}) #{self.sql_operator(operator, field)} to_tsquery('#{locale}', ?)" else super end end
Returns a NOT (…) SQL fragment that negates the current AST node’s children
# File lib/scoped_search/query_builder.rb, line 490 def to_not_sql(rhs, definition, &block) "NOT COALESCE(#{rhs.to_sql(self, definition, &block)}, false)" end