pacer 0.9.1.1-java → 1.0.0-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 (152) hide show
  1. data/.autotest +4 -1
  2. data/.gitignore +4 -0
  3. data/.rspec +1 -1
  4. data/Gemfile-dev +33 -0
  5. data/Gemfile-release +4 -0
  6. data/README.md +27 -9
  7. data/Rakefile +26 -8
  8. data/bin/autotest +1 -1
  9. data/lib/pacer/blueprints/multi_graph.rb +7 -19
  10. data/lib/pacer/blueprints/ruby_graph.rb +77 -52
  11. data/lib/pacer/blueprints/tg.rb +6 -93
  12. data/lib/pacer/blueprints.rb +0 -1
  13. data/lib/pacer/core/graph/edges_route.rb +10 -12
  14. data/lib/pacer/core/graph/element_route.rb +14 -21
  15. data/lib/pacer/core/graph/graph_index_route.rb +12 -8
  16. data/lib/pacer/core/graph/graph_route.rb +2 -5
  17. data/lib/pacer/core/graph/mixed_route.rb +3 -5
  18. data/lib/pacer/core/graph/vertices_route.rb +26 -27
  19. data/lib/pacer/core/route.rb +35 -66
  20. data/lib/pacer/exceptions.rb +13 -6
  21. data/lib/pacer/extensions/block_filter_element.rb +0 -5
  22. data/lib/pacer/filter/collection_filter.rb +9 -2
  23. data/lib/pacer/filter/empty_filter.rb +12 -3
  24. data/lib/pacer/filter/future_filter.rb +5 -5
  25. data/lib/pacer/filter/loop_filter.rb +7 -13
  26. data/lib/pacer/filter/object_filter.rb +10 -16
  27. data/lib/pacer/filter/property_filter/filters.rb +134 -93
  28. data/lib/pacer/filter/property_filter.rb +22 -19
  29. data/lib/pacer/filter/where_filter/node_visitor.rb +47 -26
  30. data/lib/pacer/filter/where_filter.rb +24 -3
  31. data/lib/pacer/function_resolver.rb +7 -2
  32. data/lib/pacer/graph/graph_ml.rb +39 -0
  33. data/lib/pacer/graph/graph_transactions_mixin.rb +107 -175
  34. data/lib/pacer/graph/pacer_graph.rb +438 -0
  35. data/lib/pacer/graph/simple_encoder.rb +20 -0
  36. data/lib/pacer/graph/yaml_encoder.rb +81 -0
  37. data/lib/pacer/graph.rb +8 -10
  38. data/lib/pacer/pipe/blackbox_pipeline.rb +11 -4
  39. data/lib/pacer/pipe/block_filter_pipe.rb +5 -22
  40. data/lib/pacer/pipe/cross_product_transform_pipe.rb +5 -7
  41. data/lib/pacer/pipe/edges_pipe.rb +22 -0
  42. data/lib/pacer/pipe/enumerable_pipe.rb +3 -9
  43. data/lib/pacer/pipe/expandable_pipe.rb +2 -14
  44. data/lib/pacer/pipe/id_collection_filter_pipe.rb +2 -8
  45. data/lib/pacer/pipe/is_empty_pipe.rb +5 -12
  46. data/lib/pacer/pipe/is_unique_pipe.rb +3 -13
  47. data/lib/pacer/pipe/label_collection_filter_pipe.rb +1 -7
  48. data/lib/pacer/pipe/label_prefix_pipe.rb +0 -6
  49. data/lib/pacer/pipe/loop_pipe.rb +27 -25
  50. data/lib/pacer/pipe/never_pipe.rb +1 -1
  51. data/lib/pacer/pipe/path_wrapping_pipe.rb +40 -0
  52. data/lib/pacer/pipe/process_pipe.rb +2 -20
  53. data/lib/pacer/pipe/property_comparison_pipe.rb +0 -6
  54. data/lib/pacer/pipe/ruby_pipe.rb +10 -3
  55. data/lib/pacer/pipe/simple_visitor_pipe.rb +12 -11
  56. data/lib/pacer/pipe/stream_sort_pipe.rb +1 -7
  57. data/lib/pacer/pipe/stream_uniq_pipe.rb +0 -6
  58. data/lib/pacer/pipe/type_filter_pipe.rb +1 -7
  59. data/lib/pacer/pipe/unary_transform_pipe.rb +6 -8
  60. data/lib/pacer/pipe/unwrapping_pipe.rb +13 -0
  61. data/lib/pacer/pipe/vertices_pipe.rb +22 -0
  62. data/lib/pacer/pipe/visitor_pipe.rb +3 -7
  63. data/lib/pacer/pipe/wrapping_pipe.rb +37 -0
  64. data/lib/pacer/pipes.rb +17 -12
  65. data/lib/pacer/route/mixin/bulk_operations.rb +8 -9
  66. data/lib/pacer/route/mixin/route_operations.rb +17 -11
  67. data/lib/pacer/route/mixins.rb +0 -1
  68. data/lib/pacer/route.rb +198 -121
  69. data/lib/pacer/side_effect/aggregate.rb +22 -2
  70. data/lib/pacer/side_effect/as.rb +73 -0
  71. data/lib/pacer/side_effect/group_count.rb +0 -3
  72. data/lib/pacer/side_effect/is_unique.rb +7 -6
  73. data/lib/pacer/side_effect.rb +1 -1
  74. data/lib/pacer/support/enumerable.rb +14 -12
  75. data/lib/pacer/support/nil_class.rb +5 -0
  76. data/lib/pacer/support/proc.rb +2 -2
  77. data/lib/pacer/support.rb +1 -1
  78. data/lib/pacer/transform/cap.rb +1 -1
  79. data/lib/pacer/transform/has_count_cap.rb +1 -1
  80. data/lib/pacer/transform/join.rb +20 -16
  81. data/lib/pacer/transform/map.rb +6 -2
  82. data/lib/pacer/transform/path.rb +44 -20
  83. data/lib/pacer/transform/sort_section.rb +58 -51
  84. data/lib/pacer/utils/tsort.rb +7 -2
  85. data/lib/pacer/utils.rb +0 -1
  86. data/lib/pacer/version.rb +4 -3
  87. data/lib/pacer/visitors/section.rb +42 -0
  88. data/lib/pacer/visitors/visits_section.rb +32 -0
  89. data/lib/pacer/visitors.rb +7 -0
  90. data/lib/pacer/wrappers/edge_wrapper.rb +164 -11
  91. data/lib/pacer/wrappers/element_wrapper.rb +133 -8
  92. data/lib/pacer/wrappers/index_wrapper.rb +47 -0
  93. data/lib/pacer/wrappers/vertex_wrapper.rb +175 -12
  94. data/lib/pacer/wrappers/wrapper_selector.rb +40 -0
  95. data/lib/pacer/wrappers/wrapping_pipe_function.rb +90 -0
  96. data/lib/pacer/wrappers.rb +3 -1
  97. data/lib/pacer-1.0.0-standalone.jar +0 -0
  98. data/lib/pacer.rb +13 -47
  99. data/pacer.gemspec +0 -8
  100. data/pom.xml +10 -3
  101. data/spec/pacer/blueprints/dex_spec.rb +12 -26
  102. data/spec/pacer/blueprints/neo4j_spec.rb +14 -28
  103. data/spec/pacer/blueprints/tg_spec.rb +6 -54
  104. data/spec/pacer/core/graph/edges_route_spec.rb +1 -1
  105. data/spec/pacer/core/graph/element_route_spec.rb +2 -2
  106. data/spec/pacer/core/graph/graph_route_spec.rb +2 -2
  107. data/spec/pacer/core/graph/vertices_route_spec.rb +10 -3
  108. data/spec/pacer/core/route_spec.rb +35 -58
  109. data/spec/pacer/filter/empty_filter_spec.rb +5 -6
  110. data/spec/pacer/filter/future_filter_spec.rb +8 -8
  111. data/spec/pacer/filter/loop_filter_spec.rb +120 -6
  112. data/spec/pacer/filter/object_filter_spec.rb +15 -0
  113. data/spec/pacer/filter/property_filter/filters_spec.rb +169 -0
  114. data/spec/pacer/filter/property_filter_spec.rb +15 -12
  115. data/spec/pacer/filter/uniq_filter_spec.rb +1 -1
  116. data/spec/pacer/filter/where_filter_spec.rb +55 -7
  117. data/spec/pacer/graph/{graph_mixin_spec.rb → pacer_graph_spec.rb} +114 -185
  118. data/spec/pacer/route/mixin/base_spec.rb +36 -35
  119. data/spec/pacer/route/mixin/route_operations_spec.rb +4 -46
  120. data/spec/pacer/side_effect/as_spec.rb +34 -0
  121. data/spec/pacer/support/enumerable_spec.rb +6 -6
  122. data/spec/pacer/transform/join_spec.rb +7 -5
  123. data/spec/pacer/transform/map_spec.rb +55 -0
  124. data/spec/pacer/transform/path_spec.rb +30 -15
  125. data/spec/pacer/transform/process_spec.rb +42 -0
  126. data/spec/pacer/transform/sort_section_spec.rb +82 -0
  127. data/spec/pacer/wrapper/edge_wrapper_spec.rb +122 -2
  128. data/spec/pacer/wrapper/element_wrapper_spec.rb +289 -3
  129. data/spec/pacer/wrapper/vertex_wrapper_spec.rb +289 -2
  130. data/spec/spec_helper.rb +16 -7
  131. data/spec/support/graph_runner.rb +80 -29
  132. data/tags +1165 -0
  133. metadata +46 -107
  134. data/.rvmrc +0 -0
  135. data/lib/pacer/blueprints/extensions.rb +0 -77
  136. data/lib/pacer/graph/edge_mixin.rb +0 -127
  137. data/lib/pacer/graph/element_mixin.rb +0 -202
  138. data/lib/pacer/graph/graph_indices_mixin.rb +0 -93
  139. data/lib/pacer/graph/graph_mixin.rb +0 -361
  140. data/lib/pacer/graph/index_mixin.rb +0 -30
  141. data/lib/pacer/graph/vertex_mixin.rb +0 -119
  142. data/lib/pacer/pipe/map_pipe.rb +0 -36
  143. data/lib/pacer/pipe/variable_store_iterator_wrapper.rb +0 -26
  144. data/lib/pacer/route/mixin/variable_route_module.rb +0 -26
  145. data/lib/pacer/side_effect/section.rb +0 -25
  146. data/lib/pacer/support/iterator_mixins.rb +0 -110
  147. data/lib/pacer/wrappers/new_element.rb +0 -106
  148. data/lib/pacer-0.9.1.1-standalone.jar +0 -0
  149. data/spec/pacer/graph/edge_mixin_spec.rb +0 -116
  150. data/spec/pacer/graph/element_mixin_spec.rb +0 -297
  151. data/spec/pacer/graph/index_mixin_spec.rb +0 -0
  152. data/spec/pacer/graph/vertex_mixin_spec.rb +0 -192
