pacer 0.9.1.1-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. data/.autotest +8 -0
  2. data/.document +5 -0
  3. data/.gitignore +26 -0
  4. data/.rspec +1 -0
  5. data/.rvmrc +0 -0
  6. data/CONTRIBUTORS +5 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE.txt +24 -0
  9. data/README.md +187 -0
  10. data/Rakefile +49 -0
  11. data/autotest/discover.rb +1 -0
  12. data/bin/autospec +16 -0
  13. data/bin/autotest +16 -0
  14. data/bin/rake +16 -0
  15. data/bin/rcov +16 -0
  16. data/bin/rspec +16 -0
  17. data/bin/yard +16 -0
  18. data/bin/yardoc +16 -0
  19. data/lib/pacer/blueprints/extensions.rb +77 -0
  20. data/lib/pacer/blueprints/multi_graph.rb +121 -0
  21. data/lib/pacer/blueprints/ruby_graph.rb +199 -0
  22. data/lib/pacer/blueprints/tg.rb +100 -0
  23. data/lib/pacer/blueprints.rb +4 -0
  24. data/lib/pacer/core/graph/edges_route.rb +92 -0
  25. data/lib/pacer/core/graph/element_route.rb +171 -0
  26. data/lib/pacer/core/graph/graph_index_route.rb +48 -0
  27. data/lib/pacer/core/graph/graph_route.rb +55 -0
  28. data/lib/pacer/core/graph/mixed_route.rb +96 -0
  29. data/lib/pacer/core/graph/vertices_route.rb +220 -0
  30. data/lib/pacer/core/graph.rb +13 -0
  31. data/lib/pacer/core/route.rb +502 -0
  32. data/lib/pacer/core/side_effect.rb +11 -0
  33. data/lib/pacer/core.rb +8 -0
  34. data/lib/pacer/exceptions.rb +11 -0
  35. data/lib/pacer/extensions/block_filter_element.rb +22 -0
  36. data/lib/pacer/extensions.rb +6 -0
  37. data/lib/pacer/filter/block_filter.rb +31 -0
  38. data/lib/pacer/filter/collection_filter.rb +109 -0
  39. data/lib/pacer/filter/empty_filter.rb +70 -0
  40. data/lib/pacer/filter/future_filter.rb +68 -0
  41. data/lib/pacer/filter/index_filter.rb +30 -0
  42. data/lib/pacer/filter/loop_filter.rb +95 -0
  43. data/lib/pacer/filter/object_filter.rb +55 -0
  44. data/lib/pacer/filter/property_filter/edge_filters.rb +93 -0
  45. data/lib/pacer/filter/property_filter/filters.rb +269 -0
  46. data/lib/pacer/filter/property_filter.rb +111 -0
  47. data/lib/pacer/filter/random_filter.rb +13 -0
  48. data/lib/pacer/filter/range_filter.rb +104 -0
  49. data/lib/pacer/filter/uniq_filter.rb +12 -0
  50. data/lib/pacer/filter/where_filter/node_visitor.rb +280 -0
  51. data/lib/pacer/filter/where_filter.rb +47 -0
  52. data/lib/pacer/filter.rb +17 -0
  53. data/lib/pacer/function_resolver.rb +43 -0
  54. data/lib/pacer/graph/edge_mixin.rb +127 -0
  55. data/lib/pacer/graph/element_mixin.rb +202 -0
  56. data/lib/pacer/graph/graph_indices_mixin.rb +93 -0
  57. data/lib/pacer/graph/graph_mixin.rb +361 -0
  58. data/lib/pacer/graph/graph_transactions_mixin.rb +207 -0
  59. data/lib/pacer/graph/index_mixin.rb +30 -0
  60. data/lib/pacer/graph/vertex_mixin.rb +119 -0
  61. data/lib/pacer/graph.rb +14 -0
  62. data/lib/pacer/pipe/blackbox_pipeline.rb +48 -0
  63. data/lib/pacer/pipe/block_filter_pipe.rb +38 -0
  64. data/lib/pacer/pipe/collection_filter_pipe.rb +10 -0
  65. data/lib/pacer/pipe/cross_product_transform_pipe.rb +48 -0
  66. data/lib/pacer/pipe/enumerable_pipe.rb +30 -0
  67. data/lib/pacer/pipe/expandable_pipe.rb +63 -0
  68. data/lib/pacer/pipe/id_collection_filter_pipe.rb +33 -0
  69. data/lib/pacer/pipe/is_empty_pipe.rb +30 -0
  70. data/lib/pacer/pipe/is_unique_pipe.rb +61 -0
  71. data/lib/pacer/pipe/label_collection_filter_pipe.rb +21 -0
  72. data/lib/pacer/pipe/label_prefix_pipe.rb +21 -0
  73. data/lib/pacer/pipe/loop_pipe.rb +86 -0
  74. data/lib/pacer/pipe/map_pipe.rb +36 -0
  75. data/lib/pacer/pipe/never_pipe.rb +9 -0
  76. data/lib/pacer/pipe/process_pipe.rb +37 -0
  77. data/lib/pacer/pipe/property_comparison_pipe.rb +40 -0
  78. data/lib/pacer/pipe/ruby_pipe.rb +25 -0
  79. data/lib/pacer/pipe/simple_visitor_pipe.rb +43 -0
  80. data/lib/pacer/pipe/stream_sort_pipe.rb +84 -0
  81. data/lib/pacer/pipe/stream_uniq_pipe.rb +33 -0
  82. data/lib/pacer/pipe/type_filter_pipe.rb +22 -0
  83. data/lib/pacer/pipe/unary_transform_pipe.rb +59 -0
  84. data/lib/pacer/pipe/variable_store_iterator_wrapper.rb +26 -0
  85. data/lib/pacer/pipe/visitor_pipe.rb +67 -0
  86. data/lib/pacer/pipes.rb +61 -0
  87. data/lib/pacer/route/mixin/bulk_operations.rb +52 -0
  88. data/lib/pacer/route/mixin/route_operations.rb +107 -0
  89. data/lib/pacer/route/mixin/variable_route_module.rb +26 -0
  90. data/lib/pacer/route/mixins.rb +3 -0
  91. data/lib/pacer/route.rb +228 -0
  92. data/lib/pacer/routes.rb +6 -0
  93. data/lib/pacer/side_effect/aggregate.rb +31 -0
  94. data/lib/pacer/side_effect/counted.rb +30 -0
  95. data/lib/pacer/side_effect/group_count.rb +44 -0
  96. data/lib/pacer/side_effect/is_unique.rb +32 -0
  97. data/lib/pacer/side_effect/section.rb +25 -0
  98. data/lib/pacer/side_effect/visitor.rb +37 -0
  99. data/lib/pacer/side_effect.rb +11 -0
  100. data/lib/pacer/support/array_list.rb +28 -0
  101. data/lib/pacer/support/enumerable.rb +100 -0
  102. data/lib/pacer/support/hash.rb +9 -0
  103. data/lib/pacer/support/iterator_mixins.rb +110 -0
  104. data/lib/pacer/support/native_exception.rb +22 -0
  105. data/lib/pacer/support/proc.rb +16 -0
  106. data/lib/pacer/support.rb +10 -0
  107. data/lib/pacer/transform/cap.rb +50 -0
  108. data/lib/pacer/transform/gather.rb +9 -0
  109. data/lib/pacer/transform/has_count_cap.rb +41 -0
  110. data/lib/pacer/transform/join.rb +181 -0
  111. data/lib/pacer/transform/map.rb +23 -0
  112. data/lib/pacer/transform/path.rb +50 -0
  113. data/lib/pacer/transform/process.rb +23 -0
  114. data/lib/pacer/transform/scatter.rb +23 -0
  115. data/lib/pacer/transform/sort_section.rb +103 -0
  116. data/lib/pacer/transform/stream_sort.rb +21 -0
  117. data/lib/pacer/transform/stream_uniq.rb +21 -0
  118. data/lib/pacer/transform.rb +16 -0
  119. data/lib/pacer/utils/graph_analysis.rb +112 -0
  120. data/lib/pacer/utils/trie.rb +93 -0
  121. data/lib/pacer/utils/tsort.rb +65 -0
  122. data/lib/pacer/utils/y_files.rb +127 -0
  123. data/lib/pacer/utils.rb +10 -0
  124. data/lib/pacer/version.rb +13 -0
  125. data/lib/pacer/wrappers/edge_wrapper.rb +51 -0
  126. data/lib/pacer/wrappers/element_wrapper.rb +78 -0
  127. data/lib/pacer/wrappers/new_element.rb +106 -0
  128. data/lib/pacer/wrappers/vertex_wrapper.rb +51 -0
  129. data/lib/pacer/wrappers.rb +19 -0
  130. data/lib/pacer-0.9.1.1-standalone.jar +0 -0
  131. data/lib/pacer.rb +290 -0
  132. data/pacer.gemspec +30 -0
  133. data/pom/standalone.xml +22 -0
  134. data/pom.xml +124 -0
  135. data/samples/grateful-dead.xml +26380 -0
  136. data/samples/grateful_dead.rb +63 -0
  137. data/samples/profile.rb +15 -0
  138. data/spec/data/grateful-dead.xml +26380 -0
  139. data/spec/data/pacer.graphml +319 -0
  140. data/spec/pacer/blueprints/dex_spec.rb +172 -0
  141. data/spec/pacer/blueprints/neo4j_spec.rb +177 -0
  142. data/spec/pacer/blueprints/tg_spec.rb +128 -0
  143. data/spec/pacer/core/graph/edges_route_spec.rb +52 -0
  144. data/spec/pacer/core/graph/element_route_spec.rb +46 -0
  145. data/spec/pacer/core/graph/graph_route_spec.rb +94 -0
  146. data/spec/pacer/core/graph/vertices_route_spec.rb +169 -0
  147. data/spec/pacer/core/route_spec.rb +197 -0
  148. data/spec/pacer/filter/collection_filter_spec.rb +19 -0
  149. data/spec/pacer/filter/empty_filter_spec.rb +29 -0
  150. data/spec/pacer/filter/future_filter_spec.rb +97 -0
  151. data/spec/pacer/filter/loop_filter_spec.rb +31 -0
  152. data/spec/pacer/filter/property_filter_spec.rb +111 -0
  153. data/spec/pacer/filter/random_filter_spec.rb +17 -0
  154. data/spec/pacer/filter/uniq_filter_spec.rb +18 -0
  155. data/spec/pacer/filter/where_filter_spec.rb +93 -0
  156. data/spec/pacer/graph/edge_mixin_spec.rb +116 -0
  157. data/spec/pacer/graph/element_mixin_spec.rb +297 -0
  158. data/spec/pacer/graph/graph_mixin_spec.rb +538 -0
  159. data/spec/pacer/graph/index_mixin_spec.rb +0 -0
  160. data/spec/pacer/graph/vertex_mixin_spec.rb +192 -0
  161. data/spec/pacer/pipe/block_filter_pipe_spec.rb +0 -0
  162. data/spec/pacer/pipe/labels_filter_pipe_spec.rb +0 -0
  163. data/spec/pacer/pipe/ruby_pipe_spec.rb +0 -0
  164. data/spec/pacer/pipe/type_filter_pipe_spec.rb +0 -0
  165. data/spec/pacer/route/mixin/base_spec.rb +419 -0
  166. data/spec/pacer/route/mixin/bulk_operations_spec.rb +30 -0
  167. data/spec/pacer/route/mixin/route_operations_spec.rb +127 -0
  168. data/spec/pacer/support/array_list_spec.rb +0 -0
  169. data/spec/pacer/support/enumerable_spec.rb +115 -0
  170. data/spec/pacer/transform/join_spec.rb +138 -0
  171. data/spec/pacer/transform/path_spec.rb +54 -0
  172. data/spec/pacer/utils/tsort_spec.rb +89 -0
  173. data/spec/pacer/wrapper/edge_wrapper_spec.rb +33 -0
  174. data/spec/pacer/wrapper/element_wrapper_spec.rb +169 -0
  175. data/spec/pacer/wrapper/vertex_wrapper_spec.rb +33 -0
  176. data/spec/pacer_spec.rb +0 -0
  177. data/spec/spec_helper.rb +91 -0
  178. data/spec/support/contexts.rb +14 -0
  179. data/spec/support/graph_runner.rb +142 -0
  180. data/spec/support/matchers.rb +19 -0
  181. data/spec/support/use_transactions.rb +31 -0
  182. data/spec/tackle/simple_mixin.rb +21 -0
  183. data/spec/tackle/tinkerpop_graph_mixins.rb +60 -0
  184. metadata +364 -0
