class ActiveSet::Filtering::Enumerable::SetInstruction

Public Instance Methods

attribute_class() click to toggle source
# File lib/active_set/filtering/enumerable/set_instruction.rb, line 36
def attribute_class
  attribute_instance&.class
end
attribute_instance() click to toggle source
# File lib/active_set/filtering/enumerable/set_instruction.rb, line 25
def attribute_instance
  return set_item if @attribute_instruction.associations_array.empty?
  return @attribute_model if defined? @attribute_model

  @attribute_model = @attribute_instruction
                     .associations_array
                     .reduce(set_item) do |obj, assoc|
    obj.public_send(assoc)
  end
end
item_matches_query?(item) click to toggle source
# File lib/active_set/filtering/enumerable/set_instruction.rb, line 11
def item_matches_query?(item)
  return query_result_for(item, query_attribute_for(instruction_value)) unless operator_hash.key?(:reducer)

  Array.wrap(instruction_value).public_send(operator_hash[:reducer]) do |value|
    query_result_for(item, query_attribute_for(value))
  end
end
set_item() click to toggle source
# File lib/active_set/filtering/enumerable/set_instruction.rb, line 19
def set_item
  return @set_item if defined? @set_item

  @set_item = @set.find(&:present?)
end

Private Instance Methods

guarantee_attribute_type(attribute) click to toggle source
# File lib/active_set/filtering/enumerable/set_instruction.rb, line 86
def guarantee_attribute_type(attribute)
  # Booleans don't respond to many operator methods,
  # so we cast them to integers
  return 1 if attribute == true
  return 0 if attribute == false
  return attribute.map { |a| guarantee_attribute_type(a) } if attribute.respond_to?(:each)

  attribute
end
object_attribute_for(item) click to toggle source
# File lib/active_set/filtering/enumerable/set_instruction.rb, line 62
def object_attribute_for(item)
  attribute = guarantee_attribute_type(attribute_value_for(item))
  return attribute unless operator_hash.key?(:object_attribute_transformer)

  operator_hash[:object_attribute_transformer].call(attribute)
end
operator_hash() click to toggle source
# File lib/active_set/filtering/enumerable/set_instruction.rb, line 80
def operator_hash
  instruction_operator = @attribute_instruction.operator

  Operators.get(instruction_operator)
end
operator_method() click to toggle source
# File lib/active_set/filtering/enumerable/set_instruction.rb, line 76
def operator_method
  operator_hash.dig(:operator) || :'=='
end
query_attribute_for(value) click to toggle source
# File lib/active_set/filtering/enumerable/set_instruction.rb, line 69
def query_attribute_for(value)
  attribute = guarantee_attribute_type(value)
  return attribute unless operator_hash.key?(:query_attribute_transformer)

  operator_hash[:query_attribute_transformer].call(attribute)
end
query_result_for(item, value) click to toggle source
# File lib/active_set/filtering/enumerable/set_instruction.rb, line 42
def query_result_for(item, value)
  result = if operator_method == :cover? && value.is_a?(Range)
             value
               .public_send(
                 operator_method,
                 object_attribute_for(item)
               )
           else
             object_attribute_for(item)
               .public_send(
                 operator_method,
                 value
               )
           end

  return result unless operator_hash.key?(:result_transformer)

  operator_hash[:result_transformer].call(result)
end