ManageIQ/manageiq

View on GitHub
lib/extensions/ar_order.rb

Summary

Maintainability
A
1 hr
Test Coverage
A
95%
# This monkey patches rails to support proper joins
# current PR: https://github.com/rails/rails/pull/36531
module ActiveRecord
  module ConnectionAdapters
    module PostgreSQL
      module SchemaStatements
        def columns_for_distinct(columns, orders) # :nodoc:
          order_columns = orders.reject(&:blank?).map do |s|
              # Convert Arel node to string
              unless s.is_a?(String)
                if s.kind_of?(Arel::Nodes::Ordering)
                  s = s.expr
                  keep_order = true
                end
                if s.respond_to?(:to_sql)
                  s = s.to_sql
                else # for Arel::Nodes::Attribute
                  engine = Arel::Table.engine
                  collector = Arel::Collectors::SQLString.new
                  collector = engine.connection.visitor.accept s, collector
                  s = collector.value
                end
              end
              # If we haven't already removed the order clause,
              # Remove any ASC/DESC modifiers
              if keep_order
                s
              else
                s.gsub(/\s+(?:ASC|DESC)\b/i, "")
                 .gsub(/\s+NULLS\s+(?:FIRST|LAST)\b/i, "")
              end
            end.reject(&:blank?).map.with_index { |column, i| "#{column} AS alias_#{i}" }

          (order_columns << super).join(", ")
        end
      end
    end
  end
end