@@ -3,11 +3,14 @@ module Pacer::Core::Graph
3
3
  # Basic methods for routes shared between all route types that emit
4
4
  # routes: {VerticesRoute}, {EdgesRoute} and {MixedRoute}
5
5
  module ElementRoute
6
+ def graph
7
+ config[:graph]
8
+ end
6
9
 
7
10
  # Attach a filter to the current route.
8
11
  #
9
12
  # @param [Array<Hash, extension>, Hash, extension] filter see {Pacer::Route#property_filter}
10
- # @yield [ElementMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
13
+ # @yield [ElementWrapper(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
11
14
  # @return [ElementRoute] the same type and extensions as the source route.
12
15
  def filter(*filters, &block)
13
16
  Pacer::Route.property_filter(self, filters, block)
@@ -37,8 +40,8 @@ module Pacer::Core::Graph
37
40
  # Create a new TinkerGraph based on the paths of all matching elements.
38
41
  #
39
42
  # @return [TinkerGraph] the subgraph
40
- def subgraph
41
- paths.subgraph
43
+ def subgraph opts = {}
44
+ paths.subgraph nil, opts
42
45
  end
43
46
 
44
47
  # Delete all matching elements.
@@ -118,14 +121,14 @@ module Pacer::Core::Graph
118
121
 
