Skip to content

Commit

Permalink
Merge pull request #18909 from kbrock/fix_order
Browse files Browse the repository at this point in the history
Allow order fields to be subqueries with order

(cherry picked from commit 5d6eb83)

https://bugzilla.redhat.com/show_bug.cgi?id=1738266
  • Loading branch information
jrafanie authored and simaishi committed Aug 27, 2019
1 parent 0264849 commit 004033c
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 0 deletions.
39 changes: 39 additions & 0 deletions lib/extensions/ar_order.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# 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 { |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
}.reject(&:blank?).map.with_index { |column, i| "#{column} AS alias_#{i}" }

(order_columns << super).join(", ")
end
end
end
end
end
19 changes: 19 additions & 0 deletions spec/lib/extensions/ar_order_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
describe "ar_order extension" do
# includes a has_many AND references the has many
# this introduces a DISTINCT to the query.
# rails uses limited_ids_for (which calls columns_for_distinct) to run a quick query
#
# when we use a virtual attribute in the sort (and the attribute has a descending order)
# the string munging gives us issues.
it "supports order when distinct is present for has_many virtual column" do
expect do
VmOrTemplate.includes(:disks).references(:disks).order(:last_compliance_status).first
end.not_to raise_error
end

it "supports order when distinct is present for basic column" do
expect do
VmOrTemplate.includes(:disks).references(:disks).order(:id).first
end.not_to raise_error
end
end

0 comments on commit 004033c

Please sign in to comment.