pacer 0.9.1.1-java → 1.0.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (152) hide show
  1. data/.autotest +4 -1
  2. data/.gitignore +4 -0
  3. data/.rspec +1 -1
  4. data/Gemfile-dev +33 -0
  5. data/Gemfile-release +4 -0
  6. data/README.md +27 -9
  7. data/Rakefile +26 -8
  8. data/bin/autotest +1 -1
  9. data/lib/pacer/blueprints/multi_graph.rb +7 -19
  10. data/lib/pacer/blueprints/ruby_graph.rb +77 -52
  11. data/lib/pacer/blueprints/tg.rb +6 -93
  12. data/lib/pacer/blueprints.rb +0 -1
  13. data/lib/pacer/core/graph/edges_route.rb +10 -12
  14. data/lib/pacer/core/graph/element_route.rb +14 -21
  15. data/lib/pacer/core/graph/graph_index_route.rb +12 -8
  16. data/lib/pacer/core/graph/graph_route.rb +2 -5
  17. data/lib/pacer/core/graph/mixed_route.rb +3 -5
  18. data/lib/pacer/core/graph/vertices_route.rb +26 -27
  19. data/lib/pacer/core/route.rb +35 -66
  20. data/lib/pacer/exceptions.rb +13 -6
  21. data/lib/pacer/extensions/block_filter_element.rb +0 -5
  22. data/lib/pacer/filter/collection_filter.rb +9 -2
  23. data/lib/pacer/filter/empty_filter.rb +12 -3
  24. data/lib/pacer/filter/future_filter.rb +5 -5
  25. data/lib/pacer/filter/loop_filter.rb +7 -13
  26. data/lib/pacer/filter/object_filter.rb +10 -16
  27. data/lib/pacer/filter/property_filter/filters.rb +134 -93
  28. data/lib/pacer/filter/property_filter.rb +22 -19
  29. data/lib/pacer/filter/where_filter/node_visitor.rb +47 -26
  30. data/lib/pacer/filter/where_filter.rb +24 -3
  31. data/lib/pacer/function_resolver.rb +7 -2
  32. data/lib/pacer/graph/graph_ml.rb +39 -0
  33. data/lib/pacer/graph/graph_transactions_mixin.rb +107 -175
  34. data/lib/pacer/graph/pacer_graph.rb +438 -0
  35. data/lib/pacer/graph/simple_encoder.rb +20 -0
  36. data/lib/pacer/graph/yaml_encoder.rb +81 -0
  37. data/lib/pacer/graph.rb +8 -10
  38. data/lib/pacer/pipe/blackbox_pipeline.rb +11 -4
  39. data/lib/pacer/pipe/block_filter_pipe.rb +5 -22
  40. data/lib/pacer/pipe/cross_product_transform_pipe.rb +5 -7
  41. data/lib/pacer/pipe/edges_pipe.rb +22 -0
  42. data/lib/pacer/pipe/enumerable_pipe.rb +3 -9
  43. data/lib/pacer/pipe/expandable_pipe.rb +2 -14
  44. data/lib/pacer/pipe/id_collection_filter_pipe.rb +2 -8
  45. data/lib/pacer/pipe/is_empty_pipe.rb +5 -12
  46. data/lib/pacer/pipe/is_unique_pipe.rb +3 -13
  47. data/lib/pacer/pipe/label_collection_filter_pipe.rb +1 -7
  48. data/lib/pacer/pipe/label_prefix_pipe.rb +0 -6
  49. data/lib/pacer/pipe/loop_pipe.rb +27 -25
  50. data/lib/pacer/pipe/never_pipe.rb +1 -1
  51. data/lib/pacer/pipe/path_wrapping_pipe.rb +40 -0
  52. data/lib/pacer/pipe/process_pipe.rb +2 -20
  53. data/lib/pacer/pipe/property_comparison_pipe.rb +0 -6
  54. data/lib/pacer/pipe/ruby_pipe.rb +10 -3
  55. data/lib/pacer/pipe/simple_visitor_pipe.rb +12 -11
  56. data/lib/pacer/pipe/stream_sort_pipe.rb +1 -7
  57. data/lib/pacer/pipe/stream_uniq_pipe.rb +0 -6
  58. data/lib/pacer/pipe/type_filter_pipe.rb +1 -7
  59. data/lib/pacer/pipe/unary_transform_pipe.rb +6 -8
  60. data/lib/pacer/pipe/unwrapping_pipe.rb +13 -0
  61. data/lib/pacer/pipe/vertices_pipe.rb +22 -0
  62. data/lib/pacer/pipe/visitor_pipe.rb +3 -7
  63. data/lib/pacer/pipe/wrapping_pipe.rb +37 -0
  64. data/lib/pacer/pipes.rb +17 -12
  65. data/lib/pacer/route/mixin/bulk_operations.rb +8 -9
  66. data/lib/pacer/route/mixin/route_operations.rb +17 -11
  67. data/lib/pacer/route/mixins.rb +0 -1
  68. data/lib/pacer/route.rb +198 -121
  69. data/lib/pacer/side_effect/aggregate.rb +22 -2
  70. data/lib/pacer/side_effect/as.rb +73 -0
  71. data/lib/pacer/side_effect/group_count.rb +0 -3
  72. data/lib/pacer/side_effect/is_unique.rb +7 -6
  73. data/lib/pacer/side_effect.rb +1 -1
  74. data/lib/pacer/support/enumerable.rb +14 -12
  75. data/lib/pacer/support/nil_class.rb +5 -0
  76. data/lib/pacer/support/proc.rb +2 -2
  77. data/lib/pacer/support.rb +1 -1
  78. data/lib/pacer/transform/cap.rb +1 -1
  79. data/lib/pacer/transform/has_count_cap.rb +1 -1
  80. data/lib/pacer/transform/join.rb +20 -16
  81. data/lib/pacer/transform/map.rb +6 -2
  82. data/lib/pacer/transform/path.rb +44 -20
  83. data/lib/pacer/transform/sort_section.rb +58 -51
  84. data/lib/pacer/utils/tsort.rb +7 -2
  85. data/lib/pacer/utils.rb +0 -1
  86. data/lib/pacer/version.rb +4 -3
  87. data/lib/pacer/visitors/section.rb +42 -0
  88. data/lib/pacer/visitors/visits_section.rb +32 -0
  89. data/lib/pacer/visitors.rb +7 -0
  90. data/lib/pacer/wrappers/edge_wrapper.rb +164 -11
  91. data/lib/pacer/wrappers/element_wrapper.rb +133 -8
  92. data/lib/pacer/wrappers/index_wrapper.rb +47 -0
  93. data/lib/pacer/wrappers/vertex_wrapper.rb +175 -12
  94. data/lib/pacer/wrappers/wrapper_selector.rb +40 -0
  95. data/lib/pacer/wrappers/wrapping_pipe_function.rb +90 -0
  96. data/lib/pacer/wrappers.rb +3 -1
  97. data/lib/pacer-1.0.0-standalone.jar +0 -0
  98. data/lib/pacer.rb +13 -47
  99. data/pacer.gemspec +0 -8
  100. data/pom.xml +10 -3
  101. data/spec/pacer/blueprints/dex_spec.rb +12 -26
  102. data/spec/pacer/blueprints/neo4j_spec.rb +14 -28
  103. data/spec/pacer/blueprints/tg_spec.rb +6 -54
  104. data/spec/pacer/core/graph/edges_route_spec.rb +1 -1
  105. data/spec/pacer/core/graph/element_route_spec.rb +2 -2
  106. data/spec/pacer/core/graph/graph_route_spec.rb +2 -2
  107. data/spec/pacer/core/graph/vertices_route_spec.rb +10 -3
  108. data/spec/pacer/core/route_spec.rb +35 -58
  109. data/spec/pacer/filter/empty_filter_spec.rb +5 -6
  110. data/spec/pacer/filter/future_filter_spec.rb +8 -8
  111. data/spec/pacer/filter/loop_filter_spec.rb +120 -6
  112. data/spec/pacer/filter/object_filter_spec.rb +15 -0
  113. data/spec/pacer/filter/property_filter/filters_spec.rb +169 -0
  114. data/spec/pacer/filter/property_filter_spec.rb +15 -12
  115. data/spec/pacer/filter/uniq_filter_spec.rb +1 -1
  116. data/spec/pacer/filter/where_filter_spec.rb +55 -7
  117. data/spec/pacer/graph/{graph_mixin_spec.rb → pacer_graph_spec.rb} +114 -185
  118. data/spec/pacer/route/mixin/base_spec.rb +36 -35
  119. data/spec/pacer/route/mixin/route_operations_spec.rb +4 -46
  120. data/spec/pacer/side_effect/as_spec.rb +34 -0
  121. data/spec/pacer/support/enumerable_spec.rb +6 -6
  122. data/spec/pacer/transform/join_spec.rb +7 -5
  123. data/spec/pacer/transform/map_spec.rb +55 -0
  124. data/spec/pacer/transform/path_spec.rb +30 -15
  125. data/spec/pacer/transform/process_spec.rb +42 -0
  126. data/spec/pacer/transform/sort_section_spec.rb +82 -0
  127. data/spec/pacer/wrapper/edge_wrapper_spec.rb +122 -2
  128. data/spec/pacer/wrapper/element_wrapper_spec.rb +289 -3
  129. data/spec/pacer/wrapper/vertex_wrapper_spec.rb +289 -2
  130. data/spec/spec_helper.rb +16 -7
  131. data/spec/support/graph_runner.rb +80 -29
  132. data/tags +1165 -0
  133. metadata +46 -107
  134. data/.rvmrc +0 -0
  135. data/lib/pacer/blueprints/extensions.rb +0 -77
  136. data/lib/pacer/graph/edge_mixin.rb +0 -127
  137. data/lib/pacer/graph/element_mixin.rb +0 -202
  138. data/lib/pacer/graph/graph_indices_mixin.rb +0 -93
  139. data/lib/pacer/graph/graph_mixin.rb +0 -361
  140. data/lib/pacer/graph/index_mixin.rb +0 -30
  141. data/lib/pacer/graph/vertex_mixin.rb +0 -119
  142. data/lib/pacer/pipe/map_pipe.rb +0 -36
  143. data/lib/pacer/pipe/variable_store_iterator_wrapper.rb +0 -26
  144. data/lib/pacer/route/mixin/variable_route_module.rb +0 -26
  145. data/lib/pacer/side_effect/section.rb +0 -25
  146. data/lib/pacer/support/iterator_mixins.rb +0 -110
  147. data/lib/pacer/wrappers/new_element.rb +0 -106
  148. data/lib/pacer-0.9.1.1-standalone.jar +0 -0
  149. data/spec/pacer/graph/edge_mixin_spec.rb +0 -116
  150. data/spec/pacer/graph/element_mixin_spec.rb +0 -297
  151. data/spec/pacer/graph/index_mixin_spec.rb +0 -0
  152. data/spec/pacer/graph/vertex_mixin_spec.rb +0 -192
