Class: Upkeep::DAG::SubscriptionShape::Trace

Inherits:
Object
  • Object
show all
Defined in:
lib/upkeep/dag/subscription_shape.rb

Instance Method Summary collapse

Constructor Details

#initialize(graph_version:) ⇒ Trace

Returns a new instance of Trace.



162
163
164
165
166
167
168
169
170
171
172
# File 'lib/upkeep/dag/subscription_shape.rb', line 162

def initialize(graph_version:)
  @graph_version = graph_version
  @seen_frame_ids = {}
  @seen_dependency_keys = {}
  @seen_dependency_owner_ids_by_key = Hash.new { |owners, dependency_key| owners[dependency_key] = {} }
  @seen_contains_edges = {}
  @digest = Digest::SHA256.new
  @digest.update("subscription-shape-trace")
  @invalid = false
  @recorded = false
end

Instance Method Details

#covers?(graph) ⇒ Boolean

Returns:

  • (Boolean)


215
216
217
# File 'lib/upkeep/dag/subscription_shape.rb', line 215

def covers?(graph)
  synchronized_with?(graph) && (recorded? || graph_shape_empty?(graph))
end

#invalidate!Object



178
179
180
# File 'lib/upkeep/dag/subscription_shape.rb', line 178

def invalidate!
  @invalid = true
end

#record_dependency(owner_id, dependency, graph_version:) ⇒ Object



198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'lib/upkeep/dag/subscription_shape.rb', line 198

def record_dependency(owner_id, dependency, graph_version:)
  return if @invalid

  dependency_cache_key = dependency.cache_key
  unless @seen_dependency_keys.key?(dependency_cache_key)
    @seen_dependency_keys[dependency_cache_key] = true
    dependency_payload = SubscriptionShape.shape_value(dependency.to_h)
    record_digest_term(:dependency, SubscriptionShape.canonical_term(:dependency, dependency_cache_key, dependency_payload))
  end
  unless @seen_dependency_owner_ids_by_key[dependency_cache_key].key?(owner_id)
    @seen_dependency_owner_ids_by_key[dependency_cache_key][owner_id] = true
    record_digest_term(:dependency_owner, SubscriptionShape.canonical_term(:dependency_owner, dependency_cache_key, owner_id))
  end
  @recorded = true
  @graph_version = graph_version
end

#record_frame(frame_id, metadata, parent_id:, graph_version:) ⇒ Object



182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# File 'lib/upkeep/dag/subscription_shape.rb', line 182

def record_frame(frame_id, , parent_id:, graph_version:)
  return if @invalid

  unless @seen_frame_ids.key?(frame_id)
    @seen_frame_ids[frame_id] = true
    record_digest_term(:frame, SubscriptionShape.frame_term(frame_id, ))
  end
  edge_key = [parent_id, frame_id]
  unless @seen_contains_edges.key?(edge_key)
    @seen_contains_edges[edge_key] = true
    record_digest_term(:contains, SubscriptionShape.contains_term(parent_id, frame_id))
  end
  @recorded = true
  @graph_version = graph_version
end

#subscription_shape(request_signature: nil) ⇒ Object



219
220
221
# File 'lib/upkeep/dag/subscription_shape.rb', line 219

def subscription_shape(request_signature: nil)
  SubscriptionShape.from_trace_digest(@digest.hexdigest, request_signature: request_signature)
end

#synchronized_with?(graph) ⇒ Boolean

Returns:

  • (Boolean)


174
175
176
# File 'lib/upkeep/dag/subscription_shape.rb', line 174

def synchronized_with?(graph)
  !@invalid && @graph_version == graph.version
end