Ruby multi-key stable record sorter
Ruby
def sort_records(records, keys, nulls_last: true)
records.each_with_index.sort do |(a, ai), (b, bi)|
comparison = 0
keys.each do |key|
comparison = compare_values(a[key], b[key], nulls_last)
break unless comparison.zero?
end
comparison.zero? ? ai <=> bi : comparison
end.map(&:first)
end
def compare_values(a, b, nulls_last)
return 0 if a.nil? && b.nil?
return nulls_last ? 1 : -1 if a.nil?
return nulls_last ? -1 : 1 if b.nil?
a <=> b
end