Sha256: 48dfb69210137c140b262e25f019b6941286b29806bf0994aa09fd3b050f73e1

Contents?: true

Size: 1.74 KB

Versions: 2

Compression:

Stored size: 1.74 KB

Contents

# frozen_string_literal: true

require 'adamantium'

module QueryableCollection
  class Worker
    include Adamantium

    def initialize(elements, queryable_attributes)
      @elements = Array(elements)
      raise(Error, 'Queryable attributes must be a non empty list of attributes') unless
        valid_queryable_attributes? queryable_attributes

      @queryable_attributes = queryable_attributes.map(&:to_s)
    end

    def all
      @elements
    end

    def first
      @elements.first
    end

    def where(query)
      self.class.new(select(query), @queryable_attributes)
    end

    def find_by(query)
      where(query).first
    end

    def empty?
      @elements.empty?
    end

    def to_a
      @elements.dup
    end

    private

    def valid_queryable_attributes?(queryable_attributes)
      queryable_attributes.is_a?(Enumerable) && !queryable_attributes.empty?
    end

    def select(query)
      Query.new(query, @queryable_attributes).perform(@elements)
    end

    class Query
      def initialize(query, queryable_attributes)
        @query = query
        @queryable_attributes = queryable_attributes
        validate!
      end

      def perform(elements)
        elements.select { |element|
          @query.all? { |attribute, value|
            element.send(attribute) == value
          }
        }
      end

      private

      def queryable?(attribute)
        @queryable_attributes.include?(attribute.to_s)
      end

      def validate!
        non_queryable_attributes = @query.keys.reject { |attribute| queryable?(attribute) }
        return if non_queryable_attributes.empty?

        raise Error, "Attributes #{non_queryable_attributes.join(', ')} can't be used in query"
      end
    end
  end

  Error = Class.new(StandardError)
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
queryable_collection-0.4.0 lib/queryable_collection/worker.rb
queryable_collection-0.3.0 lib/queryable_collection/worker.rb