Sha256: caf0d009f836d028ea09e4fea1ee823fd50cd0c8cbd234d9a3b23554cb276976

Contents?: true

Size: 1.69 KB

Versions: 3

Compression:

Stored size: 1.69 KB

Contents

# frozen_string_literal: true

module ActiveRecordFilter
  # Executes a series of filters on a specific model class.
  # Stores each execution step in order to figure out which step
  # filtered away which entities.
  #
  class FilterExecuter
    attr_reader :applied_filters

    def initialize(model_class, *component_classes)
      @model_class       = model_class
      @component_classes = component_classes
      @applied_filters   = []
    end

    def execute(filter_object)
      @applied_filters = []

      apply_filters(filter_object)
    end

    private

    attr_reader :component_classes, :model_class

    def apply_filters(filter_object)
      relation = model_class.all

      component_classes.each do |component_class|
        relation = apply_filter(relation, component_class, filter_object)
      end

      relation
    end

    def apply_filter(current_relation, component_class, filter_object)
      component = component_class.new(filter_object)

      applied_filter = AppliedFilter.new(current_relation, component)
      applied_filters << applied_filter

      applied_filter.relation
    end

    # Represents a step in the filter execution.
    # Stores how the relations looked after a specific component is applied.
    #
    class AppliedFilter
      attr_reader :relation, :component

      def initialize(previous_relation, component)
        @previous_relation = previous_relation
        @component         = component
        @relation          = previous_relation.merge(component.filter)
      end

      def results
        relation
      end

      def removed
        previous_relation.where.not(id: relation)
      end

      private

      attr_reader :previous_relation
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
active_record_filter-0.2.0 lib/active_record_filter/filter_executer.rb
active_record_filter-0.1.0 lib/active_record_filter/filter_executer.rb
active_record_filter-0.0.3 lib/active_record_filter/filter_executer.rb