119
122
  def build_index(index, index_key = nil, property = nil, create = true)
120
123
  index_name = index
121
- unless index.is_a? com.tinkerpop.blueprints.pgm.Index
122
- index = graph.index_name index.to_s
124
+ unless index.is_a? com.tinkerpop.blueprints.Index
125
+ index = graph.index index.to_s
123
126
  end
124
127
  sample_element = first
125
128
  unless index
126
129
  if sample_element
127
130
  if create
128
- index = graph.createManualIndex index_name, graph.element_type(sample_element)
131
+ index = graph.index index_name, graph.element_type(sample_element), create: true
129
132
  else
130
133
  raise "No index found for #{ index } on #{ graph }" unless index
131
134
  end
@@ -133,7 +136,7 @@ module Pacer::Core::Graph
133
136
  return nil
134
137
  end
135
138
  end
136
- index_key ||= index.index_name
139
+ index_key ||= index.name
137
140
  property ||= index_key
138
141
  if block_given?
139
142
  bulk_job do |element|
@@ -151,21 +154,11 @@ module Pacer::Core::Graph
151
154
 
152
155
  protected
153
156
 
154
- # Determines which iterator mixin is applied to the iterator when #each is called
155
157
  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
158
+ pipe = Pacer::Pipes::WrappingPipe.new graph, element_type, extensions
159
+ pipe.wrapper = wrapper if wrapper
160
+ pipe.setStarts iter
161
+ pipe
169
162
  end
170
163
  end