@@ -0,0 +1,192 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for Pacer::VertexMixin do
4
+ use_simple_graph_data
5
+
6
+ describe '#v' do
7
+ subject { v0.v }
8
+ it { should be_a_vertices_route }
9
+ it { should_not be_a(graph.element_type(:vertex)) }
10
+ it { should_not be_an_instance_of(graph.element_type(:vertex)) }
11
+ end
12
+
13
+ describe '#add_extensions' do
14
+ context 'no extensions' do
15
+ subject { v0.add_extensions([]) }
16
+ its('extensions.to_a') { should == [] }
17
+ it { should_not be_a(Pacer::Wrappers::ElementWrapper) }
18
+ end
19
+
20
+ context 'with extensions' do
21
+ subject { v0.add_extensions([Tackle::SimpleMixin]) }
22
+ its('extensions.to_a') { should == [Tackle::SimpleMixin] }
23
+ it { should be_a(Pacer::Wrappers::ElementWrapper) }
24
+ it { should be_a(Pacer::Wrappers::VertexWrapper) }
25
+ it { should_not be_a(Pacer::Wrappers::EdgeWrapper) }
26
+
27
+ describe '#v' do
28
+ subject { v0.add_extensions([Tackle::SimpleMixin]).v }
29
+ its('extensions.to_a') { should == [Tackle::SimpleMixin] }
30
+ it { should be_a_vertices_route }
31
+ it { should be_a(Tackle::SimpleMixin::Route) }
32
+ end
33
+ end
34
+ end
35
+
36
+ describe '#delete!' do
37
+ before do
38
+ @vertex_id = v0.element_id
39
+ v0.delete!
40
+ graph.checkpoint # deleted edges in neo may otherwise still be looked up during the transaction
41
+ end
42
+ it 'should be removed' do
43
+ graph.vertex(@vertex_id).should be_nil
44
+ end
45
+ end
46
+
47
+ contexts(
48
+ 'into new tg' => proc {
49
+ let(:dest) { Pacer.tg }
50
+ },
51
+ 'into graph2' => proc {
52
+ before { pending 'support temporary hash indices for clone/copy' unless graph.supports_manual_indices? }
53
+ let(:dest) { graph2 }
54
+ }) do
55
+ describe '#clone_into', :transactions => false do
56
+ subject { v0.clone_into(dest) }
57
+ its(:properties) { should == { 'name' => 'eliza' } }
58
+ its(:graph) { should equal(dest) }
59
+ its('element_id.to_s') { should == v0.element_id.to_s if graph.supports_custom_element_ids? }
60
+ end
61
+
62
+ describe '#copy_into', :transaction => false do
63
+ subject { v1.copy_into(dest) }
64
+ its(:properties) { should == { 'name' => 'darrick' } }
65
+ its(:graph) { should equal(dest) }
66
+ end
67
+ end
68
+
69
+ subject { v0 }
70
+ its(:graph) { should equal(graph) }
71
+ its(:display_name) { should be_nil }
72
+ its(:inspect) { should =~ /#<[VM]\[#{v0.element_id}\]>/ }
73
+ context 'with label proc' do
74
+ before do
75
+ graph.vertex_name = proc { |e| "some name" }
76
+ end
77
+ its(:display_name) { should == "some name" }
78
+ its(:inspect) { should =~ /#<[VM]\[#{ v0.element_id }\] some name>/ }
79
+ end
80
+ it { should_not == v1 }
81
+ it { should == v0 }
82
+ context 'edge with same element id', :transactions => false do
83
+ it { should_not == e0 }
84
+ end
85
+
86
+ context 'with more data' do
87
+ let(:from_v) { graph.create_vertex }
88
+ let(:to_v) { graph.create_vertex }
89
+
90
+ before do
91
+ %w[ a a a b b c ].each do |label|
92
+ v = graph.create_vertex
93
+ graph.create_edge nil, from_v, v, label
94
+ graph.create_edge nil, v, to_v, label
95
+ end
96
+ end
97
+
98
+ describe '#in_edges' do
99
+ specify 'to_v should have 6 in edges' do
100
+ to_v.in_edges.count.should == 6
101
+ end
102
+
103
+ specify 'to_v should have 3 in edges with label a' do
104
+ to_v.in_edges('a').count.should == 3
105
+ end
106
+
107
+ specify 'to_v should have 4 in edges with label a or c' do
108
+ to_v.in_edges('a', 'c').count.should == 4
109
+ end
110
+
111
+ it 'should add an extension' do
112
+ edge = to_v.in_edges(Tackle::SimpleMixin).first
113
+ edge.should be_a(Pacer::EdgeMixin)
114
+ edge.extensions.should include(Tackle::SimpleMixin)
115
+ end
116
+
117
+ it 'should be able to mix labels and mixins as arguments' do
118
+ edge = to_v.in_edges('a', Tackle::SimpleMixin, 'b').first
119
+ edge.should be_a(Pacer::EdgeMixin)
120
+ edge.extensions.should include(Tackle::SimpleMixin)
121
+ end
122
+
123
+ it 'should filter correctly with a mix of labels and mixins as arguments' do
124
+ to_v.in_edges('a', Tackle::SimpleMixin, 'b').count.should == 5
125
+ end
126
+ end
127
+
128
+ describe '#out_edges' do
129
+ specify 'from_v should have 6 out edges' do
130
+ from_v.out_edges.count.should == 6
131
+ end
132
+
133
+ specify 'from_v should have 3 out edges with label a' do
134
+ from_v.out_edges('a').count.should == 3
135
+ end
136
+
137
+ specify 'from_v should have 4 out edges with label a or c' do
138
+ from_v.out_edges('a', 'c').count.should == 4
139
+ end
140
+
141
+ it 'should add an extension' do
142
+ edge = from_v.out_edges(Tackle::SimpleMixin).first
143
+ edge.should be_a(Pacer::EdgeMixin)
144
+ edge.extensions.should include(Tackle::SimpleMixin)
145
+ end
146
+
147
+ it 'should be able to mix labels and mixins as arguments' do
148
+ edge = from_v.out_edges('a', Tackle::SimpleMixin, 'b').first
149
+ edge.should be_a(Pacer::EdgeMixin)
150
+ edge.extensions.should include(Tackle::SimpleMixin)
151
+ end
152
+
153
+ it 'should filter correctly with a mix of labels and mixins as arguments' do
154
+ from_v.out_edges('a', Tackle::SimpleMixin, 'b').count.should == 5
155
+ end
156
+ end
157
+
158
+ describe '#both_edges' do
159
+ specify 'from_v should have 6 edges' do
160
+ from_v.both_edges.count.should == 6
161
+ end
162
+
163
+ specify 'from_v should have 3 edges with label a' do
164
+ from_v.both_edges('a').count.should == 3
165
+ end
166
+
167
+ specify 'from_v should have 4 edges with label a or c' do
168
+ from_v.both_edges('a', 'c').count.should == 4
169
+ end
170
+
171
+ it 'should add an extension' do
172
+ edge = from_v.both_edges(Tackle::SimpleMixin).first
173
+ edge.should be_a(Pacer::EdgeMixin)
174
+ edge.extensions.should include(Tackle::SimpleMixin)
175
+ end
176
+
177
+ it 'should be able to mix labels and mixins as arguments' do
178
+ edge = from_v.both_edges('a', Tackle::SimpleMixin, 'b').first
179
+ edge.should be_a(Pacer::EdgeMixin)
180
+ edge.extensions.should include(Tackle::SimpleMixin)
181
+ end
182
+
183
+ it 'should filter correctly with a mix of labels and mixins as arguments' do
184
+ from_v.both_edges('a', Tackle::SimpleMixin, 'b').count.should == 5
185
+ end
186
+ end
187
+ end
188
+ end
189
+
190
+ Run.all do
191
+ it_uses Pacer::VertexMixin
192
+ end
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,419 @@
1
+ require 'spec_helper'
2
+
3
+ Run.all do
4
+ describe Pacer::Core::Route, 'pipe creation internals' do
5
+ context "graph.v" do
6
+ describe '#build_pipeline' do
7
+ subject { graph.v.send(:build_pipeline) }
8
+ it { should be_a(Array) }
9
+ its(:count) { should == 2 }
10
+ its(:first) { should be_a(com.tinkerpop.pipes.transform.VerticesPipe) }
11
+ specify { subject.first.should equal(subject.last) }
12
+ end
13
+
14
+ describe '#pipe_source' do
15
+ subject { graph.v.send(:pipe_source) }
16
+ it { should be_nil }
17
+ end
18
+
19
+ describe '#iterator' do
20
+ use_simple_graph_data
21
+ before { setup_data }
22
+ subject { graph.v.send(:iterator) }
23
+ its(:next) { should_not be_nil }
24
+ end
25
+ end
26
+
27
+ context "graph.v(:name => 'gremlin').as(:grem).in_e(:wrote)" do
28
+ let(:route) { graph.v(:name => 'gremlin').as(:grem).in_e(:wrote) }
29
+ subject { route }
30
+
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)>"
34
+ end
35
+ its(:out_v) { should_not be_nil }
36
+ end
37
+
38
+ context "graph.v(:name => 'gremlin').as(:grem).in_e(:wrote)" do
39
+ let(:route) { graph.v.in_e.out_v(Tackle::SimpleMixin) }
40
+ subject { route }
41
+
42
+ its(:in_e) { should_not be_nil }
43
+ its(:to_a) { should == [] }
44
+ its(:extensions) { should == Set[Tackle::SimpleMixin] }
45
+ end
46
+
47
+ context "graph.v(:name => 'darrick')" do
48
+ use_simple_graph_data
49
+ before { setup_data }
50
+ subject { graph.v(:name => 'darrick') }
51
+
52
+ its('iterator.next') { should == v1 }
53
+ its(:to_a) { should == [v1] }
54
+ end
55
+
56
+ context 'graph.v.element_ids' do
57
+ describe '#build_pipeline' do
58
+ subject { graph.v.element_ids.send(:build_pipeline) }
59
+ it { should be_a(Array) }
60
+ its(:count) { should == 2 }
61
+ its(:first) { should be_a(com.tinkerpop.pipes.transform.VerticesPipe) }
62
+ its(:last) { should be_a(Pacer::Pipes::IdPipe) }
63
+ end
64
+
65
+ describe '#iterator' do
66
+ use_simple_graph_data
67
+ before { setup_data }
68
+ subject { graph.v.element_ids.send(:iterator) }
69
+ its(:next) { should_not be_nil }
70
+ it 'should iterate twice then raise an exception' do
71
+ 2.times {
72
+ [v0.element_id, v1.element_id].should include(subject.next)
73
+ }
74
+ begin
75
+ subject.next
76
+ fail 'expected exception to be raised'
77
+ rescue NativeException => e
78
+ e.cause.inspect.should == 'java.util.NoSuchElementException'
79
+ end
80
+ end
81
+ end
82
+
83
+ describe '#to_a' do
84
+ use_simple_graph_data
85
+ before { setup_data }
86
+ subject { graph.v.element_ids.to_a }
87
+ its(:sort) { should == [v0.element_id, v1.element_id].sort }
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ Run.all(:read_only) do
94
+ describe Pacer::Core::Route do
95
+ use_pacer_graphml_data(:read_only)
96
+ before { setup_data }
97
+ describe '#inspect' do
98
+ it 'should show the path in the resulting string' do
99
+ r = graph.v(:name => 'gremlin')
100
+ r = r.as(:grem)
101
+ r = r.in_e(:wrote)
102
+ r = r.out_v
103
+ r = r.out_e(:wrote) { |e| true }
104
+ r = r.in_v
105
+ 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
+ end
109
+ end
110
+
111
+ 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] }
116
+ end
117
+
118
+ describe '#root?' do
119
+ it { graph.should be_root }
120
+ it { graph.v.should be_root }
121
+ it { graph.v[3].should_not be_root }
122
+ it { graph.v.out_e.should_not be_root }
123
+ it { graph.v.out_e.in_v.should_not be_root }
124
+ end
125
+
126
+ describe 'property filter' do
127
+ it { graph.v(:name => 'pacer').to_a.should == [pacer] }
128
+ it { graph.v(:name => 'pacer').count.should == 1 }
129
+ end
130
+
131
+ describe 'block filter' do
132
+ it { graph.v { false }.count.should == 0 }
133
+ it { graph.v { true }.count.should == graph.v.count }
134
+ it { graph.v { |v| v.out_e.none? }[:name].to_a.should == ['blueprints'] }
135
+
136
+ it 'should work with paths' do
137
+ paths = graph.v.out_e(:wrote).in_v.paths.collect(&:to_a)
138
+ filtered_paths = graph.v { true }.out_e(:wrote).e { true }.in_v.paths.collect(&:to_a)
139
+ filtered_paths.should == paths
140
+ end
141
+ end
142
+
143
+ describe '#==' do
144
+ specify { graph.v.should == graph.v }
145
+ specify { graph.v.should_not == graph.v { true } }
146
+ specify { graph.v.should_not == graph.v(:x => 1) }
147
+ specify { graph.e.should == graph.e }
148
+ specify { graph.v.should_not == graph.e }
149
+ end
150
+
151
+ describe '#result' do
152
+ context 'no matching vertices' do
153
+ subject { graph.v(:name => 'missing').result }
154
+ it { should be_a(Pacer::Core::Graph::VerticesRoute) }
155
+ its(:count) { should == 0 }
156
+ its(:empty?) { should be_true }
157
+ end
158
+
159
+ it 'should not be nil when no matching vertices' do
160
+ empty = graph.v(:name => 'missing').result
161
+ empty.should be_a(Pacer::Core::Graph::VerticesRoute)
162
+ empty.count.should == 0
163
+ end
164
+
165
+ it 'should not be nil when no matching edges' do
166
+ empty = graph.e(:missing).result
167
+ empty.should be_a(Pacer::Core::Graph::EdgesRoute)
168
+ empty.count.should == 0
169
+ end
170
+
171
+ it 'should not be nil when no matching mixed results' do
172
+ empty = [].to_route(:graph => graph, :element_type => :mixed)
173
+ empty.should be_a(Pacer::Core::Graph::MixedRoute)
174
+ empty.count.should == 0
175
+ end
176
+ end
177
+ end
178
+ end
179
+
180
+ # These specs are :read_only
181
+ shared_examples_for Pacer::Core::Route do
182
+ # defaults -- you
183
+ let(:route) { raise 'define a route' }
184
+ let(:number_of_results) { raise 'how many results are expected' }
185
+ let(:result_type) { raise 'specify :vertex, :edge, :mixed or :object' }
186
+ let(:back) { nil }
187
+ let(:info) { nil }
188
+ let(:route_extensions) { Set[] }
189
+
190
+ context 'without data' do
191
+ subject { route }
192
+ it { should be_a(Pacer::Core::Route) }
193
+ its(:graph) { should equal(graph) }
194
+ its(:back) { should equal(back) }
195
+ its(:info) { should == info }
196
+ context 'with info' do
197
+ before { route.info = 'some info' }
198
+ its(:info) { should == 'some info' }
199
+ after { route.info = nil }
200
+ end
201
+ its(:vars) { should be_a(Hash) }
202
+
203
+ describe '#from_graph?' do
204
+ subject { route }
205
+ it { should be_from_graph graph }
206
+ it { should_not be_from_graph graph2 }
207
+ end
208
+
209
+ describe '#each' do
210
+ it { route.each.should be_a(java.util.Iterator) }
211
+ end
212
+
213
+ describe '#result' do
214
+ before { graph.checkpoint }
215
+ subject { route.result }
216
+ its(:element_type) { should == route.element_type }
217
+ end
218
+
219
+ end
220
+
221
+ context 'with data' do
222
+ around do |spec|
223
+ if number_of_results > 0
224
+ setup_data
225
+ spec.run
226
+ end
227
+ end
228
+
229
+ let(:first_element) { route.first }
230
+ let(:all_elements) { route.to_a }
231
+
232
+ subject { route }
233
+
234
+ its(:extensions) { should == route_extensions }
235
+
236
+ describe '#[Fixnum]' do
237
+ subject { route[number_of_results - 1] }
238
+ it { should be_a(Pacer::Core::Route) }
239
+ its(:count) { should == 1 }
240
+ its(:result) { should be_a(Pacer::Core::Route) }
241
+ its(:extensions) { should == route.extensions }
242
+ end
243
+
244
+ describe '#result' do
245
+ subject { route.result }
246
+ it { should be_a(Pacer::Core::Route) }
247
+ its(:count) { should == number_of_results }
248
+ end
249
+
250
+ describe '#route' do
251
+ subject { route.route }
252
+ its(:hide_elements) { should be_true }
253
+ it { should equal(route) }
254
+ end
255
+
256
+ describe '#first' do
257
+ subject { route.first }
258
+ it { should_not be_nil }
259
+ its(:graph) { should equal(graph) }
260
+ its('extensions.to_a') { should == route.extensions.to_a }
261
+ end
262
+
263
+ describe '#to_a' do
264
+ subject { route.to_a }
265
+ its(:count) { should == number_of_results }
266
+ it { should be_a(Array) }
267
+ its('first.extensions.to_a') { should == route.extensions.to_a }
268
+ end
269
+
270
+ describe '#except' do
271
+ context '(first_element)' do
272
+ subject { route.except(first_element) }
273
+ its(:to_a) { should_not include(first_element) }
274
+ its('first.class') { should == first_element.class }
275
+ its(:extensions) { should == route.extensions }
276
+ end
277
+ context '(all_elements)' do
278
+ subject { route.except(all_elements) }
279
+ its(:count) { should == 0 }
280
+ end
281
+ end
282
+
283
+ describe '#only' do
284
+ subject { route.only(first_element).uniq }
285
+ its(:to_a) { should == [first_element] }
286
+ its('first.class') { should == first_element.class }
287
+ its(:extensions) { should == route.extensions }
288
+
289
+ context 'for non-elements' do
290
+ subject { route.element_ids.only(first_element.element_id).uniq }
291
+ its(:to_a) { should == [first_element.element_id] }
292
+ end
293
+ end
294
+ end
295
+
296
+ context 'without data' do
297
+ around do |spec|
298
+ if number_of_results == 0
299
+ setup_data
300
+ spec.run
301
+ end
302
+ end
303
+
304
+ subject { route }
305
+
306
+ describe '#[Fixnum]' do
307
+ subject { route[0] }
308
+ it { should be_a(Pacer::Core::Route) }
309
+ its(:count) { should == 0 }
310
+ its(:result) { should be_a(Pacer::Core::Route) }
311
+ end
312
+
313
+ describe '#result' do
314
+ subject { route.result }
315
+ it { should be_a(Pacer::Core::Route) }
316
+ its(:count) { should == number_of_results }
317
+ end
318
+
319
+ describe '#route' do
320
+ subject { route.route }
321
+ its(:hide_elements) { should be_true }
322
+ it { should equal(route) }
323
+ end
324
+
325
+ describe '#first' do
326
+ subject { route.first }
327
+ it { should be_nil }
328
+ end
329
+
330
+ describe '#to_a' do
331
+ subject { route.to_a }
332
+ its(:count) { should == number_of_results }
333
+ it { should be_a(Array) }
334
+ end
335
+
336
+ describe '#element_type' do
337
+ its(:element_type) { should == graph.element_type(result_type) }
338
+ end
339
+
340
+ describe '#add_extension' do
341
+ # Note that this mixin doesn't need to include
342
+ # versions of each test with extensions applied because
343
+ 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
+ end
349
+ its(:extensions) { should include(Tackle::SimpleMixin) }
350
+ it { should respond_to(:route_mixin_method) }
351
+ end
352
+
353
+ context '(Object)' do
354
+ before do
355
+ @orig_ancestors = route.class.ancestors
356
+ route.add_extension Object
357
+ end
358
+ its(:extensions) { should_not include(Object) }
359
+ end
360
+
361
+ context '(invalid)' do
362
+ before do
363
+ @orig_ancestors = route.class.ancestors
364
+ route.add_extension :invalid
365
+ end
366
+ its(:extensions) { should_not include(:invalid) }
367
+ end
368
+ end
369
+
370
+ describe '#add_extensions' do
371
+ subject { route.add_extensions([Tackle::SimpleMixin, Object, :invalid]) }
372
+ its(:extensions) { should include(Tackle::SimpleMixin) }
373
+ end
374
+ end
375
+ end
376
+
377
+ Run.all(:read_only) do
378
+ use_pacer_graphml_data(:read_only)
379
+ context 'vertices' do
380
+ it_uses Pacer::Core::Route do
381
+ let(:route) { graph.v }
382
+ let(:number_of_results) { 7 }
383
+ let(:result_type) { :vertex }
384
+ end
385
+ end
386
+ end
387
+ Run.all(:read_only) do
388
+ use_pacer_graphml_data(:read_only)
389
+ context 'vertices with extension' do
390
+ it_uses Pacer::Core::Route do
391
+ let(:back) { nil }
392
+ let(:route) { graph.v.filter(Tackle::SimpleMixin) }
393
+ let(:number_of_results) { 7 }
394
+ let(:result_type) { :vertex }
395
+ let(:route_extensions) { Set[Tackle::SimpleMixin] }
396
+ end
397
+ end
398
+ end
399
+ Run.all(:read_only) do
400
+ use_pacer_graphml_data(:read_only)
401
+ context 'no vertices' do
402
+ it_uses Pacer::Core::Route do
403
+ let(:back) { graph.v }
404
+ let(:route) { back.filter(:something => 'missing') }
405
+ let(:number_of_results) { 0 }
406
+ let(:result_type) { :vertex }
407
+ end
408
+ end
409
+ end
410
+ Run.all(:read_only) do
411
+ use_pacer_graphml_data(:read_only)
412
+ context 'edges' do
413
+ it_uses Pacer::Core::Route do
414
+ let(:route) { graph.e }
415
+ let(:number_of_results) { 14 }
416
+ let(:result_type) { :edge }
417
+ end
418
+ end
419
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ Run.all do
4
+ use_pacer_graphml_data
5
+
6
+ describe RouteOperations, :transactions => false do
7
+ before { setup_data }
8
+
9
+ describe '#bulk_job', :transactions => false do
10
+ context 'commit every 2nd record, updating all vertices' do
11
+ context 'with wrapped elements' do
12
+ it 'should update all records' do
13
+ graph.v(Tackle::SimpleMixin).bulk_job(2) do |v|
14
+ v[:updated] = 'yes'
15
+ end
16
+ graph.v(:updated => 'yes').count.should == 7
17
+ end
18
+ end
19
+
20
+ it 'should update all records' do
21
+ graph.v.bulk_job(2) do |v|
22
+ v[:updated] = 'yup'
23
+ end
24
+ graph.v(:updated => 'yup').count.should == 7
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+