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 +4 -4
- data/lib/mementus/edge_builder.rb +3 -3
- data/lib/mementus/graph_builder.rb +5 -1
- data/lib/mementus/node.rb +0 -8
- data/lib/mementus/structure/incidence_list.rb +68 -0
- data/lib/mementus/version.rb +1 -1
- data/spec/graph_spec.rb +4 -1
- data/spec/pipeline_spec.rb +18 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a24b4b584fd6dd3213786d5014b6f9c72f65be3c
|
4
|
+
data.tar.gz: a1660f7d12409486ffb8dbfdcde3de9cb44e1b08
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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 =
|
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::
|
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
@@ -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
|
data/lib/mementus/version.rb
CHANGED
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 =
|
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
|
data/spec/pipeline_spec.rb
CHANGED
@@ -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
|
+
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-
|
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
|