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