mementus 0.3.4 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 68a2c93ad9bdaedbd2d5ca511da4ac9f7d37e032
4
- data.tar.gz: 4c91f58f3e77c009595759c4fc895f496bf2e8d1
3
+ metadata.gz: a24b4b584fd6dd3213786d5014b6f9c72f65be3c
4
+ data.tar.gz: a1660f7d12409486ffb8dbfdcde3de9cb44e1b08
5
5
  SHA512:
6
- metadata.gz: a3f45b1dd11463fb0259b7c48d4024b0e4de41652acec66d0ea9e531474c26eedf221e4ea2985b8e6fbb6e45c654e3f3fe7bbb392402b25349ef4df204d38ec7
7
- data.tar.gz: 822ede8244fb90e52fb8d489ab01b6822b9dadb2120911c1e26c184206405c574b75c1f53c6f84b62aac5d29e617e3024e68a9b86e81aa2bea290bbd0c16e7bf
6
+ metadata.gz: 84c9b24db29c6ce2f2f58f855727304880c3d72d02a4546a2962652732b07a4a3462f059637b0ad45cf8b279a8c456484216548f14c3b97802d653fc3a328820
7
+ data.tar.gz: 2185a04b77943a108dc6f66b02cb2f09965aaa424ff7b26b93ce52d448ff2fa8a0096904cecfceed17142426dcafe2dec6f10e9960f0eafaae7193a6b0783a25
@@ -1,12 +1,12 @@
1
1
  module Mementus
2
2
  class EdgeBuilder
3
- attr_reader :from, :to, :label
3
+ attr_reader :from, :to, :label, :id
4
4
 
5
- def initialize(from=nil, to=nil, label=:edge)
5
+ def initialize(from=nil, to=nil, label=:edge, id=nil)
6
6
  @from = from
7
7
  @to = to
8
8
  @label = label
9
- @id = nil
9
+ @id = id
10
10
  end
11
11
 
12
12
  def id=(id)
@@ -1,7 +1,9 @@
1
1
  module Mementus
2
2
  class GraphBuilder
3
3
  def initialize(is_directed)
4
- @structure = Structure::AdjacencyList.new(is_directed)
4
+ @structure = Structure::IncidenceList.new(is_directed)
5
+ @node_ids = IntegerId.new
6
+ @edge_ids = IntegerId.new
5
7
  end
6
8
 
7
9
  def add_node(node)
@@ -11,12 +13,14 @@ module Mementus
11
13
  def create_edge(&block)
12
14
  edge = EdgeBuilder.new
13
15
  yield edge
16
+ edge.id = @edge_ids.next_id unless edge.id
14
17
  @structure.add_edge(edge)
15
18
  end
16
19
 
17
20
  def create_node(&block)
18
21
  node = NodeBuilder.new
19
22
  yield node
23
+ node.id = @node_ids.next_id unless node.id
20
24
  @structure.add_node(node)
21
25
  end
22
26
 
data/lib/mementus/node.rb CHANGED
@@ -6,13 +6,5 @@ module Mementus
6
6
  @id = id
7
7
  @label = label
8
8
  end
9
-
10
- def id=(id)
11
- @id = id
12
- end
13
-
14
- def label=(label)
15
- @label = label
16
- end
17
9
  end
18
10
  end
