Class: FastCov::TestMap::Aggregator
- Inherits:
-
Object
- Object
- FastCov::TestMap::Aggregator
- 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
-
#each(batch_size = 1, &block) ⇒ Object
Iterate over merged results.
-
#initialize(fragment_paths, max_readers) ⇒ Aggregator
constructor
A new instance of Aggregator.
-
#on(event, &block) ⇒ Object
Register a callback for an aggregation event.
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.
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 |