Class: Draisine::Partitioner

Inherits:
Object
  • Object
show all
Defined in:
lib/draisine/partitioner.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(model_class, mechanism = :default) ⇒ Partitioner

Returns a new instance of Partitioner.



24
25
26
27
# File 'lib/draisine/partitioner.rb', line 24

def initialize(model_class, mechanism = :default)
  @model_class = model_class
  @mechanism = QueryMechanisms.fetch(mechanism).new(model_class)
end

Instance Attribute Details

#mechanismObject (readonly)

Returns the value of attribute mechanism.



23
24
25
# File 'lib/draisine/partitioner.rb', line 23

def mechanism
  @mechanism
end

#model_classObject (readonly)

Returns the value of attribute model_class.



23
24
25
# File 'lib/draisine/partitioner.rb', line 23

def model_class
  @model_class
end

Class Method Details

.partition(model_class:, start_date:, end_date:, partition_size: 100, mechanism: :default) ⇒ Object



19
20
21
# File 'lib/draisine/partitioner.rb', line 19

def self.partition(model_class:, start_date:, end_date:, partition_size: 100, mechanism: :default)
  new(model_class, mechanism).partition(start_date, end_date, partition_size: partition_size)
end

Instance Method Details

#partition(start_date, end_date, partition_size: 100) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/draisine/partitioner.rb', line 29

def partition(start_date, end_date, partition_size: 100)
  updated_ids = get_updated_ids(start_date, end_date)
  deleted_ids = get_deleted_ids(start_date, end_date)
  unpersisted_ids = get_unpersisted_ids(start_date, end_date)

  # if anyone knows how to do this packing procedure better, please tell me
  all_ids = updated_ids.map {|id| [:updated, id] } +
            deleted_ids.map {|id| [:deleted, id] } +
            unpersisted_ids.map {|id| [:unpersisted, id] }

  if all_ids.present?
    all_ids.each_slice(partition_size).map do |slice|
      part = slice.group_by(&:first).map {|k,v| [k, v.map(&:last)] }.to_h
      Partition.new(model_class.name, start_date, end_date, part[:updated], part[:deleted], part[:unpersisted])
    end
  else
    [Partition.new(model_class.name, start_date, end_date)]
  end
end