171
164
  end
@@ -4,9 +4,11 @@ module Pacer::Core::Graph
4
4
  # blueprints library.
5
5
  module GraphIndexRoute
6
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)
7
+ def v(*args, &block)
8
+ filters = Pacer::Route.filters(args)
9
+ if features.supportsIndices
10
+ route = indexed_route(:vertex, filters, block)
11
+ end
10
12
  if route
11
13
  route
12
14
  else
@@ -15,9 +17,11 @@ module Pacer::Core::Graph
15
17
  end
16
18
 
17
19
  # 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)
20
+ def e(*args, &block)
21
+ filters = Pacer::Route.edge_filters(args)
22
+ if features.supportsIndices
23
+ route = indexed_route(:edge, filters, block)
24
+ end
21
25
  if route
22
26
  route
23
27
  else
@@ -28,11 +32,11 @@ module Pacer::Core::Graph
28
32
  attr_accessor :choose_best_index
29
33
  attr_accessor :search_manual_indices
30
34
 
31
- protected
35
+ private
32
36
 
33
37
  def indexed_route(element_type, filters, block)
34
38
  filters.graph = self
35
- filters.indices = graph.getIndices
39
+ filters.indices = graph.indices
36
40
  filters.choose_best_index = choose_best_index != false
37
41
  filters.search_manual_indices = search_manual_indices
38
42
  idx, key, value = filters.best_index(element_type)
@@ -3,14 +3,11 @@ module Pacer::Core::Graph
3
3
  # This module adds route methods to the basic graph classes returned from the
4
4
  # blueprints library.
5
5
  module GraphRoute
6
- import com.tinkerpop.pipes.transform.VerticesPipe
7
- import com.tinkerpop.pipes.transform.EdgesPipe
8
-
9
6
  # Returns a new route to all graph vertices. Standard filter options.
10
7
  def v(*filters, &block)
11
8
  filters = Pacer::Route.filters(filters)
12
9
  route = chain_route :element_type => :vertex,
13
- :pipe_class => VerticesPipe,
10
+ :pipe_class => Pacer::Pipes::VerticesPipe,
14
11
  :route_name => 'GraphV'
15
12
  Pacer::Route.property_filter(route, filters, block)
16
13
  end
@@ -19,7 +16,7 @@ module Pacer::Core::Graph
19
16
  def e(*filters, &block)
20
17
  filters = Pacer::Route.edge_filters(filters)
21
18
  route = chain_route :element_type => :edge,
22
- :pipe_class => EdgesPipe,
19
+ :pipe_class => Pacer::Pipes::EdgesPipe,
23
20
  :route_name => 'GraphE'
24
21
  Pacer::Route.property_filter(route, filters, block)
25
22
  end
@@ -3,13 +3,11 @@ module Pacer::Core::Graph
3
3
  # Basic methods for routes that may contain both vertices and edges. That can
4
4
  # happen as the result of a branched route, for example.
5
5
  module MixedRoute
6
- include ElementRoute
7
-
8
6
  # Pass through only vertices.
9
7
  def v(*args, &block)
10
8
  route = chain_route :element_type => :vertex,
11
9
  :pipe_class => Pacer::Pipes::TypeFilterPipe,
12
- :pipe_args => Pacer::VertexMixin,
10
+ :pipe_args => Pacer::Wrappers::VertexWrapper,
13
11
  :wrapper => wrapper,
14
12
  :extensions => extensions
15
13
  Pacer::Route.property_filter(route, args, block)
@@ -19,7 +17,7 @@ module Pacer::Core::Graph
19
17
  def e(*args, &block)
20
18
  route = chain_route :element_type => :edge,
21
19
  :pipe_class => Pacer::Pipes::TypeFilterPipe,
22
- :pipe_args => Pacer::EdgeMixin,
20
+ :pipe_args => Pacer::Wrappers::EdgeWrapper,
23
21
  :wrapper => wrapper,
24
22
  :extensions => extensions
25
23
  Pacer::Route.property_filter(route, args, block)
@@ -76,7 +74,7 @@ module Pacer::Core::Graph
76
74
  # Calculate and save result.
77
75
  def result(name = nil)
78
76
  ids = collect do |element|
79
- if element.is_a? Pacer::VertexMixin
77
+ if element.is_a? Pacer::Wrappers::VertexWrapper
80
78
  [:vertex, element.element_id]
81
79
  else
82
80
  [:edge, element.element_id]
@@ -2,14 +2,12 @@ module Pacer::Core::Graph
2
2
 
3
3
  # Basic methods for routes that contain only vertices.
4
4
  module VerticesRoute