@@ -7,7 +7,7 @@ Run.all do
7
7
  subject { graph.v.send(:build_pipeline) }
8
8
  it { should be_a(Array) }
9
9
  its(:count) { should == 2 }
10
- its(:first) { should be_a(com.tinkerpop.pipes.transform.VerticesPipe) }
10
+ its(:first) { should be_a(Pacer::Pipes::VerticesPipe) }
11
11
  specify { subject.first.should equal(subject.last) }
12
12
  end
13
13
 
@@ -29,19 +29,19 @@ Run.all do
29
29
  subject { route }
30
30
 
31
31
  its(:inspect) do
32
- should be_one_of "#<V-Index(name: \"gremlin\") -> :grem -> inE(:wrote)>",
33
- "#<GraphV -> V-Property(name==\"gremlin\") -> :grem -> inE(:wrote)>"
32
+ should be_one_of "#<V-Index(name: \"gremlin\") -> V-Section -> :grem -> inE(:wrote)>",
33
+ "#<GraphV -> V-Property(name==\"gremlin\") -> V-Section -> :grem -> inE(:wrote)>"
34
34
  end
35
35
  its(:out_v) { should_not be_nil }
36
36
  end
37
37
 
38
- context "graph.v(:name => 'gremlin').as(:grem).in_e(:wrote)" do
38
+ context "graph.v.in_e.out_v(Tackle::SimpleMixin)" do
39
39
  let(:route) { graph.v.in_e.out_v(Tackle::SimpleMixin) }