@@ -0,0 +1,68 @@
1
+ module Mementus
2
+ module Structure
3
+ class IncidenceList
4
+ def initialize(is_directed=true)
5
+ @outgoing = {}
6
+ @incoming = {}
7
+ @nodes = {}
8
+ @edges = {}
9
+ @is_directed = is_directed
10
+ end
11
+
12
+ def is_directed?
13
+ @is_directed
14
+ end
15
+
16
+ def nodes_count
17
+ @nodes.count
18
+ end
19
+
20
+ def edges_count
21
+ @edges.count
22
+ end
23
+
24
+ def has_node?(node)
25
+ @nodes.key?(node.id)
26
+ end
27
+
28
+ def has_edge?(edge)
29
+ @edges.key?("#{edge.from.id},#{edge.to.id}")
30
+ end
31
+
32
+ def add_node(node)
33
+ @nodes[node.id] = node
34
+ @outgoing[node.id] ||= []
35
+ @incoming[node.id] ||= []
36
+ end
37
+
38
+ def add_edge(edge)
39
+ add_node(edge.from) unless has_node?(edge.from)
40
+ add_node(edge.to) unless has_node?(edge.to)
41
+
42
+ @edges["#{edge.from.id},#{edge.to.id}"] = edge
43
+ @outgoing[edge.from.id] << edge.to.id
44
+ @incoming[edge.to.id] << edge.from.id
45
+ end
46
+
47
+ def node(id)
48
+ NodeProxy.new(id, self)
49
+ end
50
+
51
+ def each_node(&block)
52
+ @nodes.values.each(&block)
53
+ end
54
+
55
+ def nodes
56
+ @nodes.keys.map { |id| NodeProxy.new(id, self) }
57
+ end
58
+
59
+ def adjacent(id)
60
+ @outgoing[id]
61
+ end
62
+
63
+ def each_adjacent(id, &blk)
64
+ @outgoing[id].each(&blk)
65
+ end
66
+ end
67
+ end
68
+ end
@@ -1,3 +1,3 @@
1
1
  module Mementus
2
- VERSION = '0.3.4'.freeze
2
+ VERSION = '0.3.5'.freeze
3
3
  end
data/spec/graph_spec.rb CHANGED
@@ -20,13 +20,14 @@ describe Mementus::Graph do
20
20
  specify '#create_node' do
21
21
  graph = Mementus::Graph.new do
22
22
  create_node do |node|
23
- node.id = 1
23
+ node.id = 20
24
24
  node.label = :vertex
25
25
  end
26
26
  end
27
27
 
28
28
  expect(graph.nodes_count).to eq(1)
29
29
  expect(graph.edges_count).to eq(0)
30
+ expect(graph.node(1).id).to eq(1)
30
31
  end
31
32
 
32
33
  specify '#add_edge' do
@@ -36,6 +37,8 @@ describe Mementus::Graph do
36
37
 
37
38
  expect(graph.nodes_count).to eq(2)
38
39
  expect(graph.edges_count).to eq(1)
40
+ expect(graph.node(1).id).to eq(1)
41
+ expect(graph.node(2).id).to eq(2)
39
42
  end
40
43
 
41
44
  specify '#create_edge' do
@@ -13,12 +13,24 @@ describe 'pipeline api' do
13
13
  node.label = :passage
14
14
  end
15
15
 
16
+ create_node do |node|
17
+ node.id = 4
18
+ node.label = :passage
19
+ end
20
+
16
21
  create_edge do |edge|
17
22
  edge.id = 3
18
23
  edge.from = 1
19
24
  edge.to = 2
20
25
  edge.label = :choice
21
26
  end
27
+
28
+ create_edge do |edge|
29
+ edge.id = 5
30
+ edge.from = 2
31
+ edge.to = 4
32
+ edge.label = :choice
33
+ end
22
34
  end
23
35
  end
24
36
 
@@ -34,6 +46,12 @@ describe 'pipeline api' do
34
46
  expect(pipeline.all.first.id).to eq(2)
35
47
  end
36
48
 
49
+ it 'traverses to second-degree outgoing nodes' do
50
+ pipeline = graph.n(1).out.out
51
+ expect(pipeline.all.count).to eq(1)
52
+ expect(pipeline.all.first.id).to eq(4)
53
+ end
54
+
37
55
  it 'traverses to outgoing edges' do
38
56
  pipeline = graph.n(1).out_e
39
57
  expect(pipeline.all.count).to eq(1)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mementus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - maetl
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-07 00:00:00.000000000 Z
11
+ date: 2016-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -82,6 +82,7 @@ files:
82
82
  - lib/mementus/query/step.rb
83
83
  - lib/mementus/query/traversal.rb
84
84
  - lib/mementus/structure/adjacency_list.rb
85
+ - lib/mementus/structure/incidence_list.rb
85
86
  - lib/mementus/version.rb
86
87
  - mementus.gemspec
87
88
  - spec/direction_spec.rb