5
- import com.tinkerpop.pipes.transform.OutEdgesPipe
6
- import com.tinkerpop.pipes.transform.OutPipe
7
- import com.tinkerpop.pipes.transform.InEdgesPipe
8
- import com.tinkerpop.pipes.transform.InPipe
9
- import com.tinkerpop.pipes.transform.BothEdgesPipe
10
- import com.tinkerpop.pipes.transform.BothPipe
11
-
12
- include ElementRoute
5
+ import com.tinkerpop.gremlin.pipes.transform.OutEdgesPipe
6
+ import com.tinkerpop.gremlin.pipes.transform.OutPipe
7
+ import com.tinkerpop.gremlin.pipes.transform.InEdgesPipe
8
+ import com.tinkerpop.gremlin.pipes.transform.InPipe
9
+ import com.tinkerpop.gremlin.pipes.transform.BothEdgesPipe
10
+ import com.tinkerpop.gremlin.pipes.transform.BothPipe
13
11
 
14
12
  # Extends the route with out edges from this route's matching vertices.
15
13
  #
@@ -17,7 +15,7 @@ module Pacer::Core::Graph
17
15
  # If string(s) or symbol(s) are given, they will be treated as edge
18
16
  # labels. Unlike other property filters which all must be matched, an
19
17
  # edge will pass the filter if it matches any of the given labels.
20
- # @yield [EdgeMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
18
+ # @yield [EdgeWrapper(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
21
19
  # @return [EdgesRoute]
22
20
  def out_e(*filters, &block)
23
21
  filters = extract_labels(filters)
@@ -34,7 +32,7 @@ module Pacer::Core::Graph
34
32
  # If string(s) or symbol(s) are given, they will be treated as edge
35
33
  # labels. Unlike other property filters which all must be matched, an
36
34
  # edge will pass the filter if it matches any of the given labels.
37
- # @yield [VertexMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
35
+ # @yield [VertexWrapper(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
38
36
  # @return [VerticesRoute]
39
37
  def out(*filters, &block)
40
38
  filters = extract_labels(filters)
@@ -51,7 +49,7 @@ module Pacer::Core::Graph
51
49
  # If string(s) or symbol(s) are given, they will be treated as edge
52
50
  # labels. Unlike other property filters which all must be matched, an
53
51
  # edge will pass the filter if it matches any of the given labels.
54
- # @yield [EdgeMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
52
+ # @yield [EdgeWrapper(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
55
53
  # @return [EdgesRoute]
56
54
  def in_e(*filters, &block)
57
55
  filters = extract_labels(filters)
@@ -68,7 +66,7 @@ module Pacer::Core::Graph
68
66
  # If string(s) or symbol(s) are given, they will be treated as edge
69
67
  # labels. Unlike other property filters which all must be matched, an
70
68
  # edge will pass the filter if it matches any of the given labels.
71
- # @yield [VertexMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
69
+ # @yield [VertexWrapper(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
72
70
  # @return [VerticesRoute]
73
71
  def in(*filters, &block)
74
72
  filters = extract_labels(filters)
@@ -85,7 +83,7 @@ module Pacer::Core::Graph
85
83
  # If string(s) or symbol(s) are given, they will be treated as edge
86
84
  # labels. Unlike other property filters which all must be matched, an
87
85
  # edge will pass the filter if it matches any of the given labels.
88
- # @yield [EdgeMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
86
+ # @yield [EdgeWrapper(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
89
87
  # @return [EdgesRoute]
90
88
  def both_e(*filters, &block)
91
89
  filters = extract_labels(filters)
@@ -102,7 +100,7 @@ module Pacer::Core::Graph
102
100
  # If string(s) or symbol(s) are given, they will be treated as edge
103
101
  # labels. Unlike other property filters which all must be matched, an
104
102
  # edge will pass the filter if it matches any of the given labels.
105
- # @yield [VertexMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
103
+ # @yield [VertexWrapper(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
106
104
  # @return [VerticesRoute]
107
105
  def both(*filters, &block)
108
106
  filters = extract_labels(filters)
@@ -119,7 +117,7 @@ module Pacer::Core::Graph
119
117
  # If string(s) or symbol(s) are given, they will be treated as edge
120
118
  # labels. Unlike other property filters which all must be matched, an
121
119
  # edge will pass the filter if it matches any of the given labels.
122
- # @yield [VertexMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
120
+ # @yield [VertexWrapper(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
123
121
  # @return [VerticesRoute]
124
122
  def v(*filters, &block)
125
123
  filter(*filters, &block)
@@ -130,7 +128,7 @@ module Pacer::Core::Graph
130
128
  # @return [element_type(:vertex)] The actual type varies based on
131
129
  # which graph is in use.
