From c7f16514d2135242c0c3f4d7bf8642e2ffd4ab4a Mon Sep 17 00:00:00 2001 From: cryptogopher Date: Thu, 9 Jan 2025 15:58:21 +0100 Subject: [PATCH] Re-format query --- app/models/quantity.rb | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/app/models/quantity.rb b/app/models/quantity.rb index b12a902..f7dce76 100644 --- a/app/models/quantity.rb +++ b/app/models/quantity.rb @@ -13,38 +13,32 @@ class Quantity < ApplicationRecord scope :defaults, ->{ where(user: nil) } scope :ordered, ->{ numbered = Arel::Table.new('numbered') - Quantity.with(numbered: numbered(:parent_id, :name)).with_recursive( - quantities: - [ - Arel::SelectManager.new.project( - numbered[Arel.star], - numbered.cast(numbered[:child_number], 'BINARY').as('path'), - Arel::Nodes.build_quoted(0).as('depth') - ).from(numbered).where(numbered[:parent_id].eq(nil)), - Arel::SelectManager.new.project( - numbered[Arel.star], - arel_table[:path].concat(numbered[:child_number]), - arel_table[:depth] + 1 - ).from(numbered).join(arel_table).on(numbered[:parent_id].eq(arel_table[:id])) - ] - ).select(arel_table[Arel.star]).from(arel_table).order(arel_table[:path]) + Quantity.with(numbered: numbered(:parent_id, :name)).with_recursive(quantities: [ + Arel::SelectManager.new.project( + numbered[Arel.star], + numbered.cast(numbered[:child_number], 'BINARY').as('path'), + Arel::Nodes.build_quoted(0).as('depth') + ).from(numbered).where(numbered[:parent_id].eq(nil)), + Arel::SelectManager.new.project( + numbered[Arel.star], + arel_table[:path].concat(numbered[:child_number]), + arel_table[:depth] + 1 + ).from(numbered).join(arel_table).on(numbered[:parent_id].eq(arel_table[:id])) + ]).select(arel_table[Arel.star]).from(arel_table).order(arel_table[:path]) } + # TODO: extract named functions to custom Arel extension + # https://gist.github.com/ProGM/c6df08da14708dcc28b5ca325df37ceb#extending-arel scope :numbered, ->(parent_column, order_column){ select( arel_table[Arel.star], Arel::Nodes::NamedFunction.new( 'LPAD', [ - Arel::Nodes::NamedFunction.new( - 'ROW_NUMBER', [] - ).over( - Arel::Nodes::Window.new.partition(parent_column).order(order_column) - ), + Arel::Nodes::NamedFunction.new('ROW_NUMBER', []) + .over(Arel::Nodes::Window.new.partition(parent_column).order(order_column)), Arel::SelectManager.new.project( - Arel::Nodes::NamedFunction.new( - 'LENGTH', [Arel::Nodes::NamedFunction.new('COUNT', [Arel.star])] - ) + Arel::Nodes::NamedFunction.new('LENGTH', [Arel.star.count])]) ), Arel::Nodes.build_quoted('0') ],