Class: ScopedSearch::QueryBuilder::PostgreSQLAdapter

Inherits:
ScopedSearch::QueryBuilder show all
Defined in:
lib/scoped_search/query_builder.rb

Overview

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.

Constant Summary

Constant Summary

Constants inherited from ScopedSearch::QueryBuilder

MysqlAdapter, SQL_OPERATORS

Instance Attribute Summary

Attributes inherited from ScopedSearch::QueryBuilder

#ast, #definition

Instance Method Summary collapse

Methods inherited from ScopedSearch::QueryBuilder

#build_find_params, build_query, class_for, #datetime_test, #has_many_through_join, #initialize, #set_test, #translate_value

Constructor Details

This class inherits a constructor from ScopedSearch::QueryBuilder

Instance Method Details

#order_by(order, &block) ⇒ Object



533
534
535
536
537
# File 'lib/scoped_search/query_builder.rb', line 533

def order_by(order, &block)
  sql = super(order, &block)
  sql += sql.include?('DESC') ? ' NULLS LAST ' : ' NULLS FIRST ' if sql
  sql
end

#sql_operator(operator, field) ⇒ Object

Switches out the default LIKE operator in the default sql_operator method for ILIKE or @@ if full text searching is enabled.



518
519
520
521
522
523
524
525
526
# File 'lib/scoped_search/query_builder.rb', line 518

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

#sql_test(field, operator, value, lhs, &block) ⇒ Object

Switches out the default query generation of the sql_test method if full text searching is enabled and a text search is being performed.



505
506
507
508
509
510
511
512
513
514
# File 'lib/scoped_search/query_builder.rb', line 505

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

#to_not_sql(rhs, definition, &block) ⇒ Object

Returns a NOT (…) SQL fragment that negates the current AST node's children



529
530
531
# File 'lib/scoped_search/query_builder.rb', line 529

def to_not_sql(rhs, definition, &block)
  "NOT COALESCE(#{rhs.to_sql(self, definition, &block)}, false)"
end