Class: Parascope::Query

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

Defined Under Namespace

Modules: ApiMethods Classes: ApiBlock

Constant Summary collapse

UndefinedScopeError =
Class.new(StandardError)
GuardViolationError =
Class.new(ArgumentError)
UnpermittedError =

for backward-compatability

GuardViolationError

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.



27
28
29
30
31
32
33
# File 'lib/parascope/query.rb', line 27

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.



16
17
18
# File 'lib/parascope/query.rb', line 16

def params
  @params
end

#scopeObject



35
36
37
# File 'lib/parascope/query.rb', line 35

def scope
  @scope ||= base_scope
end

Class Method Details

.inherited(subclass) ⇒ Object



19
20
21
22
23
24
25
# File 'lib/parascope/query.rb', line 19

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



39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/parascope/query.rb', line 39

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



61
62
63
# File 'lib/parascope/query.rb', line 61

def klass
  sifted? ? singleton_class : self.class
end

#resolved_scope(*args) ⇒ Object



54
55
56
57
58
59
# File 'lib/parascope/query.rb', line 54

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