40
40
  subject { route }
41
41
 
42
42
  its(:in_e) { should_not be_nil }
43
43
  its(:to_a) { should == [] }
44
- its(:extensions) { should == Set[Tackle::SimpleMixin] }
44
+ its(:extensions) { should == [Tackle::SimpleMixin] }
45
45
  end
46
46
 
47
47
  context "graph.v(:name => 'darrick')" do
@@ -49,7 +49,8 @@ Run.all do
49
49
  before { setup_data }
50
50
  subject { graph.v(:name => 'darrick') }
51
51
 
52
- its('iterator.next') { should == v1 }
52
+ # iterator is a protected method... It is the raw iterator before wrapping stuff is added.
53
+ its('iterator.next') { should == v1.element }
53
54
  its(:to_a) { should == [v1] }
54
55
  end
55
56
 
@@ -58,7 +59,7 @@ Run.all do
58
59
  subject { graph.v.element_ids.send(:build_pipeline) }
59
60
  it { should be_a(Array) }
60
61
  its(:count) { should == 2 }
61
- its(:first) { should be_a(com.tinkerpop.pipes.transform.VerticesPipe) }
62
+ its(:first) { should be_a(Pacer::Pipes::VerticesPipe) }
62
63
  its(:last) { should be_a(Pacer::Pipes::IdPipe) }
63
64
  end
64
65
 
@@ -74,8 +75,9 @@ Run.all do
74
75
  begin
75
76
  subject.next
76
77
  fail 'expected exception to be raised'
