Skip to content

Commit

Permalink
added rudimentary support for belongs_to ordering
Browse files Browse the repository at this point in the history
  • Loading branch information
axelerator committed May 8, 2017
1 parent 811c5d1 commit 41f0598
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 5 deletions.
6 changes: 4 additions & 2 deletions lib/forty_facets/facet_search.rb
Expand Up @@ -120,8 +120,10 @@ def result(skip_ordering: false)
filter.build_scope.call(previous)
end

unless skip_ordering
query = query.order(order.definition.clause) if order
if order && !skip_ordering
query = order.apply(query)
else
query = query.distinct
end
query
end
Expand Down
6 changes: 3 additions & 3 deletions lib/forty_facets/filter/facet_filter_definition.rb
Expand Up @@ -64,7 +64,7 @@ def build_scope
def facet
my_column = definition.qualified_column_name
query = "#{my_column} AS facet_value, count(#{my_column}) AS occurrences"
counts = without.result(skip_ordering: true).reorder('').joins(definition.joins).select(query).group(my_column)
counts = without.result(skip_ordering: true).distinct.joins(definition.joins).select(query).group(my_column)
counts.includes_values = []
facet = counts.map do |c|
is_selected = selected.include?(c.facet_value)
Expand Down Expand Up @@ -102,7 +102,7 @@ def build_scope
def facet
my_column = definition.qualified_column_name
query = "#{my_column} AS foreign_id, count(#{my_column}) AS occurrences"
counts = without.result(skip_ordering: true).reorder('').joins(definition.joins).select(query).group(my_column)
counts = without.result(skip_ordering: true).distinct.joins(definition.joins).select(query).group(my_column)
counts.includes_values = []
entities_by_id = definition.association.klass.find(counts.map(&:foreign_id)).group_by(&:id)

Expand Down Expand Up @@ -136,7 +136,7 @@ def facet
foreign_id_col = definition.association.name.to_s.singularize + '_id'
my_column = join_name + '.' + foreign_id_col
counts = without.result(skip_ordering: true)
.reorder('')
.distinct
.joins(definition.joins)
.select("#{my_column} as foreign_id, count(#{my_column}) as occurrences")
.group(my_column)
Expand Down
32 changes: 32 additions & 0 deletions lib/forty_facets/order.rb
Expand Up @@ -11,6 +11,38 @@ def by
new_params[:order] = definition.request_value
search.class.new_unwrapped(new_params, search.root)
end

def apply(query)
if [Symbol, String, Hash].include? definition.clause.class
query.order(definition.clause)
elsif definition.clause.is_a? Array # [:person, :first_name]
# new and unelegant handling of ordering by columns from joined tables
root_table = search.class.root_class.table_name
primary_key = search.class.root_class.primary_key
just_ids = query.select("#{root_table}.#{primary_key}")
path_to_order_property = definition.clause
order_class = path_to_order_property
.take(path_to_order_property.length - 1)
.inject(search.class.root_class) do |prev_class, assoc_name|
prev_class.reflect_on_association(assoc_name).klass
end
joins = path_to_order_property
.reverse
.drop(1)
.inject(nil) do |sum, elem|
if sum
{elem => sum}
else
elem
end
end
search.root
.joins(joins)
.where(search.class.root_class.primary_key => just_ids)
.order("#{order_class.table_name}.#{path_to_order_property.last}")
end

end
end
end

0 comments on commit 41f0598

Please sign in to comment.