132
130
  def element_type
133
- graph.element_type(:vertex)
131
+ :vertex
134
132
  end
135
133
 
136
134
  # Delete all matching vertices and all edges which link to this
@@ -172,16 +170,17 @@ module Pacer::Core::Graph
172
170
  has_props = !props.empty?
173
171
  edge_ids = []
174
172
  counter = 0
175
- graph.managed_transactions do
176
- graph.managed_transaction do
177
- each do |from_v|
178
- to_vertices.each do |to_v|
179
- counter += 1
180
- graph.managed_checkpoint if counter % graph.bulk_job_size == 0
181
- begin
182
- edge = graph.create_edge(nil, from_v, to_v, label.to_s, props)
183
- edge_ids << edge.element_id
184
- end
173
+ graph.transaction do |commit, rollback|
174
+ v.each do |from_v|
175
+ to_vertices.each do |to_v|
176
+ counter += 1
177
+ if counter == graph.bulk_job_size
178
+ commit.call
179
+ counter = 0
180
+ end
181
+ begin
182
+ edge = graph.create_edge(nil, from_v, to_v, label.to_s, props)
183
+ edge_ids << edge.element_id
185
184
  end
186
185
  end
187
186
  end
@@ -214,7 +213,7 @@ module Pacer::Core::Graph
214
213
 
215
214
  # TODO: move id_pipe_class into the element_type object
216
215
  def id_pipe_class
217
- com.tinkerpop.pipes.transform.IdVertexPipe
216
+ com.tinkerpop.gremlin.pipes.transform.IdVertexPipe
218
217
  end
219
218
  end
220
219
  end
@@ -35,7 +35,7 @@ module Pacer
35
35
  #
36
36
  # @todo move this to graph routes.
37
37
  #
38
- # @return [GraphMixin]
38
+ # @return [PacerGraph]
39
39
  def graph
40
40
  @graph = nil unless defined? @graph
41
41
  @graph ||= (@back || @source).graph rescue nil
@@ -109,7 +109,7 @@ module Pacer
109
109
  # @return [Enumerator] if no block is given
110
110
  def each
111
111
  iter = iterator
112
- configure_iterator(iter)
112
+ iter = configure_iterator(iter)
113
113
  if block_given?
114
114
  while true
115
115
  yield iter.next
@@ -117,7 +117,7 @@ module Pacer
117
117
  else
118
118
  iter
119
119
  end
120
- rescue java.util.NoSuchElementException
120
+ rescue Pacer::EmptyPipe, java.util.NoSuchElementException
121
121
  self
122
122
  end
123
123
 
@@ -127,10 +127,17 @@ module Pacer
127
127
  # @return [java.util.Iterator] the pipe.
128
128
  def pipe
129
129
  iterator = each
130
- yield iterator if block_given?
131
- iterator
132
- rescue java.util.NoSuchElementException
133
- iterator
130
+ if block_given?
131
+ yield iterator if block_given?
132
+ else
133
+ iterator
134
+ end
135
+ rescue Pacer::EmptyPipe, java.util.NoSuchElementException
136
+ nil
137
+ end
138
+
139
+ def description(join = ' -> ')
140
+ "#<#{inspect_strings.join(join)}>"
134
141
  end
135
142
 
136
143
  # Returns a string representation of the route definition. If there are
@@ -142,7 +149,7 @@ module Pacer
142
149
  # @return [String]
143
150
  def inspect(limit = nil)
144
151
  if Pacer.hide_route_elements or hide_elements or source_iterator.nil?
145
- "#<#{inspect_strings.join(' -> ')}>"
152
+ description
146
153
  else
147
154
  Pacer.hide_route_elements do
148
155
  count = 0
@@ -169,7 +176,7 @@ module Pacer
169
176
  end
170
177
  end
171
178
  puts "Total: #{ count }"
172
- "#<#{inspect_strings.join(' -> ')}>"
179
+ description
173
180
  end
174
181
  end
175
182
  end
@@ -192,54 +199,14 @@ module Pacer
192
199
  none?
193
200
  end
194
201
 
195
- # Add an extension to the route.
196
- #
197
- # If the extension has a Route module inside it, this route will
198
- # be extended with the extension's Route module.
199
- #
200
- # If the extension has a Vertex or Edge module inside it, any vertices
201
- # or edges emitted from this route will be extended with with the
202
- # extension as well.
203
- #
204
- # @see VertexMixin#add_extensions
205
- # @see EdgeMixin#add_extensions
206
- #
207
- # @return [self]
208
- def add_extension(mod, add_to_list = true)
209
- return self unless mod.respond_to?(:const_defined?)
210
- is_extension = false
211
- if mod.const_defined? :Route
212
- is_extension = true
213
- extend mod::Route
214
- end
215
- if add_to_list and (is_extension or mod.const_defined? :Vertex or mod.const_defined? :Edge)
216
- @extensions << mod
217
- end
218
- self
219
- end
220
-
221
202
  def set_wrapper(wrapper)