77
- rescue NativeException => e
78
- e.cause.inspect.should == 'java.util.NoSuchElementException'
78
+ rescue Pacer::EmptyPipe, java.util.NoSuchElementException
79
+ else
80
+ 'Got the wrong kind of exception.'.should be_false
79
81
  end
80
82
  end
81
83
  end
@@ -84,7 +86,7 @@ Run.all do
84
86
  use_simple_graph_data
85
87
  before { setup_data }
86
88
  subject { graph.v.element_ids.to_a }
87
- its(:sort) { should == [v0.element_id, v1.element_id].sort }
89
+ its(:sort) { should == [v0, v1].to_route(based_on: graph.v).element_ids.to_a.sort }
88
90
  end
89
91
  end
90
92
  end
@@ -103,16 +105,14 @@ Run.all(:read_only) do
103
105
  r = r.out_e(:wrote) { |e| true }
104
106
  r = r.in_v
105
107
  r = r.is_not(:grem)
106
- r.inspect.should be_one_of "#<V-Index(name: \"gremlin\") -> :grem -> inE(:wrote) -> outV -> outE(:wrote) -> E-Property(&block) -> inV -> V-Property(&block)>",
107
- "#<GraphV -> V-Property(name==\"gremlin\") -> :grem -> inE(:wrote) -> outV -> outE(:wrote) -> E-Property(&block) -> inV -> V-Property(&block)>"
108
+ r.inspect.should be_one_of "#<V-Index(name: \"gremlin\") -> V-Section -> :grem -> inE(:wrote) -> outV -> outE(:wrote) -> E-Property(&block) -> inV -> V-Property(&block)>",
109
+ "#<GraphV -> V-Property(name==\"gremlin\") -> V-Section -> :grem -> inE(:wrote) -> outV -> outE(:wrote) -> E-Property(&block) -> inV -> V-Property(&block)>"
108
110
  end
109
111
  end
110
112
 
111
113
  describe '#to_a' do
112
- it { Set[*graph.v].should == Set[*graph.getVertices] }
113
- it { Set[*(graph.v.to_a)].should == Set[*graph.getVertices] }
114
- it { Set[*graph.e].should == Set[*graph.getEdges] }
115
- it { Set[*(graph.e.to_a)].should == Set[*graph.getEdges] }
114
+ it { Set[*graph.v.collect(&:element)].should == Set[*graph.blueprints_graph.getVertices] }
115
+ it { Set[*graph.e.collect(&:element)].should == Set[*graph.blueprints_graph.getEdges] }
116
116
  end
117
117
 
118
118
  describe '#root?' do
@@ -131,6 +131,7 @@ Run.all(:read_only) do
131
131
  describe 'block filter' do
132
132
  it { graph.v { false }.count.should == 0 }
133
133
  it { graph.v { true }.count.should == graph.v.count }
134
+ it { graph.v { |v| v.graph.should == graph }.first }
134
135
  it { graph.v { |v| v.out_e.none? }[:name].to_a.should == ['blueprints'] }
135
136
 
136
137
  it 'should work with paths' do
@@ -185,7 +186,7 @@ shared_examples_for Pacer::Core::Route do
185
186
  let(:result_type) { raise 'specify :vertex, :edge, :mixed or :object' }
186
187
  let(:back) { nil }
187
188
  let(:info) { nil }
188
- let(:route_extensions) { Set[] }
189
+ let(:route_extensions) { [] }
189
190
 
190
191
  context 'without data' do
191
192
  subject { route }
@@ -211,7 +212,10 @@ shared_examples_for Pacer::Core::Route do
211
212
  end
212
213
 
213
214
  describe '#result' do
214
- before { graph.checkpoint }
215
+ before do
216
+ c = example.metadata[:graph_commit]
217
+ c.call if c
218
+ end
215
219
  subject { route.result }
216
220
  its(:element_type) { should == route.element_type }
217
221
  end
@@ -337,33 +341,30 @@ shared_examples_for Pacer::Core::Route do
337
341
  its(:element_type) { should == graph.element_type(result_type) }
338
342
  end
339
343
 
340
- describe '#add_extension' do
344
+ describe '#add_extensions' do
341
345
  # Note that this mixin doesn't need to include
342
346
  # versions of each test with extensions applied because
343
347
  context '(SimpleMixin)' do
344
- before do
345
- @orig_ancestors = route.class.ancestors
346
- r = route.add_extension Tackle::SimpleMixin
347
- r.should equal(route)
348
+ subject do
349
+ route.add_extensions [Tackle::SimpleMixin]
348
350
  end
351
+ its(:back) { should equal(route) }
349
352
  its(:extensions) { should include(Tackle::SimpleMixin) }
350
353
  it { should respond_to(:route_mixin_method) }
