Module: LcpRuby::Sort::EnumSortOrder

Defined in:
lib/lcp_ruby/sort/enum_sort_order.rb

Constant Summary collapse

VALID_STRATEGIES =
%w[definition_order value].freeze

Class Method Summary collapse

Class Method Details

.case_when_sql(field_def, table_name, conn) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/lcp_ruby/sort/enum_sort_order.rb', line 7

def case_when_sql(field_def, table_name, conn)
  return nil unless field_def&.enum?

  values = field_def.enum_value_names
  return nil if values.empty?

  col_ref = "#{conn.quote_table_name(table_name)}.#{conn.quote_column_name(field_def.name)}"
  clauses = values.each_with_index.map do |val, idx|
    "WHEN #{col_ref} = #{conn.quote(val)} THEN #{idx}"
  end

  "CASE #{clauses.join(' ')} ELSE #{values.length} END"
end

.enum_field_for(field_name, model_def) ⇒ Object



21
22
23
24
# File 'lib/lcp_ruby/sort/enum_sort_order.rb', line 21

def enum_field_for(field_name, model_def)
  field_def = model_def.fields.find { |f| f.name == field_name.to_s }
  field_def&.enum? ? field_def : nil
end

.resolve_strategy(sort_field, presenter, model_def) ⇒ Object



26
27
28
29
30
31
32
33
34
# File 'lib/lcp_ruby/sort/enum_sort_order.rb', line 26

def resolve_strategy(sort_field, presenter, model_def)
  col_config = presenter.table_columns.find { |c| c["field"] == sort_field.to_s }
  explicit = col_config&.dig("sort_strategy")
  return explicit if explicit && VALID_STRATEGIES.include?(explicit.to_s)

  source_field = col_config&.dig("group_field") || sort_field.to_s
  enum_field = enum_field_for(source_field, model_def)
  enum_field ? "definition_order" : "value"
end