Class: FastCov::TestMap::Aggregator

Inherits:
Object
  • Object
show all
Defined in:
lib/fast_cov/test_map/aggregator.rb

Overview

Handles k-way merge of sorted fragment files. Created by TestMap.aggregate, not instantiated directly.

Usage:

aggregator = FastCov::TestMap.aggregate(Dir["tmp/test_mapping.*.gz"])
aggregator.on(:sorted) { |elapsed| puts "Sorted in #{elapsed.round(2)}s" }
aggregator.on(:merged) { |files, elapsed| puts "Merged #{files} files in #{elapsed.round(2)}s" }
aggregator.each(10_000) { |batch| database.bulk_write(batch) }

Instance Method Summary collapse

Constructor Details

#initialize(fragment_paths, max_readers) ⇒ Aggregator

Returns a new instance of Aggregator.



17
18
19
20
21
# File 'lib/fast_cov/test_map/aggregator.rb', line 17

def initialize(fragment_paths, max_readers)
  @fragment_paths = fragment_paths
  @max_readers = max_readers
  @hooks = {}
end

Instance Method Details

#each(batch_size = 1, &block) ⇒ Object

Iterate over merged results. Yields a Hash of { file => dependencies } per batch. Default batch_size is 1.

Raises:

  • (ArgumentError)


38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/fast_cov/test_map/aggregator.rb', line 38

def each(batch_size = 1, &block)
  raise ArgumentError, "each requires a block" unless block
  return if @fragment_paths.empty?

  Dir.mktmpdir("fastcov") do |tmpdir|
    intermediates, total_lines = create_intermediates(tmpdir)
    readers = intermediates.map { |f| Reader.new(f) }
    kway_merge(readers, batch_size, total_lines, &block)
  ensure
    readers&.each(&:close)
  end
end

#on(event, &block) ⇒ Object

Register a callback for an aggregation event.

Events:

:sort    — before sorting. Yields (fragment_count, batch_count)
:sorted  — after sorting. Yields (elapsed)
:merge   — during merge. Yields (processed_lines, total_lines)
:merged  — after merging. Yields (file_count, elapsed)


30
31
32
33
# File 'lib/fast_cov/test_map/aggregator.rb', line 30

def on(event, &block)
  @hooks[event] = block
  self
end