351
354
  end
352
355
 
353
356
  context '(Object)' do
354
- before do
355
- @orig_ancestors = route.class.ancestors
356
- route.add_extension Object
357
+ subject do
358
+ route.add_extensions [Object]
357
359
  end
358
- its(:extensions) { should_not include(Object) }
360
+ its(:extensions) { should include(Object) }
359
361
  end
360
362
 
361
- context '(invalid)' do
362
- before do
363
- @orig_ancestors = route.class.ancestors
364
- route.add_extension :invalid
363
+ context '(:invalid)' do
364
+ subject do
365
+ route.add_extensions [:invalid]
365
366
  end
366
- its(:extensions) { should_not include(:invalid) }
367
+ its(:extensions) { should include(:invalid) }
367
368
  end
368
369
  end
369
370
 
@@ -388,11 +389,11 @@ Run.all(:read_only) do
388
389
  use_pacer_graphml_data(:read_only)
389
390
  context 'vertices with extension' do
390
391
  it_uses Pacer::Core::Route do
391
- let(:back) { nil }
392
- let(:route) { graph.v.filter(Tackle::SimpleMixin) }
392
+ let(:back) { graph.v }
393
+ let(:route) { back.filter(Tackle::SimpleMixin) }
393
394
  let(:number_of_results) { 7 }
394
395
  let(:result_type) { :vertex }
395
- let(:route_extensions) { Set[Tackle::SimpleMixin] }
396
+ let(:route_extensions) { [Tackle::SimpleMixin] }
396
397
  end
397
398
  end
398
399
  end
@@ -24,7 +24,7 @@ Run.tg(:read_only) do
24
24
  context '(0..1)' do
25
25
  subject { graph.v[:type].most_frequent(0..1) }
26
26
  it { should be_a Pacer::Core::Route }
27
- its(:element_type) { should == Object }
27
+ its(:element_type) { should == :object }
28
28
  its(:to_a) { should == ['project', 'person'] }
29
29
  end
30
30
 
@@ -60,14 +60,14 @@ Run.tg do
60
60
  count = 0
61
61
  index = graph.v.build_index('new_index', 'k', 'name')
62
62
  index.should_not be_nil
63
- index.get('k', 'pangloss').count.should == 1
63
+ index.all('k', 'pangloss').count.should == 1
64
64
  end
65
65
 
66
66
  it 'should build the index with wrapped elements' do
67
67
  count = 0
68
68
  index = graph.v(TP::Person).build_index('new_index', 'k', 'name')
69
69
  index.should_not be_nil
70
- index.get('k', 'pangloss').count.should == 1
70
+ index.all('k', 'pangloss').count.should == 1
71
71
  end
72
72
 
73
73
  it 'should do nothing if there are no elements' do
@@ -77,51 +77,9 @@ Run.tg do
77
77
  end
78
78
 
79
79
  after do
80
- graph.dropIndex 'new_index'
80
+ graph.drop_index 'new_index'
81
81
  end
82
82
  end
83
83
  end
84
84
  end
85
85
  end
86
-
87
-
88
- # Modernize these old tests:
89
- describe RouteOperations do
90
- before :all do
91
- @g = Pacer.tg 'spec/data/pacer.graphml'
92
- end
93
-
94
- describe '#as' do
95
- it 'should set the variable to the correct node' do
96
- vars = Set[]
97
- @g.v.as(:a_vertex).in_e(:wrote) { |edge| vars << edge.vars[:a_vertex] }.count
98
- vars.should == Set[*@g.e.e(:wrote).in_v]
99
- end
100
-
101
- it 'should not break path generation (simple)' do
102
- who = nil
103
- r = @g.v.as(:who).in_e(:wrote).out_v.v { |v|
104
- who = v.vars[:who]
105
- }.paths
106
- r.each do |path|
107
- path.to_a[0].should == @g
108
- path.to_a[1].should == who
109
- path.length.should == 4
110
- end
111
- end
112
-
113
- it 'should not break path generation' do
114
- who_wrote_what = nil
115
- r = @g.v.as(:who).in_e(:wrote).as(:wrote).out_v.as(:what).v { |v|
116
- who_wrote_what = [@g, v.vars[:who], v.vars[:wrote], v.vars[:what]]
117
- }.paths
118
- r.each do |path|
119
- path.to_a.should == who_wrote_what
120
- end
121
- end
122
- end
123
-
124
- describe :delete! do
125
- it 'should not try to delete an element twice'
126
- end
127
- end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ Run.all(:read_only) do
4
+ use_pacer_graphml_data(:read_only)
5
+
6
+ describe '#as' do
7
+ it 'should set the variable to the correct node' do
8
+ vars = Set[]
9
+ graph.v.as(:a_vertex).in_e(:wrote) { |edge| vars << edge.vars[:a_vertex] }.count
10
+ vars.should == Set[*graph.e.e(:wrote).in_v]
11
+ end
12
+
13
+ it 'should not break path generation (simple)' do
14
+ who = nil
15
+ r = graph.v.as(:who).in_e(:wrote).out_v.v { |v|
16
+ who = v.vars[:who]
17
+ }.paths
18
+ r.each do |path|
19
+ path.to_a[0].should == who
20
+ path.length.should == 3
21
+ end
22
+ end
23
+
24
+ it 'should not break path generation' do
25
+ who_wrote_what = nil
26
+ r = graph.v.as(:who).in_e(:wrote).as(:wrote).out_v.as(:what).v { |v|
27
+ who_wrote_what = [v.vars[:who], v.vars[:wrote], v.vars[:what]]
28
+ }.paths
29
+ r.each do |path|
30
+ path.to_a.should == who_wrote_what
31
+ end
32
+ end
33
+ end
34
+ end
@@ -74,22 +74,22 @@ describe Enumerable do
74
74
  context 'with no arguments' do
