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 |