Class: Archsight::Annotations::ComputedRelationResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/archsight/annotations/relation_resolver.rb

Overview

ComputedRelationResolver provides methods for traversing resource relations. It mirrors the relation traversal operators in the query language:

  • outgoing (->): Direct outgoing relations

  • outgoing_transitive (~>): Transitive outgoing relations

  • incoming (<-): Direct incoming relations

  • incoming_transitive (<~): Transitive incoming relations

Filter parameter can be:

  • Symbol: Simple kind filter (e.g., :TechnologyArtifact)

  • String: Query selector (e.g., ‘TechnologyArtifact: activity/status == “active”’)

Constant Summary collapse

MAX_DEPTH =
10

Instance Method Summary collapse

Constructor Details

#initialize(instance, database) ⇒ ComputedRelationResolver

Returns a new instance of ComputedRelationResolver.



16
17
18
19
20
# File 'lib/archsight/annotations/relation_resolver.rb', line 16

def initialize(instance, database)
  @instance = instance
  @database = database
  @query_cache = {}
end

Instance Method Details

#incoming(filter = nil) ⇒ Array

Get direct incoming relations (<- Kind) Uses the references array maintained during relation resolution

Parameters:

  • filter (Symbol, String, nil) (defaults to: nil)

    Optional kind filter (Symbol) or query selector (String)

Returns:

  • (Array)

    Array of instances that reference this one



55
56
57
58
59
60
61
62
63
64
65
# File 'lib/archsight/annotations/relation_resolver.rb', line 55

def incoming(filter = nil)
  refs = @instance.references || []
  # Extract instances from reference hashes
  instances = refs.map { |ref| ref.is_a?(Hash) ? ref[:instance] : ref }.compact

  if filter.nil?
    instances
  else
    instances.select { |ref| matches_filter?(ref, filter) }
  end
end

#incoming_transitive(filter = nil, max_depth: MAX_DEPTH) ⇒ Array

Get transitive incoming relations (<~ Kind) Follows all reverse relation chains up to max_depth

Parameters:

  • filter (Symbol, String, nil) (defaults to: nil)

    Optional kind filter (Symbol) or query selector (String)

  • max_depth (Integer) (defaults to: MAX_DEPTH)

    Maximum traversal depth (default 10)

Returns:

  • (Array)

    Array of instances that transitively reference this one



72
73
74
75
76
77
78
# File 'lib/archsight/annotations/relation_resolver.rb', line 72

def incoming_transitive(filter = nil, max_depth: MAX_DEPTH)
  visited = Set.new
  results = []

  collect_transitive_incoming(@instance, filter, visited, 0, max_depth, results)
  results.uniq
end

#outgoing(filter = nil) ⇒ Array

Get direct outgoing relations (-> Kind)

Parameters:

  • filter (Symbol, String, nil) (defaults to: nil)

    Optional kind filter (Symbol) or query selector (String)

Returns:

  • (Array)

    Array of related instances



25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/archsight/annotations/relation_resolver.rb', line 25

def outgoing(filter = nil)
  results = []

  @instance.class.relations.each do |_verb, kind_name, _klass_name|
    rels = @instance.relations(_verb, kind_name)
    rels.each do |rel|
      results << rel if matches_filter?(rel, filter)
    end
  end

  results.uniq
end

#outgoing_transitive(filter = nil, max_depth: MAX_DEPTH) ⇒ Array

Get transitive outgoing relations (~> Kind) Follows all relation chains up to max_depth

Parameters:

  • filter (Symbol, String, nil) (defaults to: nil)

    Optional kind filter (Symbol) or query selector (String)

  • max_depth (Integer) (defaults to: MAX_DEPTH)

    Maximum traversal depth (default 10)

Returns:

  • (Array)

    Array of transitively related instances



43
44
45
46
47
48
49
# File 'lib/archsight/annotations/relation_resolver.rb', line 43

def outgoing_transitive(filter = nil, max_depth: MAX_DEPTH)
  visited = Set.new
  results = []

  collect_transitive_outgoing(@instance, filter, visited, 0, max_depth, results)
  results.uniq
end