Re-format query

This commit is contained in:
cryptogopher 2025-01-09 15:58:21 +01:00
parent 23e2f6a062
commit c7f16514d2

View File

@ -13,9 +13,7 @@ class Quantity < ApplicationRecord
scope :defaults, ->{ where(user: nil) } scope :defaults, ->{ where(user: nil) }
scope :ordered, ->{ scope :ordered, ->{
numbered = Arel::Table.new('numbered') numbered = Arel::Table.new('numbered')
Quantity.with(numbered: numbered(:parent_id, :name)).with_recursive( Quantity.with(numbered: numbered(:parent_id, :name)).with_recursive(quantities: [
quantities:
[
Arel::SelectManager.new.project( Arel::SelectManager.new.project(
numbered[Arel.star], numbered[Arel.star],
numbered.cast(numbered[:child_number], 'BINARY').as('path'), numbered.cast(numbered[:child_number], 'BINARY').as('path'),
@ -26,25 +24,21 @@ class Quantity < ApplicationRecord
arel_table[:path].concat(numbered[:child_number]), arel_table[:path].concat(numbered[:child_number]),
arel_table[:depth] + 1 arel_table[:depth] + 1
).from(numbered).join(arel_table).on(numbered[:parent_id].eq(arel_table[:id])) ).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])
).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){ scope :numbered, ->(parent_column, order_column){
select( select(
arel_table[Arel.star], arel_table[Arel.star],
Arel::Nodes::NamedFunction.new( Arel::Nodes::NamedFunction.new(
'LPAD', 'LPAD',
[ [
Arel::Nodes::NamedFunction.new( Arel::Nodes::NamedFunction.new('ROW_NUMBER', [])
'ROW_NUMBER', [] .over(Arel::Nodes::Window.new.partition(parent_column).order(order_column)),
).over(
Arel::Nodes::Window.new.partition(parent_column).order(order_column)
),
Arel::SelectManager.new.project( Arel::SelectManager.new.project(
Arel::Nodes::NamedFunction.new( Arel::Nodes::NamedFunction.new('LENGTH', [Arel.star.count])])
'LENGTH', [Arel::Nodes::NamedFunction.new('COUNT', [Arel.star])]
)
), ),
Arel::Nodes.build_quoted('0') Arel::Nodes.build_quoted('0')
], ],