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,22 @@
1
+ class NativeException
2
+ def unravel
3
+ e = self
4
+ while e and e.respond_to? :cause
5
+ puts '--------------------'
6
+ puts e.class.to_s
7
+ puts e.message
8
+ pp e.backtrace.to_a
9
+ e = e.cause
10
+ end
11
+ puts '======================'
12
+ end
13
+
14
+ def root_cause
15
+ rc = e = self
16
+ while e and e.respond_to? :cause
17
+ rc = e
18
+ e = e.cause
19
+ end
20
+ rc
21
+ end
22
+ end
@@ -0,0 +1,16 @@
1
+ class Proc
2
+ def to_route(opts = {})
3
+ based_on = opts[:based_on]
4
+ if opts[:unwrap] or based_on and based_on.extensions and based_on.graph
5
+ source = proc { self.call.map { |e| e.element } }
6
+ else
7
+ source = self
8
+ end
9
+ if based_on
10
+ Pacer::Route.new(:source => source, :element_type => :mixed, :graph => based_on.graph, :extensions => based_on.extensions, :info => based_on.info)
11
+ else
12
+ graph = opts[:graph] if opts[:graph]
13
+ Pacer::Route.new(:source => source, :element_type => (opts[:element_type] || :object), :graph => graph, :extensions => opts[:extensions], :info => opts[:info])
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ module Pacer
2
+ module Support
3
+ end
4
+ end
5
+ require 'pacer/support/iterator_mixins'
6
+ require 'pacer/support/array_list'
7
+ require 'pacer/support/enumerable'
8
+ require 'pacer/support/proc'
9
+ require 'pacer/support/hash'
10
+ require 'pacer/support/native_exception'
@@ -0,0 +1,50 @@
1
+ module Pacer
2
+ module Core::SideEffect
3
+ def cap
4
+ back.chain_route :transform => :cap, :with => self, :element_type => :object
5
+ end
6
+ end
7
+
8
+ module Transform
9
+ module Cap
10
+ import com.tinkerpop.pipes.transform.SideEffectCapPipe
11
+
12
+ def with=(route)
13
+ @side_effect = route
14
+ end
15
+
16
+ protected
17
+
18
+ def pipe_source
19
+ s, e = super
20
+ if not s and not e
21
+ s = e = Pacer::Pipes::IdentityPipe.new
22
+ end
23
+ [s, e]
24
+ end
25
+
26
+ def side_effect_pipe(end_pipe)
27
+ old_back = @side_effect.back
28
+ begin
29
+ empty = Pacer::Route.new :filter => :empty, :back => self
30
+ @side_effect.back = empty
31
+ _, side_effect_pipe = @side_effect.send :build_pipeline
32
+ side_effect_pipe.setStarts end_pipe if end_pipe
33
+ side_effect_pipe
34
+ ensure
35
+ @side_effect.back = old_back
36
+ end
37
+ end
38
+
39
+ def attach_pipe(end_pipe)
40
+ pipe = SideEffectCapPipe.new side_effect_pipe(end_pipe)
41
+ pipe.setStarts end_pipe if end_pipe
42
+ pipe
43
+ end
44
+
45
+ def inspect_string
46
+ "#{ inspect_class_name }(#{ @side_effect.send(:inspect_string) })"
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,9 @@
1
+ module Pacer
2
+ module Core
3
+ module Route
4
+ def gather
5
+ aggregate.cap
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,41 @@
1
+ module Pacer
2
+ module Routes
3
+ module RouteOperations
4
+ def has_count_route(opts = {})
5
+ chain_route({ :transform => :has_count_cap }.merge(opts))
6
+ end
7
+
8
+ def has_count?(opts = {})
9
+ has_count_route(opts).first
10
+ end
11
+ end
12
+ end
13
+
14
+ module Transform
15
+ module HasCountCap
16
+ import com.tinkerpop.pipes.transform.HasCountPipe
17
+
18
+ attr_accessor :min, :max
19
+
20
+ protected
21
+
22
+ def attach_pipe(end_pipe)
23
+ pipe = HasCountPipe.new(min || -1, max || -1)
24
+ pipe.setStarts end_pipe if end_pipe
25
+ pipe
26
+ end
27
+
28
+ def inspect_string
29
+ if min and max
30
+ "HasCount(#{ min }..#{max})"
31
+ elsif min
32
+ "HasCount(>= #{ min })"
33
+ elsif max
34
+ "HasCount(<= #{ max })"
35
+ else
36
+ "HasCount(...any...)"
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,181 @@
1
+ module Pacer
2
+ module Routes
3
+ module RouteOperations
4
+ def join(name = nil, options = {}, &block)
5
+ args = {
6
+ :transform => :join,
7
+ element_type: :vertex,
8
+ graph: options.fetch(:multi_graph, Pacer::MultiGraph.new),
9
+ from_graph: graph
10
+ }
11
+ args[:multi_graph] = options[:multi_graph] if options[:multi_graph]
12
+ route = chain_route(args)
13
+ route = route.key { |v| v } unless name == :key
14
+ if block and name == :key
15
+ route.key &block
16
+ elsif block
17
+ route.join(name || :values, &block)
18
+ else
19
+ route
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+
26
+ module Transform
27
+ module Join
28
+ class CombinePipe < Pacer::Pipes::RubyPipe
29
+ import com.tinkerpop.pipes.sideeffect.SideEffectPipe
30
+ import java.util.ArrayList
31
+ import java.util.LinkedList
32
+
33
+ include SideEffectPipe rescue nil # may raise exception on reload.
34
+
35
+ attr_accessor :multi_graph, :current_keys, :current_values, :join_on
36
+ attr_reader :key_expando, :key_end, :values_pipes, :from_graph
37
+
38
+ def initialize(from_graph, multi_graph)
39
+ super()
40
+ @from_graph = from_graph
41
+ @multi_graph = multi_graph || Pacer::MultiGraph.new
42
+ @values_pipes = []
43
+ @current_keys = []
44
+ @current_values = []
45
+ end
46
+
47
+ def setKeyPipe(from_pipe, to_pipe)
48
+ @key_expando, @key_end = prepare_aggregate_pipe(from_pipe, to_pipe)
49
+ end
50
+
51
+ def addValuesPipe(name, from_pipe, to_pipe)
52
+ values_pipes << [name, *prepare_aggregate_pipe(from_pipe, to_pipe)]
53
+ end
54
+
55
+ def getSideEffect
56
+ multi_graph
57
+ end
58
+
59
+ protected
60
+
61
+ def processNextStart
62
+ while true
63
+ if current_keys.empty?
64
+ element = starts.next
65
+ element.graph = from_graph if element.respond_to? :graph
66
+ self.current_keys = get_keys(element)
67
+ self.current_values = get_values(element) unless current_keys.empty?
68
+ else
69
+ key = current_keys.removeFirst
70
+ if key
71
+ combined = multi_graph.send(:getVertex, key) || multi_graph.send(:addVertex, key)
72
+ else
73
+ combined = multi_graph.send(:addVertex, nil)
74
+ end
75
+ combined.join_on join_on if join_on
76
+ combined[:key] = key
77
+ current_values.each do |key, values|
78
+ combined.append_property_array key, values
79
+ end
80
+ return combined
81
+ end
82
+ end
83
+ rescue NativeException => e
84
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass
85
+ raise e.cause
86
+ else
87
+ raise e
88
+ end
89
+ end
90
+
91
+ def get_keys(element)
92
+ array = LinkedList.new
93
+ if key_expando
94
+ array.addAll next_results(key_expando, key_end, element)
95
+ else
96
+ array.add nil
97
+ end
98
+ array
99
+ end
100
+
101
+ def get_values(element)
102
+ values_pipes.map do |name, expando, to_pipe|
103
+ [name, next_results(expando, to_pipe, element)]
104
+ end
105
+ end
106
+
107
+ # doesn't need to be spun out because it's a capped aggregator
108
+ def next_results(expando, pipe, element)
109
+ pipe.reset
110
+ expando.add element, ArrayList.new, nil
111
+ array = pipe.next
112
+ array.each { |element| element.graph = from_graph if element.respond_to? :graph }
113
+ array
114
+ end
115
+
116
+ def prepare_aggregate_pipe(from_pipe, to_pipe)
117
+ expando = Pacer::Pipes::ExpandablePipe.new
118
+ expando.setStarts ArrayList.new.iterator
119
+ from_pipe.setStarts(expando)
120
+ agg_pipe = com.tinkerpop.pipes.sideeffect.AggregatePipe.new LinkedList.new
121
+ cap_pipe = com.tinkerpop.pipes.transform.SideEffectCapPipe.new agg_pipe
122
+ agg_pipe.setStarts to_pipe
123
+ cap_pipe.setStarts to_pipe
124
+ [expando, cap_pipe]
125
+ end
126
+ end
127
+
128
+ include Pacer::Core::SideEffect
129
+
130
+ attr_accessor :existing_multi_graph, :key_route, :values_routes, :from_graph
131
+ attr_writer :join_on
132
+
133
+ def key(&block)
134
+ self.key_route = Pacer::Route.block_branch(self, block)
135
+ self
136
+ end
137
+
138
+ def join(name = nil, &block)
139
+ self.key_route = nil if name == :key
140
+ if block
141
+ values_routes << [(name || :values), Pacer::Route.block_branch(self, block)]
142
+ else
143
+ values_routes << [(name || :values), Pacer::Route.block_branch(self, proc { |v| v })]
144
+ end
145
+ self
146
+ end
147
+
148
+ def join_on(*keys)
149
+ @join_on = keys
150
+ self
151
+ end
152
+
153
+ def multigraph
154
+ cap.first
155
+ end
156
+
157
+ protected
158
+
159
+ def after_initialize
160
+ @values_routes = []
161
+ end
162
+
163
+ def attach_pipe(end_pipe)
164
+ pipe = CombinePipe.new(from_graph, existing_multi_graph)
165
+ self.graph = pipe.multi_graph
166
+ pipe.setKeyPipe *key_route.send(:build_pipeline) if key_route
167
+ pipe.join_on = @join_on
168
+ values_routes.each do |name, route|
169
+ pipe.addValuesPipe name, *route.send(:build_pipeline)
170
+ end
171
+ pipe.setStarts end_pipe if end_pipe
172
+ pipe
173
+ end
174
+
175
+ def inspect_string
176
+ "#{ inspect_class_name }(#{ key_route.inspect }: #{ Hash[values_routes].inspect })"
177
+ end
178
+ end
179
+ end
180
+ end
181
+
@@ -0,0 +1,23 @@
1
+ module Pacer
2
+ module Routes
3
+ module RouteOperations
4
+ def map(opts = {}, &block)
5
+ chain_route({:transform => :map, :block => block, :element_type => :object}.merge(opts))
6
+ end
7
+ end
8
+ end
9
+
10
+ module Transform
11
+ module Map
12
+ attr_accessor :block
13
+
14
+ protected
15
+
16
+ def attach_pipe(end_pipe)
17
+ pipe = Pacer::Pipes::MapPipe.new(back, block)
18
+ pipe.setStarts end_pipe if end_pipe
19
+ pipe
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,50 @@
1
+ module Pacer
2
+ module Core
3
+ module Route
4
+ def paths
5
+ chain_route :transform => :path, :element_type => :object
6
+ end
7
+ end
8
+ end
9
+
10
+ module Transform
11
+ module Path
12
+ import com.tinkerpop.pipes.transform.PathPipe
13
+
14
+ def transpose
15
+ collect { |arraylist| arraylist.to_a }.transpose
16
+ end
17
+
18
+ def subgraph(target_graph = nil)
19
+ raise "Can't create a subgraph within itself." if target_graph == graph
20
+ target_graph ||= Pacer.tg
21
+ target_graph.vertex_name ||= graph.vertex_name
22
+ bulk_job(nil, target_graph) do |path|
23
+ path_route = path.to_route(:graph => graph, :element_type => :mixed)
24
+ path_route.v.each do |vertex|
25
+ vertex.clone_into target_graph
26
+ end
27
+ path_route.e.each do |edge|
28
+ edge.clone_into target_graph
29
+ end
30
+ end
31
+ target_graph
32
+ end
33
+
34
+ protected
35
+
36
+ def attach_pipe(end_pipe)
37
+ pipe = PathPipe.new
38
+ pipe.setStarts end_pipe if end_pipe
39
+ pipe
40
+ end
41
+
42
+ def configure_iterator(iter)
43
+ if respond_to? :graph
44
+ iter.extend Pacer::Core::Route::IteratorPathMixin
45
+ iter.graph = graph
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,23 @@
1
+ module Pacer
2
+ module Routes
3
+ module RouteOperations
4
+ def process(opts = {}, &block)
5
+ chain_route({:transform => :process, :block => block}.merge(opts))
6
+ end
7
+ end
8
+ end
9
+
10
+ module Transform
11
+ module Process
12
+ attr_accessor :block
13
+
14
+ protected
15
+
16
+ def attach_pipe(end_pipe)
17
+ pipe = Pacer::Pipes::ProcessPipe.new(back, block)
18
+ pipe.setStarts end_pipe if end_pipe
19
+ pipe
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ module Pacer
2
+ module Core
3
+ module Route
4
+ def scatter(args = {})
5
+ chain_route({transform: :scatter, element_type: :object}.merge(args))
6
+ end
7
+ end
8
+ end
9
+
10
+ module Transform
11
+ module Scatter
12
+ import com.tinkerpop.pipes.transform.ScatterPipe
13
+
14
+ protected
15
+
16
+ def attach_pipe(end_pipe)
17
+ pipe = ScatterPipe.new
18
+ pipe.setStarts end_pipe if end_pipe
19
+ pipe
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,103 @@
1
+ module Pacer
2
+ module Routes
3
+ module RouteOperations
4
+ def sort_section(section = nil, &block)
5
+ chain_route transform: :sort_section, block: block, section: section
6
+ end
7
+ end
8
+ end
9
+
10
+ module Transform
11
+ module SortSection
12
+ class SortSectionPipe < Pacer::Pipes::RubyPipe
13
+ attr_reader :block_1, :block_2, :to_sort, :to_emit, :section
14
+
15
+ def initialize(section, block)
16
+ super()
17
+ @to_emit = []
18
+ @section = section
19
+ @to_sort = []
20
+ if section
21
+ section.visitor = self
22
+ else
23
+ on_element nil
24
+ end
25
+ if block
26
+ if block.arity == 1
27
+ @block_1 = block
28
+ section.use_on_element = false
29
+ elsif block.arity == 2 or block.arity < 0
30
+ @block_2 = block
31
+ end
32
+ else
33
+ section.use_on_element = false
34
+ end
35
+ end
36
+
37
+ def processNextStart
38
+ while to_emit.empty?
39
+ element = @starts.next
40
+ to_sort << element
41
+ end
42
+ to_emit.shift
43
+ rescue NativeException => e
44
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass
45
+ if to_emit.empty?
46
+ raise e.cause
47
+ else
48
+ after_element
49
+ retry
50
+ end
51
+ else
52
+ raise e
53
+ end
54
+ end
55
+
56
+ def on_element(element)
57
+ @section_element = element
58
+ end
59
+
60
+ def after_element
61
+ if to_sort.any?
62
+ if block_1
63
+ sorted = to_sort.sort_by do |element|
64
+ block_1.call element
65
+ end
66
+ elsif block_2
67
+ sorted = to_sort.sort_by do |element|
68
+ block_2.call element, @section_element
69
+ end
70
+ else
71
+ sorted = to_sort.sort
72
+ end
73
+ to_emit.concat sorted
74
+ @to_sort = []
75
+ end
76
+ end
77
+ end
78
+
79
+ attr_accessor :block
80
+ attr_reader :section_name, :section_route
81
+
82
+ def section=(section)
83
+ if section.is_a? Symbol
84
+ @section_name = section
85
+ @section_route = @back.get_section_route(section)
86
+ elsif section.is_a? Pacer::Route and section.respond_to? :section_name
87
+ @section_name = section.section_name
88
+ @section_route = section
89
+ else
90
+ raise ArgumentError, "Unknown section #{ section }. Provide either a name or a route created with the #section methed."
91
+ end
92
+ end
93
+
94
+ protected
95
+
96
+ def attach_pipe(end_pipe)
97
+ pipe = SortSectionPipe.new(@section_route.send(:section_visitor), block)
98
+ pipe.setStarts end_pipe if end_pipe
99
+ pipe
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,21 @@
1
+ module Pacer
2
+ module Routes::RouteOperations
3
+ def stream_sort(buffer = 1000, silo = 100)
4
+ chain_route :transform => :stream_sort, :buffer => buffer, :silo => silo
5
+ end
6
+ end
7
+
8
+ module Transform
9
+ module StreamSort
10
+ attr_accessor :buffer, :silo
11
+
12
+ protected
13
+
14
+ def attach_pipe(end_pipe)
15
+ pipe = Pacer::Pipes::StreamSortPipe.new buffer, silo
16
+ pipe.setStarts end_pipe if end_pipe
17
+ pipe
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module Pacer
2
+ module Routes::RouteOperations
3
+ def stream_uniq(buffer = 1000)
4
+ chain_route :transform => :stream_uniq, :buffer => buffer
5
+ end
6
+ end
7
+
8
+ module Transform
9
+ module StreamUniq
10
+ attr_accessor :buffer
11
+
12
+ protected
13
+
14
+ def attach_pipe(end_pipe)
15
+ pipe = Pacer::Pipes::StreamUniqPipe.new buffer
16
+ pipe.setStarts end_pipe if end_pipe
17
+ pipe
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ module Pacer
2
+ module Transform
3
+ end
4
+ end
5
+
6
+ require 'pacer/transform/cap'
7
+ require 'pacer/transform/stream_sort'
8
+ require 'pacer/transform/stream_uniq'
9
+ require 'pacer/transform/gather'
10
+ require 'pacer/transform/map'
11
+ require 'pacer/transform/process'
12
+ require 'pacer/transform/join'
13
+ require 'pacer/transform/path'
14
+ require 'pacer/transform/scatter'
15
+ require 'pacer/transform/has_count_cap'
16
+ require 'pacer/transform/sort_section'