mementus 0.3.4 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
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