class QueryHelper::SqlSort

Attributes

column_maps[RW]
select_strings[RW]
sort_tiebreak[RW]

Public Class Methods

new(sort_string: "", sort_tiebreak: "", column_maps: []) click to toggle source
# File lib/query_helper/sql_sort.rb, line 8
def initialize(sort_string: "", sort_tiebreak: "", column_maps: [])
  @sort_string = sort_string
  @column_maps = column_maps
  @sort_tiebreak = sort_tiebreak
  @select_strings = []
end

Public Instance Methods

attributes_sql_expression(sort_attribute) click to toggle source
# File lib/query_helper/sql_sort.rb, line 26
def attributes_sql_expression(sort_attribute)
  sql_strings = []
  sorts = sort_attribute.split(",")
  sorts.each_with_index do |sort, index|
    sort_alias = sort.split(":")[0]
    direction = sort.split(":")[1]
    modifier = sort.split(":")[2]
    begin
      sql_expression = @column_maps.find{ |m| m.alias_name == sort_alias }.sql_expression
    rescue NoMethodError => e
      raise InvalidQueryError.new("Sorting not allowed on column '#{sort_alias}'")
    end

    if direction == "desc"
      case ActiveRecord::Base.connection.adapter_name
      when "SQLite" # SQLite is used in the test suite
        direction = "desc"
      else
        direction = "desc nulls last"
      end
    else
      direction = "asc"
    end

    case modifier
    when "lowercase"
      sql_expression = "lower(#{sql_expression})"
      # When select distincts are used, the order by clause must be included in the select clause
      @select_strings << sql_expression
    end

    sql_strings << "#{sql_expression} #{direction}"
  end
  sql_strings
end
parse_sort_string() click to toggle source
# File lib/query_helper/sql_sort.rb, line 15
def parse_sort_string
  return [] if @sort_string.blank? && @sort_tiebreak.blank?

  return attributes_sql_expression(@sort_tiebreak) if @sort_string.blank?

  sql_strings = attributes_sql_expression(@sort_string)
  return sql_strings if @sort_tiebreak.blank?

  sql_strings + attributes_sql_expression(@sort_tiebreak)
end