red_grape 0.0.1 → 0.0.2
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.
- data/Manifest.txt +25 -10
- data/README.txt +54 -5
- data/bin/redgrape +77 -0
- data/data/graph-example-2.xml +26380 -0
- data/lib/ext/array_ext.rb +41 -0
- data/lib/ext/object_ext.rb +16 -0
- data/lib/red_grape/edge.rb +4 -17
- data/lib/red_grape/{propertied_object.rb → element.rb} +26 -4
- data/lib/red_grape/graph.rb +75 -73
- data/lib/red_grape/path_group.rb +5 -9
- data/lib/red_grape/pipe/aggregate_pipe.rb +13 -0
- data/lib/red_grape/pipe/as_pipe.rb +3 -10
- data/lib/red_grape/pipe/back_pipe.rb +1 -8
- data/lib/red_grape/pipe/base.rb +51 -6
- data/lib/red_grape/pipe/cap_pipe.rb +16 -0
- data/lib/red_grape/pipe/context.rb +64 -3
- data/lib/red_grape/pipe/except_pipe.rb +15 -0
- data/lib/red_grape/pipe/fill_pipe.rb +19 -0
- data/lib/red_grape/pipe/filter_pipe.rb +1 -7
- data/lib/red_grape/pipe/group_count_pipe.rb +17 -0
- data/lib/red_grape/pipe/has_pipe.rb +24 -0
- data/lib/red_grape/pipe/if_then_else_pipe.rb +1 -7
- data/lib/red_grape/pipe/in_pipe.rb +12 -15
- data/lib/red_grape/pipe/in_v_pipe.rb +12 -0
- data/lib/red_grape/pipe/loop_pipe.rb +16 -25
- data/lib/red_grape/pipe/out_e_pipe.rb +25 -0
- data/lib/red_grape/pipe/out_pipe.rb +6 -15
- data/lib/red_grape/pipe/paths_pipe.rb +21 -9
- data/lib/red_grape/pipe/property_pipe.rb +2 -11
- data/lib/red_grape/pipe/retain_pipe.rb +16 -0
- data/lib/red_grape/pipe/transform_pipe.rb +3 -11
- data/lib/red_grape/property_description.rb +6 -0
- data/lib/red_grape/serializer/graphml_serializer.rb +73 -0
- data/lib/red_grape/vertex.rb +7 -20
- data/lib/red_grape.rb +15 -6
- data/test/{test_propertied_object.rb → test_element.rb} +5 -5
- data/test/test_graph.rb +10 -19
- data/test/test_on_the_nature_of_pipes.rb +13 -13
- data/test/test_pipe.rb +16 -0
- data/test/test_pipe_base.rb +17 -0
- data/test/test_traversal_patterns.rb +69 -0
- metadata +38 -22
- data/bin/red_grape +0 -3
- data/lib/red_grape/vertex_group.rb +0 -72
- data/test/test_red_grape.rb +0 -8
@@ -9,10 +9,10 @@ class OnTheNatureOfPipesTest < Test::Unit::TestCase
|
|
9
9
|
|
10
10
|
def test_basic
|
11
11
|
assert_equal '1',
|
12
|
-
@graph.v(1).
|
12
|
+
@graph.v(1).id
|
13
13
|
|
14
14
|
assert_equal %w(2 3 4),
|
15
|
-
@graph.v(1).out.take.map(&:
|
15
|
+
@graph.v(1).out.take.map(&:id).sort
|
16
16
|
|
17
17
|
assert_equal %w(josh lop vadas),
|
18
18
|
@graph.v(1).out.name.take.sort
|
@@ -30,12 +30,12 @@ class OnTheNatureOfPipesTest < Test::Unit::TestCase
|
|
30
30
|
|
31
31
|
def test_filter
|
32
32
|
assert_equal %w(2 4),
|
33
|
-
@graph.v(1).out('knows').take.map(&:
|
33
|
+
@graph.v(1).out('knows').take.map(&:id).sort
|
34
34
|
|
35
|
-
assert_equal %
|
36
|
-
@graph.v(1).out('knows').filter{it.age < 30}.take.map(&:
|
35
|
+
assert_equal %w(2),
|
36
|
+
@graph.v(1).out('knows').filter{it.age < 30}.take.map(&:id).sort
|
37
37
|
|
38
|
-
assert_equal %
|
38
|
+
assert_equal %w(vadas),
|
39
39
|
@graph.v(1).out('knows').filter{it.age < 30}.name.take.sort
|
40
40
|
|
41
41
|
assert_equal [5],
|
@@ -50,13 +50,13 @@ class OnTheNatureOfPipesTest < Test::Unit::TestCase
|
|
50
50
|
@graph.v(1).side_effect{@x = it}.take.name
|
51
51
|
|
52
52
|
assert_equal %w(3),
|
53
|
-
@graph.v(1).side_effect{@x = it}.out('created').take.map(&:
|
53
|
+
@graph.v(1).side_effect{@x = it}.out('created').take.map(&:id).sort
|
54
54
|
|
55
55
|
assert_equal %w(1 4 6),
|
56
|
-
@graph.v(1).side_effect{@x = it}.out('created').in('created').take.map(&:
|
56
|
+
@graph.v(1).side_effect{@x = it}.out('created').in('created').take.map(&:id).sort
|
57
57
|
|
58
58
|
assert_equal %w(4 6),
|
59
|
-
@graph.v(1).side_effect{@x = it}.out('created').in('created').filter{it != @x}.take.map(&:
|
59
|
+
@graph.v(1).side_effect{@x = it}.out('created').in('created').filter{it != @x}.take.map(&:id).sort
|
60
60
|
|
61
61
|
assert_equal %w(SideEffectPipe OutPipe(created) InPipe(created) FilterPipe),
|
62
62
|
@graph.v(1).side_effect{@x = it}.out('created').in('created').filter{it != @x}.to_a
|
@@ -76,21 +76,21 @@ class OnTheNatureOfPipesTest < Test::Unit::TestCase
|
|
76
76
|
@graph.v(1).out('knows').name.filter{it[0] == 'v'}.take.to_a
|
77
77
|
|
78
78
|
assert_equal %w(2),
|
79
|
-
@graph.v(1).out('knows').name.filter{it[0] == 'v'}.back(2).take.to_a.map(&:
|
79
|
+
@graph.v(1).out('knows').name.filter{it[0] == 'v'}.back(2).take.to_a.map(&:id)
|
80
80
|
|
81
81
|
assert_equal %w(OutPipe(knows) PropertyPipe(name) FilterPipe BackPipe),
|
82
82
|
@graph.v(1).out('knows').name.filter{it[0] == 'v'}.back(2).to_a
|
83
83
|
|
84
84
|
assert_equal %w(2 4),
|
85
|
-
@graph.v(1).out('knows').as('here').name.filter{it[0] == 'v'}.back('here').take.to_a.map(&:
|
85
|
+
@graph.v(1).out('knows').as('here').name.filter{it[0] == 'v'}.back('here').take.to_a.map(&:id)
|
86
86
|
end
|
87
87
|
|
88
88
|
def test_loop
|
89
89
|
assert_equal %w(3 5),
|
90
|
-
@graph.v(1).out.out.take.to_a.map(&:
|
90
|
+
@graph.v(1).out.out.take.to_a.map(&:id).sort
|
91
91
|
|
92
92
|
assert_equal %w(3 5),
|
93
|
-
@graph.v(1).out.loop(1){loops < 3}.take.to_a.map(&:
|
93
|
+
@graph.v(1).out.loop(1){loops < 3}.take.to_a.map(&:id).sort
|
94
94
|
|
95
95
|
assert_equal %w(lop ripple),
|
96
96
|
@graph.v(1).out.loop(1){loops < 3}.name.take.sort
|
data/test/test_pipe.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'red_grape'
|
3
|
+
|
4
|
+
class PipeTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@graph = RedGrape.load_graph 'data/graph-example-1.xml'
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_set_auto_take
|
10
|
+
assert !RedGrape::Pipe.auto_take
|
11
|
+
RedGrape::Pipe.set_auto_take
|
12
|
+
assert RedGrape::Pipe.auto_take
|
13
|
+
RedGrape::Pipe.set_auto_take false
|
14
|
+
assert !RedGrape::Pipe.auto_take
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'red_grape'
|
3
|
+
|
4
|
+
class PipeBaseTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@graph = RedGrape.load_graph 'data/graph-example-1.xml'
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_to_s
|
10
|
+
assert !RedGrape::Pipe.auto_take
|
11
|
+
assert(@graph.v(1).out.name.to_s =~ /#<RedGrape::Pipe::PropertyPipe:0x.*>/)
|
12
|
+
RedGrape::Pipe.set_auto_take
|
13
|
+
assert_equal %w(vadas josh lop).to_s, @graph.v(1).out.name.to_s
|
14
|
+
RedGrape::Pipe.set_auto_take false
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -14,5 +14,74 @@ class TraversalPatternsTest < Test::Unit::TestCase
|
|
14
14
|
|
15
15
|
# https://github.com/tinkerpop/gremlin/wiki/Except-Retain-Pattern
|
16
16
|
def test_except_retain_pattern
|
17
|
+
assert_equal %w(2 3 4), @graph.v(1).out.take.map(&:id).sort
|
18
|
+
assert_equal %w(3 5), @graph.v(1).out.out.take.map(&:id).sort
|
19
|
+
assert_equal %w(5), @graph.v(1).out.aggregate(:x).out.except(:x).take.map(&:id).sort
|
20
|
+
assert_equal %w(3), @graph.v(1).out.aggregate(:x).out.retain(:x).take.map(&:id).sort
|
21
|
+
end
|
22
|
+
|
23
|
+
# https://github.com/tinkerpop/gremlin/wiki/Flow-Rank-Pattern
|
24
|
+
def test_flow_rank_pattern
|
25
|
+
assert_equal %w(3 5), @graph.V('lang', 'java').map(&:id).sort
|
26
|
+
software = []
|
27
|
+
@graph.V('lang', 'java').fill(software).take
|
28
|
+
assert_equal %w(3 5), software.map(&:id).sort
|
29
|
+
assert_equal %w(marko josh peter josh), software._.in('created').name.take
|
30
|
+
assert_equal(
|
31
|
+
{'marko' => 1, 'josh' => 2, 'peter' => 1},
|
32
|
+
software._.in('created').name.groupCount.cap.take
|
33
|
+
)
|
34
|
+
|
35
|
+
m = {}
|
36
|
+
assert_equal %w(marko josh peter josh), software._.in('created').name.groupCount(m).take
|
37
|
+
assert_equal({'marko' => 1, 'josh' => 2, 'peter' => 1}, m)
|
38
|
+
end
|
39
|
+
|
40
|
+
# https://github.com/tinkerpop/gremlin/wiki/Path-Pattern
|
41
|
+
def test_path_pattern
|
42
|
+
assert_equal %w(josh lop vadas), @graph.v(1).out.name.take.sort
|
43
|
+
|
44
|
+
path = @graph.v(1).out.name.path.take
|
45
|
+
assert_equal 3, path.size
|
46
|
+
assert_equal 3, path.first.size
|
47
|
+
assert_equal '[[v[1], v[2], "vadas"], [v[1], v[4], "josh"], [v[1], v[3], "lop"]]', path.to_s
|
48
|
+
|
49
|
+
path = @graph.v(1).outE.inV.name.path.take
|
50
|
+
assert_equal '[[v[1], e[7][1-knows->2], v[2], "vadas"], [v[1], e[8][1-knows->4], v[4], "josh"], [v[1], e[9][1-created->3], v[3], "lop"]]', path.to_s
|
51
|
+
|
52
|
+
assert_equal(
|
53
|
+
[["marko", 0.5, "vadas"], ["marko", 1.0, "josh"], ["marko", 0.4, "lop"]].to_s,
|
54
|
+
@graph.v(1).outE.inV.path(proc{it.name}, proc{it.weight}, proc{it.name}).take.to_s
|
55
|
+
)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_loop_pattern
|
59
|
+
g = RedGrape.load_graph 'data/graph-example-2.xml'
|
60
|
+
assert_equal 36, g.v(89).outE.inV.path.take.size
|
61
|
+
|
62
|
+
#path = g.v(89).outE.inV.loop(2){it.loops < 3}.path.take #TODO: it.
|
63
|
+
path = g.v(89).outE.inV.loop(2){loops < 3}.path.take.first
|
64
|
+
assert_equal '[v[89], e[7006][89-followed_by->127], v[127], e[7786][127-sung_by->340], v[340]]', path.to_s
|
65
|
+
assert_equal RedGrape::Vertex, path[0].class
|
66
|
+
assert_equal RedGrape::Edge, path[1].class
|
67
|
+
assert_equal RedGrape::Vertex, path[2].class
|
68
|
+
assert_equal RedGrape::Edge, path[3].class
|
69
|
+
assert_equal RedGrape::Vertex, path[4].class
|
70
|
+
|
71
|
+
path = g.v(89).as('x').outE.inV.loop('x'){loops < 3}.path.take.first
|
72
|
+
assert_equal '[v[89], e[7006][89-followed_by->127], v[127], e[7786][127-sung_by->340], v[340]]', path.to_s
|
73
|
+
assert_equal RedGrape::Vertex, path[0].class
|
74
|
+
assert_equal RedGrape::Edge, path[1].class
|
75
|
+
assert_equal RedGrape::Vertex, path[2].class
|
76
|
+
assert_equal RedGrape::Edge, path[3].class
|
77
|
+
assert_equal RedGrape::Vertex, path[4].class
|
78
|
+
|
79
|
+
path = g.v(89).outE.inV.outE.inV.path.take.first
|
80
|
+
assert_equal '[v[89], e[7006][89-followed_by->127], v[127], e[7786][127-sung_by->340], v[340]]', path.to_s
|
81
|
+
assert_equal RedGrape::Vertex, path[0].class
|
82
|
+
assert_equal RedGrape::Edge, path[1].class
|
83
|
+
assert_equal RedGrape::Vertex, path[2].class
|
84
|
+
assert_equal RedGrape::Edge, path[3].class
|
85
|
+
assert_equal RedGrape::Vertex, path[4].class
|
17
86
|
end
|
18
87
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: red_grape
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-06-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdoc
|
16
|
-
requirement: &
|
16
|
+
requirement: &70172128259100 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '3.10'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70172128259100
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: hoe
|
27
|
-
requirement: &
|
27
|
+
requirement: &70172128258660 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,50 +32,65 @@ dependencies:
|
|
32
32
|
version: '3.0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
36
|
-
description: RedGrape is an in-memory graph database written in ruby.
|
35
|
+
version_requirements: *70172128258660
|
36
|
+
description: RedGrape is an in-memory graph database written in ruby. I made this
|
37
|
+
in order to learn how graph databases work so that please do not use this for serious
|
38
|
+
purposes.
|
37
39
|
email:
|
38
40
|
- andyjpn@gmail.com
|
39
41
|
executables:
|
40
|
-
-
|
42
|
+
- redgrape
|
41
43
|
extensions: []
|
42
44
|
extra_rdoc_files:
|
43
|
-
- History.txt
|
44
45
|
- Manifest.txt
|
45
46
|
- README.txt
|
47
|
+
- History.txt
|
46
48
|
files:
|
47
49
|
- .autotest
|
48
|
-
- History.txt
|
49
50
|
- Manifest.txt
|
50
|
-
- README.txt
|
51
51
|
- Rakefile
|
52
|
-
-
|
52
|
+
- README.txt
|
53
|
+
- History.txt
|
54
|
+
- bin/redgrape
|
53
55
|
- data/graph-example-1.xml
|
56
|
+
- data/graph-example-2.xml
|
57
|
+
- lib/ext/array_ext.rb
|
58
|
+
- lib/ext/object_ext.rb
|
59
|
+
- lib/red_grape.rb
|
60
|
+
- lib/red_grape/vertex.rb
|
54
61
|
- lib/red_grape/edge.rb
|
62
|
+
- lib/red_grape/element.rb
|
55
63
|
- lib/red_grape/graph.rb
|
56
64
|
- lib/red_grape/path_group.rb
|
65
|
+
- lib/red_grape/pipe/aggregate_pipe.rb
|
57
66
|
- lib/red_grape/pipe/as_pipe.rb
|
58
67
|
- lib/red_grape/pipe/back_pipe.rb
|
59
68
|
- lib/red_grape/pipe/base.rb
|
69
|
+
- lib/red_grape/pipe/cap_pipe.rb
|
60
70
|
- lib/red_grape/pipe/context.rb
|
71
|
+
- lib/red_grape/pipe/except_pipe.rb
|
72
|
+
- lib/red_grape/pipe/fill_pipe.rb
|
61
73
|
- lib/red_grape/pipe/filter_pipe.rb
|
74
|
+
- lib/red_grape/pipe/group_count_pipe.rb
|
75
|
+
- lib/red_grape/pipe/has_pipe.rb
|
62
76
|
- lib/red_grape/pipe/if_then_else_pipe.rb
|
63
77
|
- lib/red_grape/pipe/in_pipe.rb
|
78
|
+
- lib/red_grape/pipe/in_v_pipe.rb
|
64
79
|
- lib/red_grape/pipe/loop_pipe.rb
|
80
|
+
- lib/red_grape/pipe/out_e_pipe.rb
|
65
81
|
- lib/red_grape/pipe/out_pipe.rb
|
66
82
|
- lib/red_grape/pipe/paths_pipe.rb
|
67
83
|
- lib/red_grape/pipe/property_pipe.rb
|
84
|
+
- lib/red_grape/pipe/retain_pipe.rb
|
68
85
|
- lib/red_grape/pipe/side_effect_pipe.rb
|
69
86
|
- lib/red_grape/pipe/transform_pipe.rb
|
70
|
-
- lib/red_grape/propertied_object.rb
|
71
87
|
- lib/red_grape/property_description.rb
|
72
|
-
- lib/red_grape/
|
73
|
-
-
|
74
|
-
- lib/red_grape.rb
|
75
|
-
- test/test_on_the_nature_of_pipes.rb
|
76
|
-
- test/test_red_grape.rb
|
88
|
+
- lib/red_grape/serializer/graphml_serializer.rb
|
89
|
+
- test/test_element.rb
|
77
90
|
- test/test_graph.rb
|
78
|
-
- test/
|
91
|
+
- test/test_on_the_nature_of_pipes.rb
|
92
|
+
- test/test_pipe.rb
|
93
|
+
- test/test_pipe_base.rb
|
79
94
|
- test/test_traversal_patterns.rb
|
80
95
|
- test/test_vertex.rb
|
81
96
|
- .gemtest
|
@@ -104,11 +119,12 @@ rubyforge_project: red_grape
|
|
104
119
|
rubygems_version: 1.8.10
|
105
120
|
signing_key:
|
106
121
|
specification_version: 3
|
107
|
-
summary: RedGrape is an in-memory graph database written in ruby
|
122
|
+
summary: RedGrape is an in-memory graph database written in ruby
|
108
123
|
test_files:
|
124
|
+
- test/test_element.rb
|
109
125
|
- test/test_graph.rb
|
110
126
|
- test/test_on_the_nature_of_pipes.rb
|
111
|
-
- test/
|
112
|
-
- test/
|
127
|
+
- test/test_pipe.rb
|
128
|
+
- test/test_pipe_base.rb
|
113
129
|
- test/test_traversal_patterns.rb
|
114
130
|
- test/test_vertex.rb
|
data/bin/red_grape
DELETED
@@ -1,72 +0,0 @@
|
|
1
|
-
require 'red_grape/vertex'
|
2
|
-
|
3
|
-
#TODO delegate to array
|
4
|
-
module RedGrape
|
5
|
-
class VertexGroup < Vertex
|
6
|
-
def initialize(group=[])
|
7
|
-
@group = group
|
8
|
-
end
|
9
|
-
|
10
|
-
def _group
|
11
|
-
@group
|
12
|
-
end
|
13
|
-
|
14
|
-
def pass_through(pipe, context)
|
15
|
-
@group.map! do |v|
|
16
|
-
pipe.pass v, context
|
17
|
-
end
|
18
|
-
@group.reject! do |v|
|
19
|
-
v.nil? or (v.respond_to?(:empty?) and v.empty?) # TODO
|
20
|
-
end
|
21
|
-
@group.map! do |v|
|
22
|
-
v.is_a?(self.class) ? v._group : v
|
23
|
-
end
|
24
|
-
#@group.flatten!
|
25
|
-
flatten_group!
|
26
|
-
@group.all? {|e| e.is_a? self.class} ? self : @group
|
27
|
-
end
|
28
|
-
|
29
|
-
def flatten_group
|
30
|
-
ret = []
|
31
|
-
@group.each do |v|
|
32
|
-
case v
|
33
|
-
when Array
|
34
|
-
ret += v.flatten
|
35
|
-
when self.class
|
36
|
-
ret += v._group.flatten_group
|
37
|
-
else
|
38
|
-
ret << v
|
39
|
-
end
|
40
|
-
end
|
41
|
-
ret
|
42
|
-
end
|
43
|
-
|
44
|
-
def flatten_group!
|
45
|
-
@group = flatten_group
|
46
|
-
end
|
47
|
-
|
48
|
-
def size
|
49
|
-
@group.size
|
50
|
-
end
|
51
|
-
|
52
|
-
def map(&block)
|
53
|
-
@group.map(&block)
|
54
|
-
end
|
55
|
-
|
56
|
-
def sort(&block)
|
57
|
-
@group.sort
|
58
|
-
end
|
59
|
-
|
60
|
-
def empty?
|
61
|
-
@group.empty?
|
62
|
-
end
|
63
|
-
|
64
|
-
def to_a
|
65
|
-
@group.dup.map{|e| e.is_a?(self.class) ? e.to_a : e}
|
66
|
-
end
|
67
|
-
|
68
|
-
def to_s
|
69
|
-
"[#{@group.map(&:to_s).join ', '}]"
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|