Module: ActiveRecord::Materialized::QueryExpressions

Defined in:
lib/activerecord/materialized/query_expressions.rb

Overview

Portable, aliased Arel aggregate helpers for building a view's source relation without raw SQL. extend it into a view (or any object) so the helpers are available where you build the relation.

Examples:

class SalesByCategory < ActiveRecord::Materialized::View
  extend ActiveRecord::Materialized::QueryExpressions
  materialized_from do
    items = Item.arel_table
    Item.group(:category).select(
      items[:category],
      sum_as(items[:amount], as: :revenue),
      count_all_as(as: :order_count)
    )
  end
end

Class Method Summary collapse

Class Method Details

.avg_as(attribute, as:) ⇒ Arel::Nodes::As

Returns AVG(attribute) AS <as>.

Returns:

  • (Arel::Nodes::As)

    AVG(attribute) AS <as>



31
32
33
# File 'lib/activerecord/materialized/query_expressions.rb', line 31

def avg_as(attribute, as:)
  attribute.average.as(as.to_s)
end

.count_all_as(as:) ⇒ Arel::Nodes::As

Returns COUNT(*) AS <as> — a trustworthy per-partition row count.

Returns:

  • (Arel::Nodes::As)

    COUNT(*) AS <as> — a trustworthy per-partition row count



46
47
48
# File 'lib/activerecord/materialized/query_expressions.rb', line 46

def count_all_as(as:)
  Arel.star.count.as(as.to_s)
end

.count_as(attribute, as:) ⇒ Arel::Nodes::As

Returns COUNT(attribute) AS <as> (non-null values).

Returns:

  • (Arel::Nodes::As)

    COUNT(attribute) AS <as> (non-null values)



51
52
53
# File 'lib/activerecord/materialized/query_expressions.rb', line 51

def count_as(attribute, as:)
  attribute.count.as(as.to_s)
end

.count_distinct_as(attribute, as:) ⇒ Arel::Nodes::As

Returns COUNT(DISTINCT attribute) AS <as>.

Returns:

  • (Arel::Nodes::As)

    COUNT(DISTINCT attribute) AS <as>



56
57
58
# File 'lib/activerecord/materialized/query_expressions.rb', line 56

def count_distinct_as(attribute, as:)
  attribute.count(true).as(as.to_s)
end

.length(attribute) ⇒ Arel::Nodes::NamedFunction

Returns LENGTH(attribute).

Returns:

  • (Arel::Nodes::NamedFunction)

    LENGTH(attribute)



61
62
63
# File 'lib/activerecord/materialized/query_expressions.rb', line 61

def length(attribute)
  Arel::Nodes::NamedFunction.new("LENGTH", [attribute])
end

.max_as(attribute, as:) ⇒ Arel::Nodes::As

Returns MAX(attribute) AS <as>.

Returns:

  • (Arel::Nodes::As)

    MAX(attribute) AS <as>



41
42
43
# File 'lib/activerecord/materialized/query_expressions.rb', line 41

def max_as(attribute, as:)
  attribute.maximum.as(as.to_s)
end

.min_as(attribute, as:) ⇒ Arel::Nodes::As

Returns MIN(attribute) AS <as>.

Returns:

  • (Arel::Nodes::As)

    MIN(attribute) AS <as>



36
37
38
# File 'lib/activerecord/materialized/query_expressions.rb', line 36

def min_as(attribute, as:)
  attribute.minimum.as(as.to_s)
end

.sum_as(attribute, as:) ⇒ Arel::Nodes::As

Returns SUM(attribute) AS <as>.

Returns:

  • (Arel::Nodes::As)

    SUM(attribute) AS <as>



26
27
28
# File 'lib/activerecord/materialized/query_expressions.rb', line 26

def sum_as(attribute, as:)
  attribute.sum.as(as.to_s)
end

.sum_length_as(attribute, as:) ⇒ Arel::Nodes::As

Returns SUM(LENGTH(attribute)) AS <as>.

Returns:

  • (Arel::Nodes::As)

    SUM(LENGTH(attribute)) AS <as>



66
67
68
# File 'lib/activerecord/materialized/query_expressions.rb', line 66

def sum_length_as(attribute, as:)
  length(attribute).sum.as(as.to_s)
end