Module: CrossTable::Grouping

Defined in:
lib/cross_table/grouping.rb

Overview

group process

Class Method Summary collapse

Class Method Details

.avgs(recs, field, group_rules) ⇒ Object



35
36
37
38
39
40
41
# File 'lib/cross_table/grouping.rb', line 35

def avgs(recs, field, group_rules)
  group(recs, group_rules) do |group_recs|
    sum = group_recs.map { |r| r[field] }.sum
    count = group_recs.count
    sum.to_f / count.to_f
  end
end

.counts(recs, group_rules) ⇒ Object



25
26
27
# File 'lib/cross_table/grouping.rb', line 25

def counts(recs, group_rules)
  group(recs, group_rules, &:count)
end

.group(recs, group_rules, &aggr_proc) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/cross_table/grouping.rb', line 8

def group(recs, group_rules, &aggr_proc)
  all_titles  = product_all(group_rules.map(&:keys))
  all_procs   = product_all(group_rules.map(&:values))

  auto_dig_hash = Hash.new { |h, k| h[k] = h.class.new(&h.default_proc) }
  all_titles.zip(all_procs).each do |dig_keys, filter_procs|
    group_recs = filter_procs.reduce(recs) do |memo, proc|
      memo.select(&proc)
    end
    value = aggr_proc[group_recs]

    last_key = dig_keys.pop
    auto_dig_hash.dig(*dig_keys).store(last_key, value)
  end
  auto_dig_hash
end

.sums(recs, field, group_rules) ⇒ Object



29
30
31
32
33
# File 'lib/cross_table/grouping.rb', line 29

def sums(recs, field, group_rules)
  group(recs, group_rules) do |group_recs|
    group_recs.map { |r| r[field] }.sum
  end
end