75
75
  subject { [1, 'a'].to_route }
76
76
  it { should be_a Pacer::Core::Route }
77
- its(:element_type) { should == Object }
77
+ its(:element_type) { should == :object }
78
78
  its(:to_a) { should == [1, 'a'] }
79
79
  end
80
80
 
81
81
  context 'based on an object route' do
82
82
  subject { [1, 'a'].to_route(:based_on => graph.v[:name]) }
83
83
  it { should be_a Pacer::Core::Route }
84
- its(:element_type) { should == Object }
84
+ its(:element_type) { should == :object }
85
85
  its(:to_a) { should == [1, 'a'] }
86
86
  end
87
87
 
88
88
  context 'based on an object route with an extension' do
89
- subject { [1, 'a'].to_route(:based_on => graph.v[:name].add_extension(Tackle::SimpleMixin)) }
89
+ subject { [1, 'a'].to_route(:based_on => graph.v[:name].add_extensions([Tackle::SimpleMixin])) }
90
90
  it { should be_a Pacer::Core::Route }
91
- its(:extensions) { should == Set[Tackle::SimpleMixin] }
92
- its(:element_type) { should == Object }
91
+ its(:extensions) { should == [Tackle::SimpleMixin] }
92
+ its(:element_type) { should == :object }
93
93
  its(:to_a) { should == [1, 'a'] }
94
94
  end
95
95
  end
@@ -105,7 +105,7 @@ describe Enumerable do
105
105
 
106
106
  context 'based on an extended element route' do
107
107
  subject { elements.to_route(:based_on => graph.v(Tackle::SimpleMixin)) }
108
- its(:extensions) { should == Set[Tackle::SimpleMixin] }
108
+ its(:extensions) { should == [Tackle::SimpleMixin] }
109
109
  its(:element_type) { should == graph.element_type(:vertex) }
110
110
  its(:to_a) { should == elements }
111
111
  end
@@ -9,7 +9,7 @@ Run.tg :read_only do
9
9
  its(:count) { should == 7 }
10
10
  specify 'each element should be a node' do
11
11
  subject.each do |group|
12
- group[:key].should be_a graph.element_type(:vertex)
12
+ group[:key].should be_a Pacer::Vertex
13
13
  group.property_keys.to_a.should == ['key']
14
14
  end
15
15
  end
@@ -42,7 +42,8 @@ Run.tg :read_only do
42
42
 
43
43
  context '#multigraph' do
44
44
  subject { route.multigraph }
45
- it { should be_a Pacer::MultiGraph }
45
+ it { should be_a Pacer::PacerGraph }
46
+ its(:blueprints_graph) { should be_a Pacer::MultiGraph }
46
47
 
47
48
  its('v.count') { should == 3 }
48
49
 
@@ -127,10 +128,11 @@ Run.tg :read_only do
127
128
  "group" => {"projects" => 3, "member" => 1}}
128
129
  end
129
130
 
130
- its(:inspect) { should == "#<MultiGraph>" }
131
-
131
+ its(:inspect) { should == "#<PacerGraph>" }
132
+ its(:blueprints_graph) { should be_a Pacer::MultiGraph }
133
+
132
134
  specify do
133
- counted_group.inspect.should ==
135
+ counted_group.inspect.should ==
134
136
  "#<GraphV -> V-Join(#<V -> Obj(type)>: {:count=>#<V -> outE -> Obj-Cap(E-Counted)>, :out_e=>#<V -> outE>})>"
135
137
  end
136
138
  end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for '#map' do
