red_grape 0.0.8 → 0.0.9
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/lib/ext/array_ext.rb +1 -2
- data/lib/red_grape/pipe/base.rb +6 -2
- data/lib/red_grape/pipe/context.rb +1 -1
- data/lib/red_grape/pipe/copy_split_pipe.rb +1 -1
- data/lib/red_grape/pipe/group_count_pipe.rb +4 -0
- data/lib/red_grape/tools/irg.rb +1 -1
- data/lib/red_grape.rb +4 -0
- data/red_grape.gemspec +2 -1
- data/test/test_traversal_patterns.rb +53 -20
- metadata +4 -5
- data/.autotest +0 -23
data/lib/ext/array_ext.rb
CHANGED
data/lib/red_grape/pipe/base.rb
CHANGED
@@ -23,7 +23,7 @@ module RedGrape
|
|
23
23
|
end
|
24
24
|
|
25
25
|
class Base
|
26
|
-
attr_accessor :opts, :prev, :next, :value
|
26
|
+
attr_accessor :opts, :prev, :next, :value, :it
|
27
27
|
|
28
28
|
def initialize(prev, *opts, &block)
|
29
29
|
@prev = prev
|
@@ -56,7 +56,6 @@ module RedGrape
|
|
56
56
|
|
57
57
|
def take(context=Context.new)
|
58
58
|
if first?
|
59
|
-
#context = Context.new
|
60
59
|
val = @prev.pass_through self, context
|
61
60
|
if context.aggregating?
|
62
61
|
context.resume_from_aggregating
|
@@ -87,6 +86,11 @@ module RedGrape
|
|
87
86
|
end
|
88
87
|
end
|
89
88
|
|
89
|
+
def pipe_eval(params={}, &block)
|
90
|
+
params.each {|k, v| self.send "#{k}=", v}
|
91
|
+
instance_eval(&block)
|
92
|
+
end
|
93
|
+
|
90
94
|
def to_s
|
91
95
|
Pipe.auto_take ? take.to_s : super
|
92
96
|
end
|
@@ -76,7 +76,7 @@ module RedGrape
|
|
76
76
|
end
|
77
77
|
|
78
78
|
def resume_from_grouping
|
79
|
-
obj, pipe = *@grouping_items.first # TODO:
|
79
|
+
obj, pipe = *@grouping_items.first # TODO: '.first' is used to get next_pipe.
|
80
80
|
if pipe
|
81
81
|
push_history obj do |ctx|
|
82
82
|
obj.pass_through(pipe, ctx)
|
@@ -5,7 +5,11 @@ module RedGrape
|
|
5
5
|
class GroupCountPipe < Pipe::Base
|
6
6
|
def pass(obj, context)
|
7
7
|
if self.opts.empty?
|
8
|
+
#context.group({obj => 1}, self.next)
|
8
9
|
context.group obj, self.next
|
10
|
+
elsif self.opts.first.is_a? Proc
|
11
|
+
#context.group({pipe_eval(it:obj, &self.opts.first) => 1}, self.next)
|
12
|
+
context.group pipe_eval(it:obj, &self.opts.first), self.next
|
9
13
|
else
|
10
14
|
self.opts.first[obj] ||= 0
|
11
15
|
self.opts.first[obj] += 1
|
data/lib/red_grape/tools/irg.rb
CHANGED
data/lib/red_grape.rb
CHANGED
@@ -11,8 +11,10 @@ require 'red_grape/pipe/except_pipe'
|
|
11
11
|
require 'red_grape/pipe/exhaust_merge_pipe'
|
12
12
|
require 'red_grape/pipe/fill_pipe'
|
13
13
|
require 'red_grape/pipe/filter_pipe'
|
14
|
+
require 'red_grape/pipe/group_by_pipe'
|
14
15
|
require 'red_grape/pipe/group_count_pipe'
|
15
16
|
require 'red_grape/pipe/has_pipe'
|
17
|
+
require 'red_grape/pipe/has_not_pipe'
|
16
18
|
require 'red_grape/pipe/if_then_else_pipe'
|
17
19
|
require 'red_grape/pipe/in_pipe'
|
18
20
|
require 'red_grape/pipe/in_e_pipe'
|
@@ -31,6 +33,8 @@ require 'red_grape/pipe/e_pipe'
|
|
31
33
|
require 'red_grape/graph'
|
32
34
|
|
33
35
|
module RedGrape
|
36
|
+
VERSION = "0.0.9"
|
37
|
+
|
34
38
|
module_function
|
35
39
|
def set_auto_take(val=true)
|
36
40
|
Pipe.set_auto_take val
|
data/red_grape.gemspec
CHANGED
@@ -3,28 +3,28 @@ require 'red_grape'
|
|
3
3
|
|
4
4
|
class TraversalPatternsTest < Test::Unit::TestCase
|
5
5
|
def setup
|
6
|
-
@
|
6
|
+
@g1 = RedGrape.load_graph 'data/graph-example-1.xml'
|
7
7
|
end
|
8
8
|
|
9
9
|
# https://github.com/tinkerpop/gremlin/wiki/Backtrack-Pattern
|
10
10
|
def test_backtrack_pattern
|
11
|
-
assert_equal [29], @
|
12
|
-
assert_equal [29], @
|
11
|
+
assert_equal [29], @g1.V.out('knows').has('age', :gt, 30).back(2).age.take
|
12
|
+
assert_equal [29], @g1.V.as('x').outE('knows').inV.has('age', :gt, 30).back('x').age.take
|
13
13
|
end
|
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), @
|
18
|
-
assert_equal %w(3 5), @
|
19
|
-
assert_equal %w(5), @
|
20
|
-
assert_equal %w(3), @
|
17
|
+
assert_equal %w(2 3 4), @g1.v(1).out.take.map(&:id).sort
|
18
|
+
assert_equal %w(3 5), @g1.v(1).out.out.take.map(&:id).sort
|
19
|
+
assert_equal %w(5), @g1.v(1).out.aggregate(:x).out.except(:x).take.map(&:id).sort
|
20
|
+
assert_equal %w(3), @g1.v(1).out.aggregate(:x).out.retain(:x).take.map(&:id).sort
|
21
21
|
end
|
22
22
|
|
23
23
|
# https://github.com/tinkerpop/gremlin/wiki/Flow-Rank-Pattern
|
24
24
|
def test_flow_rank_pattern
|
25
|
-
assert_equal %w(3 5), @
|
25
|
+
assert_equal %w(3 5), @g1.V('lang', 'java').take.map(&:id).sort
|
26
26
|
software = []
|
27
|
-
@
|
27
|
+
@g1.V('lang', 'java').fill(software).take
|
28
28
|
assert_equal %w(3 5), software.map(&:id).sort
|
29
29
|
assert_equal %w(marko josh peter josh), software._.in('created').name.take
|
30
30
|
assert_equal(
|
@@ -39,7 +39,7 @@ class TraversalPatternsTest < Test::Unit::TestCase
|
|
39
39
|
|
40
40
|
# https://github.com/tinkerpop/gremlin/wiki/Path-Pattern
|
41
41
|
def test_path_pattern
|
42
|
-
v1 = @
|
42
|
+
v1 = @g1.vertex(1)
|
43
43
|
|
44
44
|
assert_equal %w(josh lop vadas), v1.out.name.take.sort
|
45
45
|
|
@@ -58,9 +58,9 @@ class TraversalPatternsTest < Test::Unit::TestCase
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def test_loop_pattern
|
61
|
-
|
62
|
-
v89 =
|
63
|
-
assert_equal 36,
|
61
|
+
@g2 ||= RedGrape.load_graph 'data/graph-example-2.xml'
|
62
|
+
v89 = @g2.vertex 89
|
63
|
+
assert_equal 36, v89.outE.inV.path.take.size
|
64
64
|
|
65
65
|
path = v89.outE.inV.loop(2){it.loops < 3}.path.take.first
|
66
66
|
assert_equal '[v[89], e[7006][89-followed_by->127], v[127], e[7786][127-sung_by->340], v[340]]', path.to_s
|
@@ -86,15 +86,48 @@ class TraversalPatternsTest < Test::Unit::TestCase
|
|
86
86
|
assert_equal RedGrape::Edge, path[3].class
|
87
87
|
assert_equal RedGrape::Vertex, path[4].class
|
88
88
|
|
89
|
-
#assert_equal
|
90
|
-
#
|
91
|
-
#
|
89
|
+
#assert_equal(
|
90
|
+
# 70307,
|
91
|
+
# v89.out.loop(1, proc{it.loops < 4}).take.size
|
92
|
+
#) #=> OK
|
93
|
+
|
94
|
+
#assert_equal(
|
95
|
+
# 71972,
|
96
|
+
# v89.out.loop(1, proc{it.loops < 4}, proc{true}).take.size
|
97
|
+
#) #=> 70307
|
98
|
+
|
99
|
+
#assert_equal(
|
100
|
+
# 582,
|
101
|
+
# v89.out.loop(1, proc{it.loops < 4}, proc{it.object.id == '89'}).take.size
|
102
|
+
#) #=> 564
|
92
103
|
end
|
93
104
|
|
94
105
|
# https://github.com/tinkerpop/gremlin/wiki/Split-Merge-Pattern
|
95
|
-
def
|
96
|
-
v1 = @
|
97
|
-
|
98
|
-
assert_equal
|
106
|
+
def test_split_marge_pattern
|
107
|
+
v1 = @g1.vertex 1
|
108
|
+
|
109
|
+
#assert_equal(
|
110
|
+
# ['ripple', 27, 'lop', 32],
|
111
|
+
# v1.out('knows').copy_split(_.out('created').name, _.age).fair_merge.take
|
112
|
+
#) # TODO: not yet
|
113
|
+
|
114
|
+
assert_equal(
|
115
|
+
[27, 'ripple', 'lop', 32],
|
116
|
+
v1.out('knows').copy_split(_.out('created').name, _.age).exhaust_merge.take
|
117
|
+
)
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_map_reduce_pattern
|
121
|
+
@g2 ||= RedGrape.load_graph 'data/graph-example-2.xml'
|
122
|
+
assert_equal(
|
123
|
+
{'cover'=>313, 'original'=>184},
|
124
|
+
@g2.V.has_not('song_type', nil).group_count(proc{it.song_type}).cap.take
|
125
|
+
)
|
126
|
+
=begin
|
127
|
+
assert_equal(
|
128
|
+
{},
|
129
|
+
@g2.V.has_not('song_type', nil).group_by(proc{it.song_type}, proc{it}).cap.take
|
130
|
+
)
|
131
|
+
=end
|
99
132
|
end
|
100
133
|
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.9
|
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-06-
|
12
|
+
date: 2012-06-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
16
|
-
requirement: &
|
16
|
+
requirement: &70205221723480 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70205221723480
|
25
25
|
description: RedGrape is an in-memory graph database written in ruby. I made this
|
26
26
|
in order to learn how graph databases work so that please do not use this for any
|
27
27
|
serious purpose.
|
@@ -33,7 +33,6 @@ executables:
|
|
33
33
|
extensions: []
|
34
34
|
extra_rdoc_files: []
|
35
35
|
files:
|
36
|
-
- .autotest
|
37
36
|
- .gitignore
|
38
37
|
- Gemfile
|
39
38
|
- README.md
|
data/.autotest
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
# -*- ruby -*-
|
2
|
-
|
3
|
-
require 'autotest/restart'
|
4
|
-
|
5
|
-
# Autotest.add_hook :initialize do |at|
|
6
|
-
# at.extra_files << "../some/external/dependency.rb"
|
7
|
-
#
|
8
|
-
# at.libs << ":../some/external"
|
9
|
-
#
|
10
|
-
# at.add_exception 'vendor'
|
11
|
-
#
|
12
|
-
# at.add_mapping(/dependency.rb/) do |f, _|
|
13
|
-
# at.files_matching(/test_.*rb$/)
|
14
|
-
# end
|
15
|
-
#
|
16
|
-
# %w(TestA TestB).each do |klass|
|
17
|
-
# at.extra_class_map[klass] = "test/test_misc.rb"
|
18
|
-
# end
|
19
|
-
# end
|
20
|
-
|
21
|
-
# Autotest.add_hook :run_command do |at|
|
22
|
-
# system "rake build"
|
23
|
-
# end
|