Class: Parascope::Query

Inherits:
Object
  • Object
show all
Extended by:
ApiMethods
Defined in:
lib/parascope/query.rb

Defined Under Namespace

Modules: ApiMethods Classes: ApiBlock

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ApiMethods

defaults, guard_blocks, query_blocks, query_by, sift_blocks, sift_by

Constructor Details

#initialize(params, scope: nil, **attrs) ⇒ Query

Returns a new instance of Query.



24
25
26
27
28
29
30
# File 'lib/parascope/query.rb', line 24

def initialize(params, scope: nil, **attrs)
  @params = Hashie::Mash.new(klass.defaults).merge(params || {})
  @scope  = scope unless scope.nil?
  @attrs  = attrs.freeze
  @base_params = @params
  define_attr_readers
end

Instance Attribute Details

#paramsObject

Returns the value of attribute params.



10
11
12
# File 'lib/parascope/query.rb', line 10

def params
  @params
end

#scopeObject



32
33
34
# File 'lib/parascope/query.rb', line 32

def scope
  @scope ||= base_scope
end

Class Method Details

.build(**attrs) ⇒ Object



20
21
22
# File 'lib/parascope/query.rb', line 20

def self.build(**attrs)
  new({}, **attrs)
end

.inherited(subclass) ⇒ Object



12
13
14
15
16
17
18
# File 'lib/parascope/query.rb', line 12

def self.inherited(subclass)
  subclass.query_blocks.replace query_blocks.dup
  subclass.sift_blocks.replace sift_blocks.dup
  subclass.guard_blocks.replace guard_blocks.dup
  subclass.base_scope(&base_scope)
  subclass.defaults defaults
end

Instance Method Details

#base_scopeObject



36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/parascope/query.rb', line 36

def base_scope
  scope = klass.ancestors
    .select{ |klass| klass < Query }
    .reverse
    .map(&:base_scope)
    .compact
    .reduce(nil){ |scope, block| instance_exec(scope, &block) }

  if scope.nil?
    fail UndefinedScopeError, "failed to build scope. Have you missed base_scope definition?"
  end

  scope
end

#klassObject



58
59
60
# File 'lib/parascope/query.rb', line 58

def klass
  sifted? ? singleton_class : self.class
end

#resolved_scope(*args) ⇒ Object



51
52
53
54
55
56
# File 'lib/parascope/query.rb', line 51

def resolved_scope(*args)
  arg_params = args.pop if args.last.is_a?(Hash)
  return sifted_instance.resolved_scope! if arg_params.nil? && args.empty?

  clone_with_params(trues(args).merge(arg_params || {})).resolved_scope
end