4
+ describe 'simple element route' do
5
+ subject do
6
+ c = 0
7
+ source.map { c += 1 }
8
+ end
9
+ its(:first) { should == 1 }
10
+ its(:element_type) { should == :object }
11
+ end
12
+
13
+ describe 'with extensions' do
14
+ let(:extended) { source.add_extensions([Tackle::SimpleMixin]) }
15
+
16
+ subject { extended.map { |v| v.extensions } }
17
+
18
+ its(:first) { should == [Tackle::SimpleMixin, Pacer::Extensions::BlockFilterElement] }
19
+ its(:element_type) { should == :object }
20
+
21
+ context 'with vertex result type' do
22
+ subject { extended.map(element_type: :vertex) { |v| v } }
23
+ its(:element_type) { should == :vertex }
24
+ its(:extensions) { should == [] }
25
+ end
26
+
27
+ context 'with extended vertex result type' do
28
+ let(:exts) { [] }
29
+ subject { extended.map(element_type: :vertex, extensions: TP::Person) { |v| exts << v.extensions; v } }
30
+ its(:element_type) { should == :vertex }
31
+ its(:extensions) { should == [TP::Person] }
32
+ it 'should use the source - not the result - extension in the block' do
33
+ v = subject.first
34
+ v.extensions.should == [TP::Person]
35
+ exts.first.should == [Tackle::SimpleMixin, Pacer::Extensions::BlockFilterElement]
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ Run.tg :read_only do
42
+ use_pacer_graphml_data :read_only
43
+
44
+ context 'on route' do
45
+ it_uses '#map' do
46
+ let(:source) { graph.v }
47
+ end
48
+ end
49
+
50
+ context 'on element' do
51
+ it_uses '#map' do
52
+ let(:source) { pangloss }
53
+ end
54
+ end
55
+ end
@@ -2,7 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe Pacer::Transform::Path do
4
4
  before :all do
5
- @g = Pacer.tg 'spec/data/pacer.graphml'
5
+ @g = Pacer.tg
6
+ Pacer::GraphML.import @g, 'spec/data/pacer.graphml'
6
7
  end
7
8
 
8
9
  describe '#paths' do
@@ -16,11 +17,13 @@ describe Pacer::Transform::Path do
16
17
 
17
18
  it 'should include all elements traversed' do
18
19
  @g.v.out_e.in_v.paths.each do |path|
19
- path[0].should == @g
20
- path[1].should be_a(Pacer::TinkerVertex)
21
- path[2].should be_a(Pacer::TinkerEdge)
22
- path[3].should be_a(Pacer::TinkerVertex)
23
- path.length.should == 4
20
+ path[0].should be_a(Pacer::Wrappers::VertexWrapper)
21
+ path[1].should be_a(Pacer::Wrappers::EdgeWrapper)
22
+ path[2].should be_a(Pacer::Wrappers::VertexWrapper)
23
+ path[0].element.should be_a(com.tinkerpop.blueprints.impls.tg.TinkerVertex)
24
+ path[1].element.should be_a(com.tinkerpop.blueprints.impls.tg.TinkerEdge)
25
+ path[2].element.should be_a(com.tinkerpop.blueprints.impls.tg.TinkerVertex)
26
+ path.length.should == 3
24
27
  end
25
28
  end
26
29
 
@@ -37,18 +40,30 @@ describe Pacer::Transform::Path do
37
40
  end
38
41
 
39
42
  describe '#subgraph' do
40
- before do
41
- @sg = @g.v(:type => 'person').out_e.in_v(:type => 'project').subgraph
43
+ context 'original' do
44
+ before do
45
+ @sg = @g.v(:type => 'person').out_e.in_v(:type => 'project').subgraph
42
46
 
43
- @vertices = @g.v(:type => 'person').to_a + @g.v(:type => 'project').to_a
44
- @edges = @g.v(:type => 'person').out_e(:wrote)
47
+ @vertices = @g.v(:type => 'person').to_a + @g.v(:type => 'project').to_a
48
+ @edges = @g.v(:type => 'person').out_e(:wrote)
49
+ end
50
+
51
+ it { Set[*@sg.v.element_ids].should == Set[*@vertices.collect { |v| v.element_id }] }
52
+ it { Set[*@sg.e.element_ids].should == Set[*@edges.collect { |e| e.element_id }] }
53
+
54
+ it { @sg.e.labels.uniq.to_a.should == ['wrote'] }
55
+ it { Set[*@sg.v.collect { |v| v.properties }].should == Set[*@vertices.collect { |v| v.properties }] }
45
56
  end
46
57
 