222
- if wrapper.respond_to? :extensions
223
- wrapper.extensions.each do |ext|
224
- add_extension ext, false
225
- end
226
- end
227
- @wrapper = wrapper
228
- self
203
+ chain_route wrapper: wrapper
229
204
  end
230
- alias wrapper= set_wrapper
231
205
 
232
206
  def wrapper
233
207
  @wrapper
234
208
  end
235
209
 
236
- # Add extensions to this route.
237
- #
238
- # @see #add_extension
239
- def extensions=(exts)
240
- add_extensions Set[*exts]
241
- end
242
-
243
210
  # Get the set of extensions currently on this route.
244
211
  #
245
212
  # The order of extensions for custom defined wrappers are
@@ -248,31 +215,32 @@ module Pacer
248
215
  # extensions in order followed by any additional extensions in
249
216
  # undefined order.
250
217
  #
251
- # If a wrapper is present, returns an Array. Otherwise a Set.
218
+ # Returns an Array
252
219
  #
253
- # @return [Enumerable[extension]]
254
- def extensions
220
+ # @return [Array[extension]]
221
+ attr_reader :extensions
222
+
223
+ def all_extensions
255
224
  if wrapper
256
- wrapper.extensions + @extensions.to_a
225
+ wrapper.extensions + extensions
257
226
  else
258
- @extensions
227
+ extensions
259
228
  end
260
229
  end
261
230
 
262
231
  # If any objects in the given array are modules that contain a Route
263
232
  # submodule, extend this route with the Route module.
264
- # @see #add_extension
265
233
  # @return [self]
266
234
  def add_extensions(exts)
267
- modules = exts.select { |obj| obj.is_a? Module or obj.is_a? Class }
268
- modules.each do |mod|
269
- add_extension(mod)
270
- end
271
- self
235
+ chain_route extensions: (extensions - exts) + exts
236
+ end
237
+
238
+ def set_extensions(exts)
239
+ chain_route extensions: exts, wrapper: nil
272
240
  end
273
241
 
274
242
  def no_extensions
275
- chain_route(:extensions => nil, :wrapper => nil)
243
+ chain_route(:extensions => [], :wrapper => nil)
276
244
  end
277
245
 
278
246
  # Change the source of this route.
@@ -293,9 +261,10 @@ module Pacer
293
261
 
294
262
  # Set the previous route in the chain.
295
263
  def back=(back)
296
- if back.is_a? Route and not back.is_a? GraphMixin
264
+ if back.is_a? Route and not back.is_a? PacerGraph
297
265
  @back = back
298
266
  else
267
+ @back = nil
299
268
  @source = back
300
269
  end
301
270
  end
@@ -316,6 +285,7 @@ module Pacer
316
285
  # Overridden to extend the iterator to apply mixins
317
286
  # or wrap elements
318
287
  def configure_iterator(iter)
288
+ iter
319
289
  end
320
290
 
321
291
  def get_section_route(name)
@@ -363,9 +333,9 @@ module Pacer
363
333
 
364
334
  # Return an iterator for a variety of source object types.
365
335
  def iterator_from_source(src)
366
- if src.is_a? Pacer::GraphMixin
336
+ if src.is_a? PacerGraph
367
337
  al = java.util.ArrayList.new
368
- al << src
338
+ al << src.blueprints_graph
369
339
  al.iterator
370
340
  elsif src.is_a? Pacer::Wrappers::ElementWrapper
371
341
  Pacer::Pipes::EnumerablePipe.new src.element
@@ -496,7 +466,6 @@ module Pacer
496
466
  s = "#{s} #{ info }" if info
497
467
  s
498
468
  end
499
-
500
469
  end
501
470
  end
502
471
  end
@@ -1,11 +1,18 @@
1
1
  module Pacer
2
- class ElementNotFound < StandardError
3
- end
2
+ class Error < StandardError; end
3
+ class UserError < Error; end
4
+ class ElementNotFound < UserError; end
5
+ class ElementExists < UserError; end
4
6
 
5
- class ElementExists < StandardError
6
- end
7
+ class LogicError < Error; end
8
+ class ClientError < LogicError; end
9
+ class TransactionConcludedError < ClientError; end
10
+ class NestedTransactionRollback < ClientError; end
11
+ class NestedMockTransactionRollback < NestedTransactionRollback; end
12
+ class MockTransactionRollback < ClientError; end
13
+ class UnsupportedOperation < ClientError; end
7
14
 
