class Halumi::Query

Attributes

relation[R]

Public Class Methods

inherited(klass) click to toggle source
# File lib/halumi/query.rb, line 9
def self.inherited(klass)
  klass.instance_variable_set(:@subqueries, @subqueries.clone)
  klass.instance_variable_set(:@relation, @relation)
  klass.instance_variable_set(:@defined_params, [])
end
merge(subquery) click to toggle source
# File lib/halumi/query.rb, line 19
def self.merge(subquery)
  @subqueries << subquery
end
model(model) click to toggle source
# File lib/halumi/query.rb, line 15
def self.model(model)
  @relation = model.all
end
new(params = {}, relation = nil) click to toggle source
# File lib/halumi/query.rb, line 31
def initialize(params = {}, relation = nil)
  @relation = relation&.all || class_relation
  @params = params
  @subqueries = subqueries
end
param(param_name, type = nil, &block) click to toggle source
# File lib/halumi/query.rb, line 23
def self.param(param_name, type = nil, &block)
  block ||= proc { type ? type[@params[param_name]] : @params[param_name] }

  define_method(param_name, block)

  @defined_params << param_name
end

Public Instance Methods

call() click to toggle source
# File lib/halumi/query.rb, line 37
def call
  respond_to?(:execute) ? safe_execute : merge_subqueries
end

Private Instance Methods

class_defined_params() click to toggle source
# File lib/halumi/query.rb, line 71
def class_defined_params
  self.class.instance_variable_get(:@defined_params)
end
class_relation() click to toggle source
# File lib/halumi/query.rb, line 67
def class_relation
  self.class.instance_variable_get(:@relation)
end
class_subqueries() click to toggle source
# File lib/halumi/query.rb, line 63
def class_subqueries
  self.class.instance_variable_get(:@subqueries)
end
merge_subqueries() click to toggle source
# File lib/halumi/query.rb, line 53
def merge_subqueries
  @subqueries.map(&:call).reduce(&:merge)
end
safe_execute() click to toggle source
# File lib/halumi/query.rb, line 43
def safe_execute
  validate_params && execute
rescue Dry::Types::ConstraintError
  relation
end
subqueries() click to toggle source
# File lib/halumi/query.rb, line 57
def subqueries
  class_subqueries.map do |query|
    query.new(@params, @relation)
  end
end
validate_params() click to toggle source
# File lib/halumi/query.rb, line 49
def validate_params
  class_defined_params.each { |p| public_send(p) }
end