Class: Ardb::RelationSpy

Inherits:
Object
  • Object
show all
Defined in:
lib/ardb/relation_spy.rb

Defined Under Namespace

Classes: AppliedExpression

Constant Summary collapse

NotFoundError =
Class.new(RuntimeError)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeRelationSpy

Returns a new instance of RelationSpy.



10
11
12
13
14
15
16
17
# File 'lib/ardb/relation_spy.rb', line 10

def initialize
  @applied, @results = [], []
  @offset_value, @limit_value = nil, nil

  @pluck_values   = {}
  @maximum_values = {}
  @minimum_values = {}
end

Instance Attribute Details

#appliedObject (readonly)

Returns the value of attribute applied.



5
6
7
# File 'lib/ardb/relation_spy.rb', line 5

def applied
  @applied
end

#limit_valueObject

Returns the value of attribute limit_value.



6
7
8
# File 'lib/ardb/relation_spy.rb', line 6

def limit_value
  @limit_value
end

#maximum_valuesObject

Returns the value of attribute maximum_values.



7
8
9
# File 'lib/ardb/relation_spy.rb', line 7

def maximum_values
  @maximum_values
end

#minimum_valuesObject

Returns the value of attribute minimum_values.



7
8
9
# File 'lib/ardb/relation_spy.rb', line 7

def minimum_values
  @minimum_values
end

#offset_valueObject

Returns the value of attribute offset_value.



6
7
8
# File 'lib/ardb/relation_spy.rb', line 6

def offset_value
  @offset_value
end

#pluck_valuesObject

Returns the value of attribute pluck_values.



7
8
9
# File 'lib/ardb/relation_spy.rb', line 7

def pluck_values
  @pluck_values
end

#resultsObject

Returns the value of attribute results.



8
9
10
# File 'lib/ardb/relation_spy.rb', line 8

def results
  @results
end

Instance Method Details

#==(other) ⇒ Object



25
26
27
# File 'lib/ardb/relation_spy.rb', line 25

def ==(other)
  other.kind_of?(self.class) ? @applied == other.applied : super
end

#allObject



126
127
128
# File 'lib/ardb/relation_spy.rb', line 126

def all
  @results[(@offset_value || 0), (@limit_value || @results.size)] || []
end

#countObject

ActiveRecord::Calculations



132
133
134
# File 'lib/ardb/relation_spy.rb', line 132

def count
  all.size
end

#except(*skips) ⇒ Object



85
86
87
88
89
90
91
92
# File 'lib/ardb/relation_spy.rb', line 85

def except(*skips)
  skips = skips.map(&:to_sym)
  self.dup.tap do |r|
    r.applied.reject!{ |a| skips.include?(a.type) }
    r.limit_value    = nil if skips.include?(:limit)
    r.offset_value   = nil if skips.include?(:offset)
  end
end

#find(id) ⇒ Object

ActiveRecord::FinderMethods



105
106
107
108
# File 'lib/ardb/relation_spy.rb', line 105

def find(id)
  record = @results.detect{ |result| result.id == id }
  record || raise(NotFoundError)
end

#firstObject



110
111
112
# File 'lib/ardb/relation_spy.rb', line 110

def first
  self.all.first
end

#first!Object



114
115
116
# File 'lib/ardb/relation_spy.rb', line 114

def first!
  self.first || raise(NotFoundError)
end

#initialize_copy(copied_from) ⇒ Object



19
20
21
22
23
# File 'lib/ardb/relation_spy.rb', line 19

def initialize_copy(copied_from)
  super
  @applied = copied_from.applied.dup
  @results = copied_from.results.dup
end

#lastObject



118
119
120
# File 'lib/ardb/relation_spy.rb', line 118

def last
  self.all.last
end

#last!Object



122
123
124
# File 'lib/ardb/relation_spy.rb', line 122

def last!
  self.last || raise(NotFoundError)
end

#limit(value) ⇒ Object



61
62
63
64
65
# File 'lib/ardb/relation_spy.rb', line 61

def limit(value)
  @limit_value = value ? value.to_i : nil
  @applied << AppliedExpression.new(:limit, [ value ])
  self
end

#maximum(column_name) ⇒ Object



140
141
142
# File 'lib/ardb/relation_spy.rb', line 140

def maximum(column_name)
  @maximum_values[column_name]
end

#merge(other) ⇒ Object

ActiveRecord::SpawnMethods



75
76
77
78
79
80
81
82
83
# File 'lib/ardb/relation_spy.rb', line 75

def merge(other)
  return self if self.equal?(other)
  if other.kind_of?(self.class)
    other.applied.each{ |a| self.send(a.type, *a.args) }
  else
    @applied << AppliedExpression.new(:merge, [ other ])
  end
  self
end

#minimum(column_name) ⇒ Object



144
145
146
# File 'lib/ardb/relation_spy.rb', line 144

def minimum(column_name)
  @minimum_values[column_name]
end

#offset(value) ⇒ Object



67
68
69
70
71
# File 'lib/ardb/relation_spy.rb', line 67

def offset(value)
  @offset_value = value ? value.to_i : nil
  @applied << AppliedExpression.new(:offset, [ value ])
  self
end

#only(*onlies) ⇒ Object



94
95
96
97
98
99
100
101
# File 'lib/ardb/relation_spy.rb', line 94

def only(*onlies)
  onlies = onlies.map(&:to_sym)
  self.dup.tap do |r|
    r.applied.reject!{ |a| !onlies.include?(a.type) }
    r.limit_value    = nil unless onlies.include?(:limit)
    r.offset_value   = nil unless onlies.include?(:offset)
  end
end

#pluck(column_name) ⇒ Object



136
137
138
# File 'lib/ardb/relation_spy.rb', line 136

def pluck(column_name)
  [@pluck_values[column_name]] * @results.size
end

#reset!Object



33
34
35
36
37
38
# File 'lib/ardb/relation_spy.rb', line 33

def reset!
  @applied.clear
  @results.clear
  @offset_value = nil
  @limit_value  = nil
end

#to_sqlObject



29
30
31
# File 'lib/ardb/relation_spy.rb', line 29

def to_sql
  @applied.map(&:to_sql).join(", ")
end