Class: Philiprehberger::Batch::Result

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/philiprehberger/batch/result.rb

Overview

Holds the outcome of a batch processing run.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(processed:, errors:, total:, chunks:, elapsed:, halted: false, results: [], chunk_times: []) ⇒ Result

Returns a new instance of Result.

Parameters:

  • processed (Integer)

    successfully processed count

  • errors (Array<Hash>)

    error entries

  • total (Integer)

    total item count

  • chunks (Integer)

    number of chunks

  • elapsed (Float)

    elapsed time

  • halted (Boolean) (defaults to: false)

    whether processing was halted early

  • results (Array) (defaults to: [])

    collected results from processing

  • chunk_times (Array<Float>) (defaults to: [])

    per-chunk elapsed durations



35
36
37
38
39
40
41
42
43
44
# File 'lib/philiprehberger/batch/result.rb', line 35

def initialize(processed:, errors:, total:, chunks:, elapsed:, halted: false, results: [], chunk_times: [])
  @processed = processed
  @errors = errors
  @total = total
  @chunks = chunks
  @elapsed = elapsed
  @halted = halted
  @results = results
  @chunk_times = chunk_times
end

Instance Attribute Details

#chunksInteger (readonly)

Returns number of chunks processed.

Returns:

  • (Integer)

    number of chunks processed



19
20
21
# File 'lib/philiprehberger/batch/result.rb', line 19

def chunks
  @chunks
end

#elapsedFloat (readonly)

Returns elapsed time in seconds.

Returns:

  • (Float)

    elapsed time in seconds



22
23
24
# File 'lib/philiprehberger/batch/result.rb', line 22

def elapsed
  @elapsed
end

#errorsArray<Hash> (readonly)

Returns errors with :item and :error keys.

Returns:

  • (Array<Hash>)

    errors with :item and :error keys



13
14
15
# File 'lib/philiprehberger/batch/result.rb', line 13

def errors
  @errors
end

#processedInteger (readonly)

Returns number of items processed successfully.

Returns:

  • (Integer)

    number of items processed successfully



10
11
12
# File 'lib/philiprehberger/batch/result.rb', line 10

def processed
  @processed
end

#resultsArray (readonly)

Returns results collected from each processed item.

Returns:

  • (Array)

    results collected from each processed item



25
26
27
# File 'lib/philiprehberger/batch/result.rb', line 25

def results
  @results
end

#totalInteger (readonly)

Returns total number of items.

Returns:

  • (Integer)

    total number of items



16
17
18
# File 'lib/philiprehberger/batch/result.rb', line 16

def total
  @total
end

Instance Method Details

#countsHash

Count occurrences of each result value.

Returns:

  • (Hash)

    counts keyed by result value



79
80
81
# File 'lib/philiprehberger/batch/result.rb', line 79

def counts
  @results.tally
end

#each {|item_result| ... } ⇒ Enumerator

Iterate over all collected item results.

Yields:

  • (item_result)

    each result value

Returns:

  • (Enumerator)

    if no block given



64
65
66
# File 'lib/philiprehberger/batch/result.rb', line 64

def each(&)
  @results.each(&)
end

#flat_map {|item_result| ... } ⇒ Array

Map over all collected item results and flatten one level.

Yields:

  • (item_result)

    each result value

Returns:

  • (Array)

    flattened mapped results



72
73
74
# File 'lib/philiprehberger/batch/result.rb', line 72

def flat_map(&)
  @results.flat_map(&)
end

#group_by {|item_result| ... } ⇒ Hash

Group results by the return value of the block.

Yields:

  • (item_result)

    each result value

Returns:

  • (Hash)

    grouped results



87
88
89
# File 'lib/philiprehberger/batch/result.rb', line 87

def group_by(&)
  @results.group_by(&)
end

#halted?Boolean

Check if processing was halted early by an error handler returning :halt.

Returns:

  • (Boolean)


56
57
58
# File 'lib/philiprehberger/batch/result.rb', line 56

def halted?
  @halted
end

#success?Boolean

Check if all items were processed without errors.

Returns:

  • (Boolean)


49
50
51
# File 'lib/philiprehberger/batch/result.rb', line 49

def success?
  @errors.empty?
end

#success_rateFloat

Ratio of successfully processed items to total items.

Returns 1.0 for empty batches (no items to fail).

Returns:

  • (Float)

    value in the range [0.0, 1.0]



96
97
98
99
100
# File 'lib/philiprehberger/batch/result.rb', line 96

def success_rate
  return 1.0 if @total.zero?

  @processed.to_f / @total
end

#timingHash

Timing statistics for the batch run.

Returns:

  • (Hash)

    timing breakdown with :total, :per_chunk, :per_item, :fastest_chunk, :slowest_chunk



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/philiprehberger/batch/result.rb', line 105

def timing
  if @chunk_times.empty?
    return {
      total: @elapsed,
      per_chunk: 0.0,
      per_item: 0.0,
      fastest_chunk: 0.0,
      slowest_chunk: 0.0
    }
  end

  {
    total: @elapsed,
    per_chunk: @elapsed / @chunk_times.size,
    per_item: @total.zero? ? 0.0 : @elapsed / @total,
    fastest_chunk: @chunk_times.min,
    slowest_chunk: @chunk_times.max
  }
end