47
- it { Set[*@sg.v.element_ids].should == Set[*@vertices.collect { |v| v.element_id }] }
48
- it { Set[*@sg.e.element_ids].should == Set[*@edges.collect { |e| e.element_id }] }
58
+ context 'with both_v' do
59
+ before do
60
+ @sg = @g.v(:type => 'person').in_e.both_v.subgraph
61
+ @vertices = [@g.vertex(5), @g.vertex(6)]
62
+ @edges = [@g.edge(11)]
63
+ end
49
64
 
50
- it { @sg.e.labels.uniq.to_a.should == ['wrote'] }
51
- it { Set[*@sg.v.collect { |v| v.properties }].should == Set[*@vertices.collect { |v| v.properties }] }
65
+ it { Set[*@sg.v.element_ids].should == Set[*@vertices.collect { |v| v.element_id }] }
66
+ it { Set[*@sg.e.element_ids].should == Set[*@edges.collect { |e| e.element_id }] }
67
+ end
52
68
  end
53
69
  end
54
-
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for '#process' do
4
+ describe 'simple element route' do
5
+ subject do
6
+ c = 0
7
+ source.process { c += 1 }
8
+ end
9
+ its(:first) { should == source.first }
10
+ its(:element_type) { should == :vertex }
11
+ end
12
+
13
+ describe 'with extensions' do
14
+ let(:extended) { source.add_extensions([Tackle::SimpleMixin]) }
15
+ let(:exts) { Set[] }
16
+
17
+ subject { extended.process { |v| exts << v.extensions } }
18
+
19
+ its('first.extensions') { should == [Tackle::SimpleMixin] }
20
+
21
+ it 'should have the right extensions in the block' do
22
+ subject.first
23
+ exts.first.should == [Tackle::SimpleMixin, Pacer::Extensions::BlockFilterElement]
24
+ end
25
+ end
26
+ end
27
+
28
+ Run.tg :read_only do
29
+ use_pacer_graphml_data :read_only
30
+
31
+ context 'on route' do
32
+ it_uses '#process' do
33
+ let(:source) { graph.v }
34
+ end
35
+ end
36
+
37
+ context 'on element' do
38
+ it_uses '#process' do
39
+ let(:source) { pangloss }
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ Run.tg :read_only do
4
+ use_pacer_graphml_data :read_only
5
+
6
+ let(:unsorted) { graph.v.out.out }
7
+
8
+ describe 'sort by name' do
9
+ let(:by_name) do
10
+ graph.v.section(:x).out.out.sort_section(:x) { |v| v[:name] }
11
+ end
12
+
13
+ it 'should have the same elements' do
14
+ by_name.group_count.should == unsorted.group_count
15
+ end
16
+
17
+ it 'should have 3 elements in the path' do
18
+ by_name.paths.each do |path|
19
+ path.length.should == 3
20
+ end
21
+ end
22
+ end
23
+
24
+ describe 'sort with more info' do
25
+ let(:unsorted) { graph.v.out.out }
26
+ let(:with_path) do
27
+ graph.v.section(:x).out.out.sort_section(:x) do |v, section, path|
28
+ [path[-2][:name], v[:name]]
29
+ end
30
+ end
31
+
32
+ it 'should have the same elements' do
33
+ with_path.group_count.should == unsorted.group_count
34
+ end
35
+
36
+ it 'should have 3 elements in the path' do
37
+ with_path.paths.each do |path|
38
+ path.length.should == 3
39
+ end
40
+ end
41
+
42
+ it 'should yield' do
43
+ yielded = false
44
+ graph.v.section(:x).out_e.in_v.sort_section(:x) do |v, section, path|
45
+ yielded = true
46
+ path.should be_a Array
47
+ path.length.should == 3
48
+ a, b, c = path
49
+ path.each { |e| e.graph.should_not be_nil }
50
+ section.graph.should_not be_nil
51
+ a.should == section
52
+ a.should be_a Pacer::Wrappers::VertexWrapper
53
+ b.should be_a Pacer::Wrappers::EdgeWrapper
54
+ c.should == v
55
+ c.should be_a Pacer::Wrappers::VertexWrapper
56
+ end.first
57
+ yielded.should be_true
58
+ end
59
+ end
60
+
61
+ describe 'sort by values' do
62
+ let :by_value do
63
+ graph.v.section(:x).out.out.element_ids.sort_section(:x)
64
+ end
65
+ it 'should work with no block' do
66
+ by_value.to_a.should_not be_empty
67
+ end
68
+ end
69
+
70
+ it 'should put groups into the correct order' do
71
+ # depends on the order of graph.v(type: 'project') ...
72
+ route = graph.v(type: 'project').section(:proj).out[:name].sort_section(:proj)
73
+ route.to_a.should == %w[
74
+ blueprints
75
+ blueprints
76
+ gremlin
77
+ pipes
78
+ blueprints
79
+ pipes
80
+ ]
81
+ end
82
+ end