class ParamsReady::Ordering::OrderingParameterDefinition

Constants

COLUMN_DELIMITER
FIELD_DELIMITER

Attributes

columns[R]
primary_keys[R]

Public Class Methods

new(columns, default = Extensions::Undefined) click to toggle source
Calls superclass method
# File lib/params_ready/ordering/ordering.rb, line 160
def initialize(columns, default = Extensions::Undefined)
  invalid = columns.values.uniq.reject do |column|
    column.is_a? Column
  end
  raise ParamsReadyError, "Invalid ordering values: #{invalid.join(", ")}" unless invalid.length == 0
  @columns = columns.transform_keys { |k| k.to_sym }
  @required_columns = nil
  @primary_keys = Set.new
  super :ordering, altn: :ord, prototype: nil, default: default
end

Public Instance Methods

add_column( name, ordering, expression:, arel_table:, nulls: :default, required: false, pk: false ) click to toggle source
# File lib/params_ready/ordering/ordering.rb, line 195
def add_column(
  name,
  ordering,
  expression:,
  arel_table:,
  nulls: :default,
  required: false,
  pk: false
)
  raise ParamsReadyError, "Column name taken: #{name}" if @columns.key? name
  raise ParamsReadyError, "Can't add column after default defined" unless @default == Extensions::Undefined
  @primary_keys << name if pk == true

  column = Column.new(
    ordering,
    expression: expression,
    arel_table: arel_table,
    nulls: nulls,
    required: required,
    pk: pk
  )
  @columns[name] = column
end
create_prototype(columns) click to toggle source
# File lib/params_ready/ordering/ordering.rb, line 219
def create_prototype(columns)
  Builder.define_tuple(:column) do
    marshal using: :string, separator: FIELD_DELIMITER
    field :symbol, :column_name do
      constrain Value::EnumConstraint.new(columns.keys)
    end
    field :symbol, :column_ordering do
      constrain Value::EnumConstraint.new(Column::DIRECTIONS)
    end
  end
end
finish() click to toggle source
Calls superclass method
# File lib/params_ready/ordering/ordering.rb, line 266
def finish
  raise ParamsReadyError, "No ordering column defined" if @columns.empty?
  set_required_columns
  set_default([]) unless default_defined?
  super
end
required?(name = nil) click to toggle source
# File lib/params_ready/ordering/ordering.rb, line 189
def required?(name = nil)
  return !@required_columns.empty? if name.nil?

  @required_columns.member?(name)
end
set_default(value) click to toggle source
Calls superclass method
# File lib/params_ready/ordering/ordering.rb, line 171
def set_default(value)
  raise ParamsReadyError, "Prototype for ordering expected to be nil" unless @prototype.nil?
  set_required_columns

  @prototype = create_prototype columns
  super value
end
set_required_columns() click to toggle source
# File lib/params_ready/ordering/ordering.rb, line 179
def set_required_columns
  return unless @required_columns.nil?

  @required_columns = @columns.select do |_name, value|
    value.required
  end.map do |name, _value|
    name
  end
end
try_canonicalize(input, context, validator = nil, freeze: false) click to toggle source
Calls superclass method
# File lib/params_ready/ordering/ordering.rb, line 231
def try_canonicalize(input, context, validator = nil, freeze: false)
  input ||= [%w(none none)]
  canonical, validator = case input
  when String
    raise ParamsReadyError, "Freeze option expected to be false" if freeze
    array = input.split(COLUMN_DELIMITER)
    try_canonicalize(array, context, validator, freeze: false)
  when Array
    super
  else
    raise ParamsReadyError, "Unexpected type for #{name}: #{input.class.name}"
  end
  unique_columns = unique_columns(canonical)
  with_required = with_required(unique_columns)
  [with_required.values, validator]
end
unique_columns(array) click to toggle source
# File lib/params_ready/ordering/ordering.rb, line 248
def unique_columns(array)
  array.each_with_object({}) do |column, hash|
    name = column.first.unwrap
    next if hash.key? name

    hash[name] = column
  end
end
with_required(hash) click to toggle source
# File lib/params_ready/ordering/ordering.rb, line 257
def with_required(hash)
  @required_columns.each_with_object(hash) do |name, result|
    next if result.key? name
    column = @columns[name]
    _, tuple = @prototype.from_input([name, column.ordering])
    hash[name] = tuple
  end
end