Class: PaperTrailDiff::ActivityTransactionGroups
- Inherits:
-
Object
- Object
- PaperTrailDiff::ActivityTransactionGroups
- Defined in:
- lib/paper_trail_diff/activity_event.rb,
sig/generated/paper_trail_diff/activity_event.rbs
Overview
Resolves the branch union that PT-AT exposes atomically for one transaction.
Instance Method Summary collapse
-
#branches_for(event) ⇒ Array[String]?
: (ActivityEvent) -> Array?.
-
#build_groups(groups) ⇒ Hash[Array[untyped], Array[String]?]
: (Hash[Array[untyped], Array[ActivityEvent]]) -> Hash[Array[untyped], Array[String]?].
- #group_branches(events) ⇒ Array[String]?
-
#grouped_events(events) ⇒ Hash[Array[untyped], Array[ActivityEvent]]
: (Array) -> Hash[Array[untyped], Array[ActivityEvent]].
-
#initialize(events) ⇒ ActivityTransactionGroups
constructor
: (Array) -> void.
-
#isolated?(event) ⇒ Boolean
: (ActivityEvent) -> bool.
-
#transaction_key(event) ⇒ Array[untyped]?
: (ActivityEvent) -> Array?.
Constructor Details
#initialize(events) ⇒ ActivityTransactionGroups
: (Array) -> void
68 69 70 71 72 |
# File 'lib/paper_trail_diff/activity_event.rb', line 68 def initialize(events) groups = grouped_events(events) @branches = build_groups(groups) @group_sizes = groups.transform_values(&:length) end |
Instance Method Details
#branches_for(event) ⇒ Array[String]?
: (ActivityEvent) -> Array?
75 76 77 78 79 80 |
# File 'lib/paper_trail_diff/activity_event.rb', line 75 def branches_for(event) key = transaction_key(event) return event.branches unless key && @branches.key?(key) @branches[key] end |
#build_groups(groups) ⇒ Hash[Array[untyped], Array[String]?]
: (Hash[Array[untyped], Array[ActivityEvent]]) -> Hash[Array[untyped], Array[String]?]
94 95 96 97 98 |
# File 'lib/paper_trail_diff/activity_event.rb', line 94 def build_groups(groups) groups.to_h do |key, selected_events| [key, group_branches(selected_events)] end end |
#group_branches(events) ⇒ Array[String]?
114 115 116 117 118 |
# File 'lib/paper_trail_diff/activity_event.rb', line 114 def group_branches(events) return if events.any?(&:root?) events.flat_map { |event| event.branches || [] }.uniq.sort.freeze end |
#grouped_events(events) ⇒ Hash[Array[untyped], Array[ActivityEvent]]
: (Array) -> Hash[Array[untyped], Array[ActivityEvent]]
101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/paper_trail_diff/activity_event.rb', line 101 def grouped_events(events) groups = {} #: Hash[Array[untyped], Array[ActivityEvent]] events.each do |event| key = transaction_key(event) next unless key groups[key] ||= [] #: Array[ActivityEvent] groups[key] << event end groups end |
#isolated?(event) ⇒ Boolean
: (ActivityEvent) -> bool
83 84 85 86 |
# File 'lib/paper_trail_diff/activity_event.rb', line 83 def isolated?(event) key = transaction_key(event) !key || @group_sizes.fetch(key, 0) == 1 end |
#transaction_key(event) ⇒ Array[untyped]?
: (ActivityEvent) -> Array?
121 122 123 124 125 126 |
# File 'lib/paper_trail_diff/activity_event.rb', line 121 def transaction_key(event) version = event.version return unless version.respond_to?(:transaction_id) && version.transaction_id [version.class.name, version.transaction_id] end |