Class: ActiveRecord::Summarize::CalculationImplementation::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/activerecord/summarize/calculation_implementation.rb

Direct Known Subclasses

Count, Maximum, Minimum, Sum

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(relation, column) ⇒ Base

Returns a new instance of Base.



15
16
17
18
# File 'lib/activerecord/summarize/calculation_implementation.rb', line 15

def initialize(relation, column)
  @relation = relation
  @column = column
end

Instance Attribute Details

#columnObject (readonly)

Returns the value of attribute column.



13
14
15
# File 'lib/activerecord/summarize/calculation_implementation.rb', line 13

def column
  @column
end

#relationObject (readonly)

Returns the value of attribute relation.



13
14
15
# File 'lib/activerecord/summarize/calculation_implementation.rb', line 13

def relation
  @relation
end

Instance Method Details

#function_arel_node_classObject



27
28
29
30
# File 'lib/activerecord/summarize/calculation_implementation.rb', line 27

def function_arel_node_class
  # Arel::Node class representing the SQL function
  raise "`#{self.class}` must implement `function_arel_node_class`"
end

#initialObject



38
39
40
41
42
# File 'lib/activerecord/summarize/calculation_implementation.rb', line 38

def initial
  # Initial value for reducing potentially many split-into-groups rows to
  # a single value, so far always 0 or nil.
  raise "`#{self.class}` must implement `initial`"
end

#reducer(memo, v) ⇒ Object



44
45
46
47
48
49
50
51
# File 'lib/activerecord/summarize/calculation_implementation.rb', line 44

def reducer(memo, v)
  # Reducer method for reducing potentially many split-into-groups rows to
  # a single value. Method should return a value the same type as memo
  # and/or v. A reducer is necessary at all because .group in columns
  # _other than_ this one results in fragmenting this result into several
  # rows.
  raise "`#{self.class}` must implement `reducer`"
end

#select_column_arel_node(base_relation) ⇒ Object



20
21
22
23
24
25
# File 'lib/activerecord/summarize/calculation_implementation.rb', line 20

def select_column_arel_node(base_relation)
  where = relation.where_clause - base_relation.where_clause
  for_select = column
  for_select = Arel::Nodes::Case.new(where.ast).when(true, for_select).else(unmatch_arel_node) unless where.empty?
  function_arel_node_class.new([for_select]).tap { |f| f.distinct = relation.distinct_value }
end

#unmatch_arel_nodeObject



32
33
34
35
36
# File 'lib/activerecord/summarize/calculation_implementation.rb', line 32

def unmatch_arel_node
  # In case of `where` filters, this is the does-not-count value for when
  # filters don't match, so far always 0 or nil (becomes NULL)
  raise "`#{self.class}` must implement `unmatch_arel_node`"
end