Module: Wherever::Recalculate

Included in:
Wherever
Defined in:
lib/wherever/wherever/recalculate.rb

Instance Method Summary collapse

Instance Method Details

#recalculate(name) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/wherever/wherever/recalculate.rb', line 3

def recalculate(name)
  keys = get_lookup(name).keys
  
  recalculate_identifier

  groups = config.key_groups
  groups_with_key, groups_without_key = groups.partition do |group|
    group & keys == keys
  end
  
  groups_with_key.each do |group|
    recalculate_with_key(group)
  end
  
  @summing.each do |group, options|
    groups_without_key.delete(group)
    get_key_store(*group).datasets.delete_all
    sum_group_for(StringHelper.add_method_to_id(group, false), options)
  end
  groups_without_key.each do |group|
    get_key_store(*group).datasets.delete_all
    identifier_set.datasets.all.each do |record|
      for_group(group, record.values, record, false)
    end
  end
end

#recalculate_identifierObject



43
44
45
46
47
48
# File 'lib/wherever/wherever/recalculate.rb', line 43

def recalculate_identifier
  identifier_set.datasets.all.each do |record|
    @grouping.call(record.values, nil, record, config.keys)
    record.save!
  end
end

#recalculate_with_key(group) ⇒ Object



50
51
52
53
54
55
# File 'lib/wherever/wherever/recalculate.rb', line 50

def recalculate_with_key(group)
  get_key_store(*group).datasets.all.each do |record|
    @grouping.call(record.values, nil, record, group)
    record.save!
  end
end

#sum_group_for(group, options) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/wherever/wherever/recalculate.rb', line 30

def sum_group_for(group, options)
  group_by = options['group_by'] || lambda do |record| 
    group.inject({}) { |r, v| r[v.to_id] = record[v.to_id]; r }
  end
  summer = options['summer'] || raise('Summer must be set.')
  source = options['source'] || ['identifier']
  
  grouped = get_key_store(*source).datasets.all.group_by{|record| group_by.call(record)}
  grouped.map do |key, records|
    get_key_store(*group).datasets.create(key.merge(summer.call(records)))
  end
end