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,14 @@
1
+ module Pacer
2
+ import com.tinkerpop.blueprints.pgm.Graph
3
+ import com.tinkerpop.blueprints.pgm.Element
4
+ import com.tinkerpop.blueprints.pgm.Vertex
5
+ import com.tinkerpop.blueprints.pgm.Edge
6
+ end
7
+
8
+ require 'pacer/graph/graph_mixin'
9
+ require 'pacer/graph/element_mixin'
10
+ require 'pacer/graph/vertex_mixin'
11
+ require 'pacer/graph/edge_mixin'
12
+ require 'pacer/graph/index_mixin'
13
+ require 'pacer/graph/graph_indices_mixin'
14
+ require 'pacer/graph/graph_transactions_mixin'
@@ -0,0 +1,48 @@
1
+ module Pacer::Pipes
2
+ # Same concept as the regular pipeline, but this one
3
+ # does not touch the intermediate pipes. They must be
4
+ # wired together before being passed in to this object.
5
+ # This allows me to build a pipeline in Pacer and then
6
+ # pass it on to a pipe like FutureFilterPipe that only
7
+ # knows how to act on a single pipe.
8
+ class BlackboxPipeline
9
+ include com.tinkerpop.pipes.Pipe
10
+
11
+ def initialize(start_pipe, end_pipe)
12
+ @start_pipe = start_pipe
13
+ @end_pipe = end_pipe
14
+ end
15
+
16
+ def setStarts(pipe)
17
+ if pipe.respond_to? :iterator
18
+ @start_pipe.setStarts pipe.iterator
19
+ else
20
+ @start_pipe.setStarts pipe
21
+ end
22
+ end
23
+
24
+ def next
25
+ @end_pipe.next
26
+ end
27
+
28
+ def hasNext
29
+ @end_pipe.hasNext
30
+ end
31
+
32
+ def reset
33
+ @end_pipe.reset
34
+ end
35
+
36
+ def getPath
37
+ @end_pipe.getPath
38
+ end
39
+
40
+ def iterator
41
+ @end_pipe.iterator
42
+ end
43
+
44
+ def to_s
45
+ "[#{ @start_pipe }...#{ @end_pipe }]"
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,38 @@
1
+ module Pacer::Pipes
2
+ class BlockFilterPipe < AbstractPipe
3
+ field_reader :starts
4
+
5
+ def initialize(back, block, invert = false)
6
+ super()
7
+ @back = back
8
+ @block = block
9
+ @graph = back.graph
10
+ @invert = invert
11
+
12
+ @exts = @back.extensions + [Pacer::Extensions::BlockFilterElement]
13
+ @is_element = @graph.element_type?(back.element_type) if @graph
14
+ end
15
+
16
+ def processNextStart()
17
+ while raw_element = starts.next
18
+ if @is_element
19
+ extended_element = raw_element.add_extensions(@exts)
20
+ extended_element.back = @back
21
+ extended_element.graph = @back.graph
22
+ ok = @block.call extended_element
23
+ else
24
+ ok = @block.call raw_element
25
+ end
26
+ ok = !ok if @invert
27
+ return raw_element if ok
28
+ end
29
+ raise Pacer::NoSuchElementException
30
+ rescue NativeException => e
31
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass
32
+ raise e.cause
33
+ else
34
+ raise e
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,10 @@
1
+ module Pacer
2
+ module Pipes
3
+ module Renamed
4
+ AbstractCollectionFilterPipe = com.tinkerpop.pipes.filter.CollectionFilterPipe
5
+ end
6
+
7
+ class CollectionFilterPipe < Renamed::AbstractCollectionFilterPipe
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,48 @@
1
+ module Pacer::Pipes
2
+ class CrossProductTransformPipe < UnaryTransformPipe
3
+ attr_reader :branch_b
4
+
5
+ def initialize(method, branch_a, branch_b)
6
+ super(method, branch_a)
7
+ if branch_b.is_a? Pipe
8
+ @branch_b = branch_b
9
+ @b = nil
10
+ else
11
+ @b = branch_b
12
+ end
13
+ end
14
+
15
+ def processNextStart
16
+ next_pair
17
+ a.send method, b rescue nil if a.respond_to? method
18
+ rescue NativeException => e
19
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass
20
+ raise e.cause
21
+ else
22
+ raise e
23
+ end
24
+ end
25
+
26
+ protected
27
+
28
+ attr_accessor :b
29
+
30
+ def next_pair
31
+ if branch_b
32
+ begin
33
+ self.b = branch_b.next
34
+ rescue NativeException => e
35
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass or @first
36
+ next_a
37
+ branch_b.setStarts SingleIterator.new(element)
38
+ retry
39
+ else
40
+ raise e
41
+ end
42
+ end
43
+ else
44
+ next_a
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,30 @@
1
+ module Pacer::Pipes
2
+ class EnumerablePipe < RubyPipe
3
+ def initialize(enumerable)
4
+ super()
5
+ case enumerable
6
+ when Enumerator
7
+ starts = enumerable
8
+ when Pacer::ElementMixin
9
+ starts = [enumerable].to_enum
10
+ when Enumerable
11
+ starts = enumerable.to_enum
12
+ else
13
+ starts = [enumerable].to_enum
14
+ end
15
+ set_starts starts
16
+ end
17
+
18
+ def processNextStart()
19
+ @starts.next
20
+ rescue StopIteration
21
+ raise Pacer::NoSuchElementException
22
+ rescue NativeException => e
23
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass
24
+ raise e.cause
25
+ else
26
+ raise e
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,63 @@
1
+ module Pacer::Pipes
2
+ class ExpandablePipe < RubyPipe
3
+ def initialize
4
+ super()
5
+ @queue = java.util.LinkedList.new
6
+ end
7
+
8
+ def add(element, metadata = nil, path = nil)
9
+ @queue.add [element, metadata, path]
10
+ end
11
+
12
+ def metadata
13
+ @metadata
14
+ end
15
+
16
+ def next
17
+ super
18
+ rescue NativeException => e
19
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass
20
+ raise e.cause
21
+ else
22
+ raise e
23
+ end
24
+ ensure
25
+ @path = @next_path
26
+ @metadata = @next_metadata
27
+ end
28
+
29
+ protected
30
+
31
+ def processNextStart
32
+ if @queue.isEmpty
33
+ @next_metadata = nil
34
+ r = @starts.next
35
+ if @starts.respond_to? :getPath
36
+ @next_path = @starts.getPath
37
+ else
38
+ @next_path = java.util.ArrayList.new
39
+ end
40
+ r
41
+ else
42
+ element, @next_metadata, @next_path = @queue.remove
43
+ element
44
+ end
45
+ rescue NativeException => e
46
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass
47
+ raise e.cause
48
+ else
49
+ raise e
50
+ end
51
+ end
52
+
53
+ def getPathToHere
54
+ path = java.util.ArrayList.new
55
+ if @path
56
+ @path.each do |e|
57
+ path.add e
58
+ end
59
+ end
60
+ path
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,33 @@
1
+ module Pacer::Pipes
2
+ class IdCollectionFilterPipe < RubyPipe
3
+ def initialize(ids, comparison)
4
+ super()
5
+ @ids = Set[*ids]
6
+ @comparison = comparison
7
+ end
8
+
9
+ def processNextStart
10
+ if @comparison == Pacer::Pipes::EQUAL
11
+ while true
12
+ element = @starts.next
13
+ if element and @ids.include? element.element_id
14
+ return element
15
+ end
16
+ end
17
+ else
18
+ while true
19
+ element = @starts.next
20
+ if element and not @ids.include? element.element_id
21
+ return element
22
+ end
23
+ end
24
+ end
25
+ rescue NativeException => e
26
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass
27
+ raise e.cause
28
+ else
29
+ raise e
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,30 @@
1
+ module Pacer::Pipes
2
+ class IsEmptyPipe < RubyPipe
3
+ def initialize
4
+ super
5
+ @raise = false
6
+ end
7
+
8
+ def processNextStart
9
+ raise Pacer::NoSuchElementException if @raise
10
+ @starts.next
11
+ @raise = true
12
+ rescue NativeException => e
13
+ if e.cause.getClass == NoSuchElementException.getClass
14
+ # This is the only case where we return true.
15
+ # The only time we get here is if the first call to next
16
+ # has no results.
17
+ true
18
+ else
19
+ raise e
20
+ end
21
+ else
22
+ raise Pacer::NoSuchElementException
23
+ end
24
+
25
+ def reset
26
+ @raise = false
27
+ super()
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,61 @@
1
+ module Pacer::Pipes
2
+ class IsUniquePipe < RubyPipe
3
+ import java.util.ArrayList
4
+ import com.tinkerpop.pipes.sideeffect.SideEffectPipe
5
+ import com.tinkerpop.pipes.util.ExpandableIterator
6
+ import com.tinkerpop.pipes.filter.DuplicateFilterPipe
7
+
8
+ include SideEffectPipe
9
+
10
+ def initialize
11
+ super()
12
+ prepare_state
13
+ end
14
+
15
+ def processNextStart
16
+ value = starts.next
17
+ check_uniqueness value if @unique
18
+ value
19
+ rescue NativeException => e
20
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass
21
+ raise e.cause
22
+ else
23
+ raise e
24
+ end
25
+ end
26
+
27
+ def reset
28
+ super()
29
+ prepare_state
30
+ end
31
+
32
+ def unique?
33
+ @unique
34
+ end
35
+
36
+ def getSideEffect
37
+ @unique
38
+ end
39
+
40
+ protected
41
+
42
+ def check_uniqueness(value)
43
+ @expando.add value
44
+ @unique_pipe.next
45
+ rescue NativeException => e
46
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass
47
+ @unique = false
48
+ else
49
+ raise e
50
+ end
51
+ end
52
+
53
+ def prepare_state
54
+ @unique = true
55
+ @expando = ExpandableIterator.new ArrayList.new.iterator
56
+ @unique_pipe = DuplicateFilterPipe.new
57
+ @unique_pipe.setStarts @expando
58
+ end
59
+
60
+ end
61
+ end
@@ -0,0 +1,21 @@
1
+ module Pacer::Pipes
2
+ class LabelCollectionFilterPipe < RubyPipe
3
+ def initialize(labels)
4
+ super()
5
+ @labels = Set[*labels.map(&:to_s)]
6
+ end
7
+
8
+ def processNextStart
9
+ while true
10
+ edge = @starts.next
11
+ return edge if edge and @labels.include? edge.label
12
+ end
13
+ rescue NativeException => e
14
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass
15
+ raise e.cause
16
+ else
17
+ raise e
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module Pacer::Pipes
2
+ class LabelPrefixPipe < RubyPipe
3
+ def initialize(prefix)
4
+ super()
5
+ @prefix = /^#{prefix}/
6
+ end
7
+
8
+ def processNextStart
9
+ while true
10
+ edge = @starts.next
11
+ return edge if edge.label =~ @prefix
12
+ end
13
+ rescue NativeException => e
14
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass
15
+ raise e.cause
16
+ else
17
+ raise e
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,86 @@
1
+ module Pacer::Pipes
2
+ class LoopPipe < RubyPipe
3
+ import java.util.ArrayList
4
+
5
+ def initialize(graph, looping_pipe, control_block)
6
+ super()
7
+ @control_block = control_block
8
+
9
+ @expando = ExpandablePipe.new
10
+ empty = ArrayList.new
11
+ @expando.setStarts empty.iterator
12
+ looping_pipe.setStarts(@expando)
13
+ @looping_pipe = looping_pipe
14
+ end
15
+
16
+ def next
17
+ super
18
+ rescue NativeException => e
19
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass
20
+ raise e.cause
21
+ else
22
+ raise e
23
+ end
24
+ ensure
25
+ @path = @next_path
26
+ end
27
+
28
+ def setStarts(starts)
29
+ @starts_has_path = starts.respond_to? :getPath
30
+ super
31
+ end
32
+
33
+ protected
34
+
35
+ def processNextStart
36
+ while true
37
+ # FIXME: hasNext shouldn't be raising an exception...
38
+ has_next = @looping_pipe.hasNext rescue nil
39
+ if has_next
40
+ element = @looping_pipe.next
41
+ depth = (@expando.metadata || 0) + 1
42
+ @next_path = @looping_pipe.getPath
43
+ else
44
+ element = @starts.next
45
+ if @starts_has_path
46
+ @next_path = @starts.getPath
47
+ else
48
+ @next_path = ArrayList.new
49
+ @next_path.add element
50
+ end
51
+ depth = 0
52
+ end
53
+ element.graph ||= @graph if element.respond_to? :graph=
54
+ case @control_block.call element, depth, @next_path
55
+ when :loop
56
+ @expando.add element, depth, @next_path
57
+ when :emit
58
+ return element
59
+ when :emit_and_loop, :loop_and_emit
60
+ @expando.add element, depth, @next_path
61
+ return element
62
+ when false, nil
63
+ else
64
+ @expando.add element, depth, @next_path
65
+ return element
66
+ end
67
+ end
68
+ rescue NativeException => e
69
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass
70
+ raise e.cause
71
+ else
72
+ raise e
73
+ end
74
+ end
75
+
76
+ def getPathToHere
77
+ path = ArrayList.new
78
+ if @path
79
+ @path.each do |e|
80
+ path.add e
81
+ end
82
+ end
83
+ path
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,36 @@
1
+ module Pacer::Pipes
2
+ class MapPipe < AbstractPipe
3
+ field_reader :starts
4
+
5
+ def initialize(back, block)
6
+ super()
7
+ @block = block
8
+ @back = back
9
+ @graph = back.graph if back
10
+ @extensions = back.extensions + [Pacer::Extensions::BlockFilterElement]
11
+ @is_element = @graph.element_type?(back.element_type) if @graph
12
+ end
13
+
14
+ def processNextStart
15
+ while true
16
+ obj = starts.next
17
+ begin
18
+ if @is_element
19
+ obj = obj.add_extensions(@extensions)
20
+ obj.back = @back
21
+ obj.graph = @back.graph
22
+ end
23
+ rescue
24
+ end
25
+ result = @block.call(obj)
26
+ return result
27
+ end
28
+ rescue NativeException => e
29
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass
30
+ raise e.cause
31
+ else
32
+ raise e
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,9 @@
1
+ module Pacer::Pipes
2
+ class NeverPipe < RubyPipe
3
+ protected
4
+
5
+ def processNextStart
6
+ raise NoSuchElementException
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,37 @@
1
+ module Pacer::Pipes
2
+ class ProcessPipe < AbstractPipe
3
+ field_reader :starts
4
+ attr_reader :is_element, :extensions, :back, :block, :graph
5
+
6
+ def initialize(back, block)
7
+ super()
8
+ @block = block
9
+ @back = back
10
+ @graph = back.graph if back
11
+ @extensions = back.extensions + [Pacer::Extensions::BlockFilterElement]
12
+ @is_element = graph.element_type?(back.element_type) if graph
13
+ end
14
+
15
+ def processNextStart
16
+ while true
17
+ obj = starts.next
18
+ begin
19
+ if is_element
20
+ obj = obj.add_extensions(extensions)
21
+ obj.back = back
22
+ obj.graph = graph
23
+ end
24
+ rescue
25
+ end
26
+ result = block.call(obj)
27
+ return obj
28
+ end
29
+ rescue NativeException => e
30
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass
31
+ raise e.cause
32
+ else
33
+ raise e
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,40 @@
1
+ module Pacer::Pipes
2
+ class PropertyComparisonFilterPipe < RubyPipe
3
+ def initialize(left, right, filter)
4
+ super()
5
+ @filter = filter
6
+ @left = left.to_s
7
+ @right = right.to_s
8
+ end
9
+
10
+ protected
11
+
12
+ def processNextStart
13
+ while true
14
+ obj = @starts.next
15
+ l = obj.getProperty(@left)
16
+ r = obj.getProperty(@right)
17
+ case @filter
18
+ when FilterPipe::Filter::EQUAL
19
+ return obj if l == r
20
+ when FilterPipe::Filter::NOT_EQUAL
21
+ return obj if l != r
22
+ when FilterPipe::Filter::GREATER_THAN
23
+ return obj if l and r and l > r
24
+ when FilterPipe::Filter::LESS_THAN
25
+ return obj if l and r and l < r
26
+ when FilterPipe::Filter::GREATER_THAN_EQUAL
27
+ return obj if l and r and l >= r
28
+ when FilterPipe::Filter::LESS_THAN_EQUAL
29
+ return obj if l and r and l <= r
30
+ end
31
+ end
32
+ rescue NativeException => e
33
+ if e.cause.getClass == Pacer::NoSuchElementException.getClass
34
+ raise e.cause
35
+ else
36
+ raise e
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,25 @@
1
+ module Pacer::Pipes
2
+ class RubyPipe < AbstractPipe
3
+ attr_reader :starts
4
+
5
+ def setStarts(starts)
6
+ @starts = starts
7
+ end
8
+ alias set_starts setStarts
9
+
10
+ def reset
11
+ super
12
+ @starts.reset if starts.respond_to? :reset
13
+ end
14
+
15
+ protected
16
+
17
+ def getPathToHere
18
+ if starts.respond_to? :getPath
19
+ starts.getPath
20
+ else
21
+ java.util.ArrayList.new
22
+ end
23
+ end
24
+ end
25
+ end