Class: Textus::Infra::Store::LinkStore

Inherits:
Object
  • Object
show all
Defined in:
lib/textus/infra/store/link_store.rb

Instance Method Summary collapse

Constructor Details

#initialize(database) ⇒ LinkStore

Returns a new instance of LinkStore.



5
6
7
# File 'lib/textus/infra/store/link_store.rb', line 5

def initialize(database)
  @db = database
end

Instance Method Details

#add_edge(from_key:, to_key:) ⇒ Object Also known as: record



9
10
11
# File 'lib/textus/infra/store/link_store.rb', line 9

def add_edge(from_key:, to_key:)
  @db[:link_edges].insert_ignore.insert(from_key:, to_key:)
end


18
19
20
# File 'lib/textus/infra/store/link_store.rb', line 18

def links_from(key)
  @db[:link_edges].where(from_key: key).select_map(:to_key)
end


22
23
24
# File 'lib/textus/infra/store/link_store.rb', line 22

def links_to(key)
  @db[:link_edges].where(to_key: key).select_map(:from_key)
end

#reachable(from:, depth: nil) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/textus/infra/store/link_store.rb', line 26

def reachable(from:, depth: nil)
  visited = Set.new
  queue = [[from, 0]]
  while queue.any?
    current, d = queue.shift
    next if visited.include?(current)
    next if depth && d > depth

    visited.add(current)
    links_from(current).each { |to| queue << [to, d + 1] }
  end
  visited.delete(from)
  visited.to_a
end

#remove_edge(from_key:, to_key:) ⇒ Object



14
15
16
# File 'lib/textus/infra/store/link_store.rb', line 14

def remove_edge(from_key:, to_key:)
  @db[:link_edges].where(from_key:, to_key:).delete
end