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,199 @@
1
+ module Pacer
2
+ class RubyGraph
3
+ import com.tinkerpop.blueprints.pgm.Element
4
+ import com.tinkerpop.blueprints.pgm.Graph
5
+
6
+ include Graph
7
+
8
+ def initialize
9
+ clear
10
+ end
11
+
12
+ def element_class
13
+ RubyElement
14
+ end
15
+
16
+ def vertex_class
17
+ RubyVertex
18
+ end
19
+
20
+ def edge_class
21
+ RubyEdge
22
+ end
23
+
24
+ def addVertex(id)
25
+ if id
26
+ v_id = id
27
+ else
28
+ v_id = next_id
29
+ end
30
+ raise Pacer::ElementExists if @vertices.key? v_id
31
+ @vertices[v_id] = vertex_class.new self, v_id
32
+ end
33
+
34
+ def getVertex(id)
35
+ @vertices[id]
36
+ end
37
+
38
+ def removeVertex(vertex)
39
+ @vertices.delete vertex.element_id
40
+ end
41
+
42
+ def getVertices
43
+ Pacer::Pipes::EnumerablePipe.new @vertices.values
44
+ end
45
+
46
+ def addEdge(id, outVertex, inVertex, label)
47
+ id ||= next_id
48
+ raise Pacer::ElementExists if @edges.key? id
49
+ @edges[id] = edge_class.new self, id, outVertex, inVertex, label
50
+ end
51
+
52
+ def getEdge(id)
53
+ @edges[id]
54
+ end
55
+
56
+ def removeEdge(edge)
57
+ @edges.delete edge.element_id
58
+ end
59
+
60
+ def getEdges
61
+ Pacer::Pipes::EnumerablePipe.new @edges.values
62
+ end
63
+
64
+ def clear
65
+ @vertices = {}
66
+ @edges = {}
67
+ @next_id = 0
68
+ end
69
+
70
+ def shutdown
71
+ clear
72
+ end
73
+
74
+ def ==(other)
75
+ other.equal? self
76
+ end
77
+
78
+ def supports_custom_element_ids?
79
+ true
80
+ end
81
+
82
+ def supports_automatic_indices?
83
+ false
84
+ end
85
+
86
+ def supports_manual_indices?
87
+ false
88
+ end
89
+
90
+ def supports_edge_indices?
91
+ false
92
+ end
93
+
94
+ include GraphExtensions
95
+
96
+ protected
97
+
98
+ def next_id
99
+ @next_id += 1
100
+ end
101
+ end
102
+
103
+ class RubyElement
104
+ include com.tinkerpop.blueprints.pgm.Element
105
+
106
+ def initialize(graph, element_id)
107
+ @graph = graph
108
+ @element_id = element_id
109
+ @properties = {}
110
+ end
111
+
112
+ def getPropertyKeys
113
+ @properties.keys.to_hashset
114
+ end
115
+
116
+ def getProperty(key)
117
+ v = @properties[key.to_s]
118
+ if v.is_a? String
119
+ v.dup
120
+ else
121
+ v
122
+ end
123
+ end
124
+
125
+ def setProperty(key, value)
126
+ @properties[key.to_s] = value
127
+ end
128
+
129
+ def removeProperty(key)
130
+ @properties.delete key.to_s
131
+ end
132
+
133
+ def getId
134
+ @element_id
135
+ end
136
+
137
+ protected
138
+
139
+ def extract_varargs_strings(labels)
140
+ if labels.first.is_a? ArrayJavaProxy
141
+ labels.first.map { |l| l.to_s }
142
+ else
143
+ labels
144
+ end
145
+ end
146
+ end
147
+
148
+
149
+ class RubyVertex < RubyElement
150
+ include com.tinkerpop.blueprints.pgm.Vertex
151
+
152
+ def getRawVertex
153
+ self
154
+ end
155
+
156
+ def getInEdges(*labels)
157
+ labels = extract_varargs_strings(labels)
158
+ edges = graph.getEdges.select { |e| e.getInVertex == self and (labels.empty? or labels.include? e.getLabel) }
159
+ Pacer::Pipes::EnumerablePipe.new edges
160
+ end
161
+
162
+ def getOutEdges(*labels)
163
+ labels = extract_varargs_strings(labels)
164
+ edges = graph.getEdges.select { |e| e.getOutVertex == self and (labels.empty? or labels.include? e.getLabel) }
165
+ Pacer::Pipes::EnumerablePipe.new edges
166
+ end
167
+
168
+ include VertexExtensions
169
+ end
170
+
171
+ class RubyEdge < RubyElement
172
+ include com.tinkerpop.blueprints.pgm.Edge
173
+
174
+ def initialize(graph, id, out_vertex, in_vertex, label)
175
+ super(graph, id)
176
+ @out_vertex = out_vertex
177
+ @in_vertex = in_vertex
178
+ @label = label.to_s
179
+ end
180
+
181
+ def getRawEdge
182
+ self
183
+ end
184
+
185
+ def getLabel()
186
+ @label
187
+ end
188
+
189
+ def getOutVertex()
190
+ @out_vertex
191
+ end
192
+
193
+ def getInVertex()
194
+ @in_vertex
195
+ end
196
+
197
+ include EdgeExtensions
198
+ end
199
+ end
@@ -0,0 +1,100 @@
1
+ module Pacer
2
+ import com.tinkerpop.blueprints.pgm.impls.tg.TinkerGraph
3
+ import com.tinkerpop.blueprints.pgm.impls.tg.TinkerVertex
4
+ import com.tinkerpop.blueprints.pgm.impls.tg.TinkerEdge
5
+ import com.tinkerpop.blueprints.pgm.impls.tg.TinkerElement
6
+ import com.tinkerpop.blueprints.pgm.impls.tg.TinkerIndex
7
+
8
+ # Create a new TinkerGraph. If path is given, import the GraphML data from
9
+ # the file specified.
10
+ def self.tg(path = nil)
11
+ graph = TinkerGraph.new
12
+ if path
13
+ graph.import(path)
14
+ end
15
+ graph
16
+ end
17
+
18
+
19
+ # Extend the java class imported from blueprints.
20
+ class TinkerGraph
21
+ include GraphMixin
22
+ include GraphIndicesMixin
23
+ include GraphTransactionsStub
24
+ include ManagedTransactionsMixin
25
+ include Pacer::Core::Route
26
+ include Pacer::Core::Graph::GraphRoute
27
+ include Pacer::Core::Graph::GraphIndexRoute
28
+
29
+ def element_class
30
+ TinkerElement
31
+ end
32
+
33
+ def vertex_class
34
+ TinkerVertex
35
+ end
36
+
37
+ def edge_class
38
+ TinkerEdge
39
+ end
40
+
41
+ # Override to return an enumeration-friendly array of vertices.
42
+ def get_vertices
43
+ getVertices.iterator.to_route(:graph => self, :element_type => :vertex)
44
+ end
45
+
46
+ # Override to return an enumeration-friendly array of edges.
47
+ def get_edges
48
+ getEdges.iterator.to_route(:graph => self, :element_type => :edge)
49
+ end
50
+
51
+ def ==(other)
52
+ other.class == self.class and other.object_id == self.object_id
53
+ end
54
+ end
55
+
56
+
57
+ class TinkerIndex
58
+ include IndexMixin
59
+ end
60
+
61
+
62
+ # Extend the java class imported from blueprints.
63
+ class TinkerVertex
64
+ include Pacer::Core::Graph::VerticesRoute
65
+ include ElementMixin
66
+ include VertexMixin
67
+ end
68
+
69
+
70
+ # Extend the java class imported from blueprints.
71
+ class TinkerEdge
72
+ include Pacer::Core::Graph::EdgesRoute
73
+ include ElementMixin
74
+ include EdgeMixin
75
+
76
+ def in_vertex(extensions = nil)
77
+ v = inVertex
78
+ v.graph = graph
79
+ if extensions.is_a? Enumerable
80
+ v.add_extensions extensions
81
+ elsif extensions
82
+ v.add_extensions [extensions]
83
+ else
84
+ v
85
+ end
86
+ end
87
+
88
+ def out_vertex(extensions = nil)
89
+ v = outVertex
90
+ v.graph = graph
91
+ if extensions.is_a? Enumerable
92
+ v.add_extensions extensions
93
+ elsif extensions
94
+ v.add_extensions [extensions]
95
+ else
96
+ v
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,4 @@
1
+ require 'pacer/blueprints/extensions'
2
+ require 'pacer/blueprints/tg'
3
+ require 'pacer/blueprints/ruby_graph'
4
+ require 'pacer/blueprints/multi_graph'
@@ -0,0 +1,92 @@
1
+ module Pacer::Core::Graph
2
+
3
+ # Basic methods for routes that contain only edges.
4
+ module EdgesRoute
5
+ import com.tinkerpop.pipes.transform.OutVertexPipe
6
+ import com.tinkerpop.pipes.transform.InVertexPipe
7
+ import com.tinkerpop.pipes.transform.BothVerticesPipe
8
+
9
+ include ElementRoute
10
+
11
+ # Extends the route with out vertices from this route's matching edges.
12
+ #
13
+ # @param [Array<Hash, extension>, Hash, extension] filter see {Pacer::Route#property_filter}
14
+ # @yield [VertexMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
15
+ # @return [VerticesRoute]
16
+ def out_v(*filters, &block)
17
+ Pacer::Route.property_filter(chain_route(:element_type => :vertex,
18
+ :pipe_class => OutVertexPipe,
19
+ :route_name => 'outV'),
20
+ filters, block)
21
+ end
22
+
23
+ # Extends the route with in vertices from this route's matching edges.
24
+ #
25
+ # @param [Array<Hash, extension>, Hash, extension] filter see {Pacer::Route#property_filter}
26
+ # @yield [VertexMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
27
+ # @return [VerticesRoute]
28
+ def in_v(*filters, &block)
29
+ Pacer::Route.property_filter(chain_route(:element_type => :vertex,
30
+ :pipe_class => InVertexPipe,
31
+ :route_name => 'inV'),
32
+ filters, block)
33
+ end
34
+
35
+ # Extends the route with both in and oud vertices from this route's matching edges.
36
+ #
37
+ # @param [Array<Hash, extension>, Hash, extension] filter see {Pacer::Route#property_filter}
38
+ # @yield [VertexMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
39
+ # @return [VerticesRoute]
40
+ def both_v(*filters, &block)
41
+ Pacer::Route.property_filter(chain_route(:element_type => :vertex,
42
+ :pipe_class => BothVerticesPipe,
43
+ :route_name => 'bothV'),
44
+ filters, block)
45
+ end
46
+
47
+ # Extend route with the additional edge label, property and block filters.
48
+ #
49
+ # @param [Array<Hash, extension>, Hash, extension] filter see {Pacer::Route#property_filter}
50
+ # @yield [EdgeMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
51
+ # @return [EdgesRoute]
52
+ def e(*filters, &block)
53
+ filter(*filters, &block)
54
+ end
55
+
56
+ # Return an route to all edge labels for edges emitted from this
57
+ # route.
58
+ #
59
+ # @return [Core::Route]
60
+ def labels
61
+ chain_route(:pipe_class => com.tinkerpop.pipes.transform.LabelPipe,
62
+ :route_name => 'labels',
63
+ :element_type => :object)
64
+ end
65
+
66
+ # Returns a hash of in vertices with an array of associated out vertices.
67
+ #
68
+ # See #subgraph for a more useful method.
69
+ #
70
+ # @return [Hash]
71
+ def to_h
72
+ inject(Hash.new { |h,k| h[k]=[] }) do |h, edge|
73
+ h[edge.out_vertex] << edge.in_vertex
74
+ h
75
+ end
76
+ end
77
+
78
+ # The element type of this route for this graph implementation.
79
+ #
80
+ # @return [element_type(:edge)] The actual type varies based on
81
+ # which graph is in use.
82
+ def element_type
83
+ graph.element_type(:edge)
84
+ end
85
+
86
+ protected
87
+
88
+ def id_pipe_class
89
+ com.tinkerpop.pipes.transform.IdEdgePipe
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,171 @@
1
+ module Pacer::Core::Graph
2
+
3
+ # Basic methods for routes shared between all route types that emit
4
+ # routes: {VerticesRoute}, {EdgesRoute} and {MixedRoute}
5
+ module ElementRoute
6
+
7
+ # Attach a filter to the current route.
8
+ #
9
+ # @param [Array<Hash, extension>, Hash, extension] filter see {Pacer::Route#property_filter}
10
+ # @yield [ElementMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
11
+ # @return [ElementRoute] the same type and extensions as the source route.
12
+ def filter(*filters, &block)
13
+ Pacer::Route.property_filter(self, filters, block)
14
+ end
15
+
16
+ # v is undefined for edge routes.
17
+ # @see VerticesRoute
18
+ # @see GraphRoute
19
+ def v(*filters)
20
+ raise Pacer::UnsupportedOperation, "Can't get vertices for this route type."
21
+ end
22
+
23
+ # Undefined for vertex routes.
24
+ # @see EdgesRoute
25
+ # @see GraphRoute
26
+ def e(*filters, &block)
27
+ raise Pacer::UnsupportedOperation, "Can't get edges for this route type."
28
+ end
29
+
30
+ # Attach a transform that emits the properties of the elements
31
+ # rather than the elements themselves.
32
+ # @return [Core::Route]
33
+ def properties
34
+ map { |v| v.properties }
35
+ end
36
+
37
+ # Create a new TinkerGraph based on the paths of all matching elements.
38
+ #
39
+ # @return [TinkerGraph] the subgraph
40
+ def subgraph
41
+ paths.subgraph
42
+ end
43
+
44
+ # Delete all matching elements.
45
+ def delete!
46
+ uniq.bulk_job { |e| e.delete! }
47
+ end
48
+
49
+ # Stores the result of the current route in a new route so it will not need
50
+ # to be recalculated.
51
+ # @return [ElementRoute] with the same type and extensions as the
52
+ # source route
53
+ def result(name = nil)
54
+ element_ids.to_a.id_to_element_route(:based_on => self, :name => name)
55
+ end
56
+
57
+ # Accepts a string or symbol to return an array of matching properties, or
58
+ # an integer to return the element at the given offset, or a range to
59
+ # return all elements between the offsets within the range.
60
+ # @overload [](prop)
61
+ # @param [String, Symbol] prop map each element to a single property
62
+ # @return [Core::Route]
63
+ # @overload [](properties)
64
+ # @param [Array<String, Symbol>] properties map each element to a set of properties
65
+ # @return [Core::Route]
66
+ # @overload [](offset)
67
+ # @param [Fixnum] offset narrow the result to a single element at the given position in the results
68
+ # @return [ElementRoute] with the same type and extensions as the source route
69
+ # @overload [](range)
70
+ # @param [Range] range narrow the result to a subset of elements in positions corresponding to the range
71
+ # @return [ElementRoute] with the same type and extensions as the source route
72
+ def [](prop_or_subset)
73
+ case prop_or_subset
74
+ when String, Symbol
75
+ chain_route(:element_type => :object,
76
+ :pipe_class => Pacer::Pipes::PropertyPipe,
77
+ :pipe_args => [prop_or_subset.to_s])
78
+ when Fixnum
79
+ range(prop_or_subset, prop_or_subset)
80
+ when Range
81
+ range(prop_or_subset.begin, prop_or_subset.end)
82
+ when Array
83
+ if prop_or_subset.all? { |i| i.is_a? String or i.is_a? Symbol }
84
+ map do |element|
85
+ prop_or_subset.collect { |i| element.getProperty(i.to_s) }
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ # Map each element to a property but filter out elements that do not
92
+ # have the given property.
93
+ # @param [#to_s] name the property name
94
+ # @return [Core::Route]
95
+ def property?(name)
96
+ chain_route(:element_type => :object,
97
+ :pipe_class => Pacer::Pipes::PropertyPipe,
98
+ :pipe_args => [name.to_s, true])
99
+ end
100
+
101
+ # Attach a route to the element id for each element emitted by the
102
+ # route.
103
+ #
104
+ # @return [Core::Route]
105
+ def element_ids
106
+ chain_route :element_type => :object, :pipe_class => Pacer::Pipes::IdPipe
107
+ end
108
+
109
+ def clone_into(target_graph, opts = {})
110
+ bulk_job(nil, target_graph) do |element|
111
+ element.clone_into(target_graph, opts)
112
+ end
113
+ end
114
+
115
+ def copy_into(target_graph, opts = {})
116
+ bulk_job(nil, target_graph) { |element| element.copy_into(target_graph, opts) }
117
+ end
118
+
119
+ def build_index(index, index_key = nil, property = nil, create = true)
120
+ index_name = index
121
+ unless index.is_a? com.tinkerpop.blueprints.pgm.Index
122
+ index = graph.index_name index.to_s
123
+ end
124
+ sample_element = first
125
+ unless index
126
+ if sample_element
127
+ if create
128
+ index = graph.createManualIndex index_name, graph.element_type(sample_element)
129
+ else
130
+ raise "No index found for #{ index } on #{ graph }" unless index
131
+ end
132
+ else
133
+ return nil
134
+ end
135
+ end
136
+ index_key ||= index.index_name
137
+ property ||= index_key
138
+ if block_given?
139
+ bulk_job do |element|
140
+ value = yield(element)
141
+ index.put(index_key, value, element.element) if value
142
+ end
143
+ else
144
+ bulk_job do |element|
145
+ value = element[property]
146
+ index.put(index_key, value, element.element) if value
147
+ end
148
+ end
149
+ index
150
+ end
151
+
152
+ protected
153
+
154
+ # Determines which iterator mixin is applied to the iterator when #each is called
155
+ def configure_iterator(iter)
156
+ if wrapper
157
+ iter.extend Pacer::Core::Route::IteratorWrapperMixin
158
+ iter.wrapper = wrapper
159
+ iter.extensions = @extensions if @extensions.any?
160
+ iter.graph = graph
161
+ elsif extensions and extensions.any?
162
+ iter.extend Pacer::Core::Route::IteratorExtensionsMixin
163
+ iter.extensions = extensions
164
+ iter.graph = graph
165
+ else
166
+ iter.extend Pacer::Core::Route::IteratorMixin
167
+ iter.graph = graph
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,48 @@
1
+ module Pacer::Core::Graph
2
+
3
+ # This module adds indexed route methods to the basic graph classes returned from the
4
+ # blueprints library.
5
+ module GraphIndexRoute
6
+ # Returns a new route to all graph vertices. Standard filter options.
7
+ def v(*filters, &block)
8
+ filters = Pacer::Route.filters(filters)
9
+ route = indexed_route(:vertex, filters, block)
10
+ if route
11
+ route
12
+ else
13
+ super(filters, &block)
14
+ end
15
+ end
16
+
17
+ # Returns a new route to all graph edges. Standard filter options.
18
+ def e(*filters, &block)
19
+ filters = Pacer::Route.edge_filters(filters)
20
+ route = indexed_route(:edge, filters, block)
21
+ if route
22
+ route
23
+ else
24
+ super(filters, &block)
25
+ end
26
+ end
27
+
28
+ attr_accessor :choose_best_index
29
+ attr_accessor :search_manual_indices
30
+
31
+ protected
32
+
33
+ def indexed_route(element_type, filters, block)
34
+ filters.graph = self
35
+ filters.indices = graph.getIndices
36
+ filters.choose_best_index = choose_best_index != false
37
+ filters.search_manual_indices = search_manual_indices
38
+ idx, key, value = filters.best_index(element_type)
39
+ if idx and key
40
+ route = chain_route :back => self, :element_type => element_type, :filter => :index, :index => idx, :key => key, :value => value
41
+ Pacer::Route.property_filter(route, filters, block)
42
+ elsif filters.route_modules.any?
43
+ mod = filters.route_modules.shift
44
+ Pacer::Route.property_filter(mod.route(self), filters, block)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,55 @@
1
+ module Pacer::Core::Graph
2
+
3
+ # This module adds route methods to the basic graph classes returned from the
4
+ # blueprints library.
5
+ module GraphRoute
6
+ import com.tinkerpop.pipes.transform.VerticesPipe
7
+ import com.tinkerpop.pipes.transform.EdgesPipe
8
+
9
+ # Returns a new route to all graph vertices. Standard filter options.
10
+ def v(*filters, &block)
11
+ filters = Pacer::Route.filters(filters)
12
+ route = chain_route :element_type => :vertex,
13
+ :pipe_class => VerticesPipe,
14
+ :route_name => 'GraphV'
15
+ Pacer::Route.property_filter(route, filters, block)
16
+ end
17
+
18
+ # Returns a new route to all graph edges. Standard filter options.
19
+ def e(*filters, &block)
20
+ filters = Pacer::Route.edge_filters(filters)
21
+ route = chain_route :element_type => :edge,
22
+ :pipe_class => EdgesPipe,
23
+ :route_name => 'GraphE'
24
+ Pacer::Route.property_filter(route, filters, block)
25
+ end
26
+
27
+ def filter(*args)
28
+ raise 'Not implemented'
29
+ end
30
+
31
+ # Specialization of result simply returns self.
32
+ def result
33
+ self
34
+ end
35
+
36
+ # The graph itself is as root as you can get.
37
+ def root?
38
+ true
39
+ end
40
+
41
+ def graph
42
+ # This must be defined here to overwrite the #graph method in Route.
43
+ self
44
+ end
45
+
46
+ def ==(other)
47
+ equal?(other)
48
+ end
49
+
50
+ # Don't try to inspect the graph data when inspecting.
51
+ def hide_elements
52
+ true
53
+ end
54
+ end
55
+ end