8
- class UnsupportedOperation < StandardError
9
- end
15
+ class InternalError < LogicError; end
16
+ class TransientError < Error; end
10
17
  end
11
18
 
@@ -6,11 +6,6 @@ module Pacer
6
6
  @back = back
7
7
  end
8
8
 
9
- # The previous route element.
10
- def back
11
- @back
12
- end
13
-
14
9
  # The vars hash contains variables that were set earlier in the processing
15
10
  # of the route. Vars may also be set within the block.
16
11
  def vars
@@ -27,6 +27,8 @@ module Pacer
27
27
  module CollectionFilter
28
28
  import java.util.HashSet
29
29
 
30
+ include Pacer::Visitors::VisitsSection
31
+
30
32
  attr_reader :var, :comparison, :ids, :objects
31
33
 
32
34
  def except=(collection)
@@ -36,6 +38,7 @@ module Pacer
36
38
 
37
39
  def except_var=(var)
38
40
  @var = var
41
+ self.section = var
39
42
  @comparison = Pacer::Pipes::NOT_EQUAL
40
43
  end
41
44
 
@@ -46,6 +49,7 @@ module Pacer
46
49
 
47
50
  def only_var=(var)
48
51
  @var = var
52
+ self.section = var
49
53
  @comparison = Pacer::Pipes::EQUAL
50
54
  end
51
55
 
@@ -73,8 +77,11 @@ module Pacer
73
77
  end
74
78
 
75
79
  def attach_pipe(end_pipe)
76
- if var
77
- pipe = Pacer::Pipes::CollectionFilterPipe.new(vars[var], comparison)
80
+ if section_visitor_target
81
+ element = section_visitor_target.new
82
+ # Will cause section_visitor to call the #on_element and #reset methods.
83
+ section_visitor.visitor = element
84
+ pipe = Pacer::Pipes::CollectionFilterPipe.new(element, comparison)
78
85
  elsif ids
79
86
  pipe = Pacer::Pipes::IdCollectionFilterPipe.new(ids, comparison)
80
87
  else
@@ -13,7 +13,7 @@ module Pacer
13
13
  # @param [Route] back the route the new route is based on.
14
14
  # @return [Route]
15
15
  def empty(back)
16
- Pacer::Route.new :filter => :empty, :back => back
16
+ back.chain_route :filter => :empty
17
17
  end
18
18
 
19
19
  def block_branch(back, block, branch_start = nil)
@@ -21,7 +21,7 @@ module Pacer
21
21
  route = block.call rescue nil
22
22
  else
23
23
  unless branch_start
24
- if back.is_a? Pacer::Graph
24
+ if back.is_a? Pacer::Graph
25
25
  branch_start = back
26
26
  else
27
27
  branch_start = Pacer::Route.empty(back)
@@ -61,7 +61,16 @@ module Pacer
61
61
  end
62
62
 
63
63
  def inspect_class_name
64
- s = "#{element_type.to_s.scan(/Elem|Obj|V|E/).last}"
64
+ s = case element_type
65
+ when :vertex
66
+ 'V'
67
+ when :edge
68
+ 'E'
69
+ when :object
70
+ 'Obj'
71
+ when :mixed
72
+ 'Elem'
73
+ end
65
74
  s = "#{s} #{ @info }" if @info
66
75
  s
67
76
  end
@@ -18,11 +18,11 @@ module Pacer
18
18
  attr_accessor :min, :max
19
19
 
20
20
  def block=(block)
21
- @future_filter = [block, true]
21
+ @future_filter = [block, false]
22
22
  end
23
23
 
24
24
  def neg_block=(block)
25
- @future_filter = [block, false]
25
+ @future_filter = [block, true]
26
26
  end
27
27
 
28
28
  protected
@@ -41,14 +41,14 @@ module Pacer
41
41
 
42
42
  def lookahead_route
43
43
  if @future_filter
44
- block, has_elements = @future_filter
44
+ block, negate = @future_filter
45
45
  @future_filter = nil
46
46
  route = block.call(Pacer::Route.empty(self))
47
47
  if min or max
48
48
  route = route.has_count_route(:min => min, :max => max).is(true)
49
49
  end
50
- unless has_elements
51
- route = route.chain_route(:element_type => :object, :pipe_class => Pacer::Pipes::IsEmptyPipe, :route_name => 'negate')
50
+ if negate
51
+ route = route.chain_route(pipe_class: Pacer::Pipes::IsEmptyPipe, :route_name => 'negate')
52
52
  end
53
53
  @route = route
54
54
  elsif @route