pacer 0.9.1.1-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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