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,538 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'an edge with a mixin' do
4
+ its(:route_mixin_method) { should be_true }
5
+ its(:edge_mixin_method) { should be_true }
6
+ it 'should not include the Vertex module' do
7
+ expect { subject.vertex_mixin_method }.to raise_error(NoMethodError)
8
+ end
9
+ end
10
+
11
+ shared_examples_for 'a vertex with a mixin' do
12
+ its(:route_mixin_method) { should be_true }
13
+ its(:vertex_mixin_method) { should be_true }
14
+ it 'should not include the Edge module' do
15
+ expect { subject.edge_mixin_method }.to raise_error(NoMethodError)
16
+ end
17
+ end
18
+
19
+ shared_examples_for Pacer::GraphMixin do
20
+ let(:v0) { graph.create_vertex }
21
+ let(:v1) { graph.create_vertex }
22
+ let(:e0) { graph.create_edge nil, v0, v1, :links }
23
+ let(:e1) { graph.create_edge nil, v0, v1, :relinks }
24
+ before do
25
+ e0 # force edge and vertices to be created.
26
+ end
27
+
28
+ describe '#vertex' do
29
+ context 'not found' do
30
+ subject { graph.vertex '-1' }
31
+ it { should be_nil }
32
+ end
33
+
34
+ subject { graph.vertex v0.element_id }
35
+ its(:element_id) { should == v0.element_id }
36
+ its(:graph) { should == graph }
37
+
38
+ context 'with mixins' do
39
+ subject { graph.vertex v0.element_id, Tackle::SimpleMixin }
40
+ its(:element_id) { should == v0.element_id }
41
+ it_behaves_like 'a vertex with a mixin'
42
+ end
43
+
44
+ context 'with a wrapper' do
45
+ let(:wrapper) { Pacer.vertex_wrapper Tackle::SimpleMixin }
46
+ subject { graph.vertex v0.element_id, wrapper }
47
+ its(:element_id) { should == v0.element_id }
48
+ its(:class) { should == wrapper }
49
+ it_behaves_like 'a vertex with a mixin'
50
+ end
51
+
52
+ context 'with a wrapper and a mixin' do
53
+ let(:orig_wrapper) { Pacer.vertex_wrapper Tackle::SimpleMixin }
54
+ let(:wrapper) { Pacer.vertex_wrapper Tackle::SimpleMixin, TP::Person }
55
+ subject { graph.vertex v0.element_id, TP::Person, orig_wrapper }
56
+ its(:element_id) { should == v0.element_id }
57
+ its(:class) { should_not == orig_wrapper }
58
+ its(:class) { should == wrapper }
59
+ it_behaves_like 'a vertex with a mixin'
60
+ end
61
+ end
62
+
63
+ describe '#edge' do
64
+ context 'not found' do
65
+ subject { graph.edge '-1' }
66
+ it { should be_nil }
67
+ end
68
+
69
+ subject { graph.edge e0.element_id }
70
+ its(:element_id) { should == e0.element_id }
71
+ its(:graph) { should == graph }
72
+
73
+ context 'with mixins' do
74
+ subject { graph.edge e0.element_id, Tackle::SimpleMixin }
75
+ its(:element_id) { should == e0.element_id }
76
+ it_behaves_like 'an edge with a mixin'
77
+ end
78
+
79
+ context 'with a wrapper' do
80
+ let(:wrapper) { Pacer.edge_wrapper Tackle::SimpleMixin }
81
+ subject { graph.edge e0.element_id, wrapper }
82
+ its(:element_id) { should == e0.element_id }
83
+ its(:class) { should == wrapper }
84
+ it_behaves_like 'an edge with a mixin'
85
+ end
86
+
87
+ context 'with a wrapper and a mixin' do
88
+ let(:orig_wrapper) { Pacer.edge_wrapper Tackle::SimpleMixin }
89
+ let(:wrapper) { Pacer.edge_wrapper Tackle::SimpleMixin, TP::Wrote }
90
+ subject { graph.edge e0.element_id, orig_wrapper, TP::Wrote }
91
+ its(:element_id) { should == e0.element_id }
92
+ its(:class) { should_not == orig_wrapper }
93
+ its(:class) { should == wrapper }
94
+ it_behaves_like 'an edge with a mixin'
95
+ end
96
+ end
97
+
98
+ describe '#create_vertex' do
99
+ context 'existing' do
100
+ it 'should raise an exception' do
101
+ if graph.supports_custom_element_ids?
102
+ expect { graph.create_vertex v0.element_id }.to raise_error(Pacer::ElementExists)
103
+ end
104
+ end
105
+ end
106
+
107
+ context 'with properties' do
108
+ subject { graph.create_vertex :name => 'Frank' }
109
+ it { subject[:name].should == 'Frank' }
110
+ its(:element_id) { should_not be_nil }
111
+
112
+ context 'and an id' do
113
+ subject { graph.create_vertex 1234, :name => 'Steve' }
114
+ it { subject[:name].should == 'Steve' }
115
+ its('element_id.to_s') do
116
+ if graph.respond_to? :id_prefix
117
+ should == graph.id_prefix + '1234'
118
+ elsif graph.supports_custom_element_ids?
119
+ should == '1234'
120
+ end
121
+ end
122
+
123
+ context 'and mixins' do
124
+ subject { graph.create_vertex 1234, Tackle::SimpleMixin, :name => 'John' }
125
+ it { subject[:name].should == 'John' }
126
+ its('element_id.to_s') do
127
+ if graph.respond_to? :id_prefix
128
+ should == graph.id_prefix + '1234'
129
+ elsif graph.supports_custom_element_ids?
130
+ should == '1234'
131
+ end
132
+ end
133
+ it_behaves_like 'a vertex with a mixin'
134
+ end
135
+ end
136
+ end
137
+
138
+ context 'with an id' do
139
+ subject { graph.create_vertex 1234 }
140
+ its('element_id.to_s') do
141
+ if graph.respond_to? :id_prefix
142
+ should == graph.id_prefix + '1234'
143
+ elsif graph.supports_custom_element_ids?
144
+ should == '1234'
145
+ end
146
+ end
147
+
148
+ context 'and mixins' do
149
+ subject { graph.create_vertex 1234, Tackle::SimpleMixin }
150
+ its('element_id.to_s') do
151
+ if graph.respond_to? :id_prefix
152
+ should == graph.id_prefix + '1234'
153
+ elsif graph.supports_custom_element_ids?
154
+ should == '1234'
155
+ end
156
+ end
157
+ it_behaves_like 'a vertex with a mixin'
158
+ end
159
+ end
160
+
161
+ context 'with mixins' do
162
+ subject { graph.create_vertex Tackle::SimpleMixin }
163
+ it_behaves_like 'a vertex with a mixin'
164
+ end
165
+ end
166
+
167
+
168
+ describe '#create_edge' do
169
+ let(:from) { graph.vertex v0.element_id }
170
+ let(:to) { graph.vertex v1.element_id }
171
+
172
+ context 'existing' do
173
+ it 'should raise an exception' do
174
+ if graph.supports_custom_element_ids?
175
+ expect { graph.create_edge e0.element_id, from, to, :connects }.to raise_error(Pacer::ElementExists)
176
+ end
177
+ end
178
+ end
179
+
180
+ context 'with properties' do
181
+ subject { graph.create_edge nil, from, to, :connects, :name => 'Frank' }
182
+ it { subject[:name].should == 'Frank' }
183
+ its(:label) { should == 'connects' }
184
+ its(:element_id) { should_not be_nil }
185
+
186
+ context 'and an id' do
187
+ subject { graph.create_edge 1234, from, to, :connects, :name => 'Steve' }
188
+ it { subject[:name].should == 'Steve' }
189
+ its(:label) { should == 'connects' }
190
+ its('element_id.to_i') { should == 1234 if graph.supports_custom_element_ids? }
191
+
192
+ context 'and mixins' do
193
+ subject { graph.create_edge 1234, from, to, :connects, Tackle::SimpleMixin, :name => 'John' }
194
+ it { subject[:name].should == 'John' }
195
+ its(:label) { should == 'connects' }
196
+ its('element_id.to_i') { should == 1234 if graph.supports_custom_element_ids? }
197
+ it_behaves_like 'an edge with a mixin'
198
+ end
199
+ end
200
+ end
201
+
202
+ context 'with an id' do
203
+ subject { graph.create_edge 1234, from, to, :connects }
204
+ its(:label) { should == 'connects' }
205
+ its('element_id.to_i') { should == 1234 if graph.supports_custom_element_ids? }
206
+
207
+ context 'and mixins' do
208
+ subject { graph.create_edge 1234, from, to, :connects, Tackle::SimpleMixin }
209
+ its(:label) { should == 'connects' }
210
+ its('element_id.to_i') { should == 1234 if graph.supports_custom_element_ids? }
211
+ it_behaves_like 'an edge with a mixin'
212
+ end
213
+ end
214
+
215
+ context 'with mixins' do
216
+ subject { graph.create_edge nil, from, to, :connects, Tackle::SimpleMixin }
217
+ its(:label) { should == 'connects' }
218
+ it_behaves_like 'an edge with a mixin'
219
+ end
220
+ end
221
+
222
+ describe '#bulk_job_size' do
223
+ subject { graph.bulk_job_size }
224
+ describe 'default' do
225
+ it { should == 5000 }
226
+ end
227
+ describe 'custom' do
228
+ before { graph.bulk_job_size = 12 }
229
+ it { should == 12 }
230
+ end
231
+ end
232
+
233
+ describe '#in_bulk_job?' do
234
+ subject { graph.in_bulk_job? }
235
+ it { should be_false }
236
+
237
+ context 'in bulk job' do
238
+ around do |spec|
239
+ graph.v[0].bulk_job do
240
+ spec.call
241
+ end
242
+ end
243
+ it { should be_true }
244
+ end
245
+ end
246
+
247
+ describe '#load_vertices' do
248
+ context 'invalid' do
249
+ subject { graph.load_vertices [v0.element_id, nil, v0.element_id, 'missing'] }
250
+ it { should == [v0, v0] }
251
+ end
252
+
253
+ context 'valid' do
254
+ subject { graph.load_vertices [v0.element_id, v1.element_id] }
255
+ it { should == [v0, v1] }
256
+ end
257
+ end
258
+
259
+ describe '#load_edges' do
260
+ before { graph.checkpoint }
261
+ context 'invalid' do
262
+ subject { graph.load_edges [e0.element_id, nil, e0.element_id, 'missing'] }
263
+ it { should == [e0, e0] }
264
+ end
265
+
266
+ context 'valid' do
267
+ subject { graph.load_edges [e0.element_id] }
268
+ it { should == [e0] }
269
+ end
270
+ end
271
+
272
+ describe '#index_name' do
273
+
274
+
275
+ it 'should have 2 indices' do
276
+ graph.indices.count.should == 2 if graph.supports_automatic_indices?
277
+ end
278
+
279
+ context "'vertices'" do
280
+ around { |spec| spec.run if graph.supports_automatic_indices? }
281
+ subject { graph.index_name 'vertices' }
282
+ it { should_not be_nil }
283
+ its(:index_name) { should == 'vertices' }
284
+ its(:index_type) { should == Pacer.automatic_index }
285
+ its(:index_class) { should == graph.index_class(:vertex) }
286
+ context ':vertex' do
287
+ subject { graph.index_name 'vertices', :vertex }
288
+ it { should_not be_nil }
289
+ end
290
+ context ':edge' do
291
+ subject { graph.index_name 'vertices', :edge }
292
+ it { should be_nil }
293
+ end
294
+ end
295
+
296
+ context "'edges'" do
297
+ around { |spec| spec.run if graph.supports_edge_indices? }
298
+ subject { graph.index_name 'edges' }
299
+ it { should_not be_nil }
300
+ its(:index_name) { should == 'edges' }
301
+ its(:index_type) { should == Pacer.automatic_index }
302
+ its(:index_class) { should == graph.index_class(:edge) }
303
+ context ':vertex' do
304
+ subject { graph.index_name 'edges', :vertex }
305
+ it { should be_nil }
306
+ end
307
+ context ':edge' do
308
+ subject { graph.index_name 'edges', :edge }
309
+ it { should_not be_nil }
310
+ end
311
+ end
312
+
313
+ context 'missing' do
314
+ around { |spec| spec.run if graph.supports_manual_indices? }
315
+ subject { graph.index_name 'invalid' }
316
+ it { should be_nil }
317
+ context 'edge' do
318
+ before do
319
+ graph.drop_index 'missing_edge' rescue nil
320
+ graph.index_name('missing_edge').should be_nil
321
+ end
322
+ subject { graph.index_name 'missing_edge', :edge, :create => true }
323
+ its(:index_name) { should == 'missing_edge' }
324
+ its(:index_type) { should == Pacer.manual_index }
325
+ its(:index_class) { should == graph.index_class(:edge) }
326
+ after do
327
+ graph.transaction do
328
+ graph.drop_index 'missing_edge'
329
+ end
330
+ end
331
+ end
332
+
333
+ context 'vertex' do
334
+ before do
335
+ graph.drop_index 'missing_vertex' rescue nil
336
+ graph.index_name('missing_vertex').should be_nil
337
+ end
338
+ subject { graph.index_name 'missing_vertex', :vertex, :create => true }
339
+ its(:index_name) { should == 'missing_vertex' }
340
+ its(:index_type) { should == Pacer.manual_index }
341
+ its(:index_class) { should == graph.index_class(:vertex) }
342
+ after do
343
+ graph.transaction do
344
+ graph.drop_index 'missing_vertex'
345
+ end
346
+ end
347
+ end
348
+ end
349
+
350
+ it 'should return the same object each time' do
351
+ if graph.supports_manual_indices? or graph.supports_automatic_indices?
352
+ graph.index_name('vertices').should equal(graph.index_name('vertices'))
353
+ end
354
+ end
355
+ end
356
+
357
+ describe '#graph' do
358
+ subject { graph.graph }
359
+ it { should == graph }
360
+ end
361
+
362
+ describe '#vertex_name' do
363
+ before { graph.vertex_name = :some_proc }
364
+ subject { graph.vertex_name }
365
+ it { should == :some_proc }
366
+ after { graph.vertex_name = nil }
367
+ end
368
+
369
+ describe '#edge_name' do
370
+ before { graph.edge_name = :some_proc }
371
+ subject { graph.edge_name }
372
+ it { should == :some_proc }
373
+ after { graph.edge_name = nil }
374
+ end
375
+
376
+ describe '#index_class' do
377
+ around { |spec| spec.run if graph.respond_to? :index_class }
378
+ subject { graph.index_class(:vertex) }
379
+ specify 'should be the class the index returns when queried for index_class' do
380
+ if graph.is_a? Pacer::DexGraph
381
+ subject.should == graph.indices.first.index_class
382
+ else
383
+ subject.to_s.should == graph.index_name('vertices').index_class.to_s
384
+ end
385
+ end
386
+ end
387
+
388
+ describe '#import' do
389
+ before { pending 'create a fresh graph for these tests' if graph.is_a? Pacer::DexGraph }
390
+
391
+ it 'should load the data into an empty graph' do
392
+ graph2.v.count.should == 0
393
+ graph2.import 'spec/data/pacer.graphml'
394
+ graph2.v.count.should == 7
395
+ graph2.e.count.should == 14
396
+ end
397
+
398
+ it 'should not load the data into a graph with conflicting vertex ids' do
399
+ if graph.supports_custom_element_ids?
400
+ graph.create_vertex '0' unless graph.vertex '0'
401
+ expect { graph.import 'spec/data/pacer.graphml' }.to raise_error(Pacer::ElementExists)
402
+ end
403
+ end
404
+ end
405
+
406
+ describe '#export' do
407
+ before { pending 'create a fresh graph for these tests' if graph.is_a? Pacer::DexGraph }
408
+ it 'should create a file that can be read back' do
409
+ graph.export 'tmp/graph_mixin_spec_export.graphml'
410
+ graph2.import 'tmp/graph_mixin_spec_export.graphml'
411
+ graph2.v.count.should == graph.v.count
412
+ graph2.e.count.should == graph.e.count
413
+ end
414
+ end
415
+
416
+ end
417
+
418
+
419
+ Run.all :read_only, false do
420
+ around do |spec|
421
+ spec.run if graph
422
+ end
423
+
424
+ let(:v0) { graph.create_vertex }
425
+ let(:v1) { graph.create_vertex }
426
+ let(:e0) { graph.create_edge nil, v0, v1, :links }
427
+ let(:e1) { graph.create_edge nil, v0, v1, :relinks }
428
+
429
+ describe Pacer::GraphMixin do
430
+ before do
431
+ e0 # force edge and vertices to be created.
432
+ end
433
+
434
+ describe 'rebuild_automatic_index', :transactions => false do
435
+ context 'vertices' do
436
+ before do
437
+ v0.properties = { :name => 'darrick', :type => 'person' }
438
+ v1.properties = { :name => 'eliza', :type => 'person' }
439
+ @orig_idx = graph.createAutomaticIndex 'vertices', graph.index_class(:vertex), nil
440
+ @new_idx = graph.rebuild_automatic_index @orig_idx
441
+ end
442
+
443
+ after do
444
+ graph.drop_index :vertices
445
+ graph.v.delete!
446
+ end
447
+
448
+ let(:orig_idx) { @orig_idx }
449
+ subject { @new_idx }
450
+ it { should_not equal(orig_idx) }
451
+ it 'should not use the old vertices index' do
452
+ graph.index_name('vertices').should_not equal(orig_idx)
453
+ end
454
+ it { should equal(graph.index_name('vertices')) }
455
+ it 'should have 2 persons' do
456
+ subject.count('type', 'person').should == 2
457
+ end
458
+ it 'should have v1 for eliza' do
459
+ subject.get('name', 'eliza').to_a.should == [v1].to_a
460
+ end
461
+ end
462
+
463
+ context 'edges' do
464
+ before do
465
+ v0.properties = { :name => 'darrick', :type => 'person' }
466
+ v1.properties = { :name => 'eliza', :type => 'person' }
467
+ e0.properties = { :style => 'edgy' }
468
+ e1.properties = { :style => 'edgy' }
469
+ @orig_idx = graph.createAutomaticIndex 'edges', graph.index_class(:edge), nil
470
+ @new_idx = graph.rebuild_automatic_index @orig_idx
471
+ end
472
+
473
+ after do
474
+ graph.drop_index :edges
475
+ graph.v.delete!
476
+ end
477
+
478
+
479
+ let(:orig_idx) { @orig_idx }
480
+ subject { @new_idx }
481
+ it { should_not equal(orig_idx) }
482
+ it 'should not use the old edges index' do
483
+ graph.index_name('edges').should_not equal(orig_idx)
484
+ end
485
+ it { should equal(graph.index_name('edges')) }
486
+ it 'should have 1 edge' do
487
+ subject.count('label', 'links').should == 1
488
+ end
489
+ it 'should have e0 and e1 for style => edgy' do
490
+ subject.get('style', 'edgy').to_set.should == [e0, e1].to_set
491
+ end
492
+ end
493
+ end
494
+ end
495
+
496
+ describe 'edges can be indexed', :transactions => false do
497
+ after do
498
+ graph.drop_index 'edges'
499
+ graph.v.delete!
500
+ end
501
+
502
+ specify 'in an auto index' do
503
+ index = graph.createAutomaticIndex 'edges', graph.index_class(:edge), nil
504
+ graph.edges.count.should == 0
505
+ label = e0.label
506
+ graph.edges.count.should == 1
507
+ index.get('label', label).count.should == 1
508
+ end
509
+
510
+ specify 'by adding them to a new auto index' do
511
+ graph.edges.count.should == 0
512
+ label = e0.label
513
+ graph.edges.count.should == 1
514
+ index = graph.createAutomaticIndex 'edges', graph.index_class(:edge), nil
515
+ index.get('label', label).count.should == 0
516
+ Pacer::Utils::AutomaticIndexHelper.addElement(index, e0)
517
+ index.get('label', label).count.should == 1
518
+ end
519
+ end
520
+ end
521
+
522
+ Run.all do
523
+ it_uses Pacer::GraphMixin
524
+ end
525
+
526
+ Run.neo4j do
527
+ describe '#vertex' do
528
+ it 'should not raise an exception for invalid key type' do
529
+ graph.vertex('bad id').should be_nil
530
+ end
531
+ end
532
+
533
+ describe '#edge' do
534
+ it 'should not raise an exception for invalid key type' do
535
+ graph.edge('bad id').should be_nil
536
+ end
537
+ end
538
+ end
File without changes