Class: Textus::Infra::Store::LinkStore
- Inherits:
-
Object
- Object
- Textus::Infra::Store::LinkStore
- Defined in:
- lib/textus/infra/store/link_store.rb
Instance Method Summary collapse
- #add_edge(from_key:, to_key:) ⇒ Object (also: #record)
-
#initialize(database) ⇒ LinkStore
constructor
A new instance of LinkStore.
- #links_from(key) ⇒ Object
- #links_to(key) ⇒ Object
- #reachable(from:, depth: nil) ⇒ Object
- #remove_edge(from_key:, to_key:) ⇒ Object
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 |
#links_from(key) ⇒ Object
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 |
#links_to(key) ⇒ Object
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 |