pacer 1.1.1-java → 1.2.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 (44) hide show
  1. data/Gemfile +5 -0
  2. data/lib/pacer/blueprints/tg.rb +2 -2
  3. data/lib/pacer/core/array_route.rb +80 -0
  4. data/lib/pacer/core/graph/element_route.rb +13 -13
  5. data/lib/pacer/core/graph/mixed_route.rb +2 -2
  6. data/lib/pacer/core/hash_route.rb +25 -1
  7. data/lib/pacer/core/route.rb +4 -9
  8. data/lib/pacer/exceptions.rb +6 -5
  9. data/lib/pacer/filter/property_filter/filters.rb +2 -6
  10. data/lib/pacer/filter/range_filter.rb +3 -1
  11. data/lib/pacer/graph/graph_transactions_mixin.rb +48 -12
  12. data/lib/pacer/graph/pacer_graph.rb +41 -10
  13. data/lib/pacer/graph/yaml_encoder.rb +8 -1
  14. data/lib/pacer/loader.rb +1 -0
  15. data/lib/pacer/pipe/loop_pipe.rb +1 -1
  16. data/lib/pacer/pipe/path_wrapping_pipe.rb +2 -2
  17. data/lib/pacer/pipe/wrapping_pipe.rb +1 -1
  18. data/lib/pacer/route/mixin/bulk_operations.rb +2 -2
  19. data/lib/pacer/support/awesome_print.rb +44 -0
  20. data/lib/pacer/transform/join.rb +15 -1
  21. data/lib/pacer/transform/lookup_ids.rb +36 -0
  22. data/lib/pacer/transform/path.rb +3 -1
  23. data/lib/pacer/transform/path_tree.rb +1 -1
  24. data/lib/pacer/version.rb +4 -4
  25. data/lib/pacer/visitors/section.rb +1 -1
  26. data/lib/pacer/wrappers/edge_wrapper.rb +9 -9
  27. data/lib/pacer/wrappers/element_wrapper.rb +11 -0
  28. data/lib/pacer/wrappers/index_wrapper.rb +1 -1
  29. data/lib/pacer/wrappers/path_wrapping_pipe_function.rb +1 -1
  30. data/lib/pacer/wrappers/vertex_wrapper.rb +3 -3
  31. data/lib/pacer/wrappers/wrapper_selector.rb +30 -12
  32. data/lib/pacer/wrappers/wrapping_pipe_function.rb +3 -3
  33. data/pom.xml +4 -4
  34. data/spec/pacer/blueprints/neo4j_spec.rb +50 -8
  35. data/spec/pacer/core/graph/element_route_spec.rb +1 -1
  36. data/spec/pacer/graph/yaml_encoder_spec.rb +5 -1
  37. data/spec/pacer/route/mixin/base_spec.rb +4 -1
  38. data/spec/pacer/wrapper/edge_wrapper_spec.rb +1 -1
  39. data/spec/pacer/wrapper/element_wrapper_spec.rb +10 -3
  40. data/spec/pacer/wrapper/vertex_wrapper_spec.rb +1 -1
  41. data/spec/spec_helper.rb +1 -0
  42. data/spec/support/graph_runner.rb +8 -3
  43. data/spec/support/matchers.rb +1 -1
  44. metadata +5 -4
@@ -21,6 +21,8 @@ module Pacer
21
21
  end
22
22
  when true, false
23
23
  value.to_java
24
+ when DateTime, Time, Date
25
+ value.strftime ' time %Y-%m-%d %H:%M:%S.%L %z'
24
26
  when Array
25
27
  if value.length == 0
26
28
  value_type = Fixnum
@@ -53,7 +55,12 @@ module Pacer
53
55
 
54
56
  def self.decode_property(value)
55
57
  if value.is_a? String and value[0, 1] == ' '
56
- YAML.load(value[1..-1])
58
+ if value[1, 4] == 'time'
59
+ # FIXME: we lose the milliseconds here...
60
+ Time.parse value[6..-1]
61
+ else
62
+ YAML.load(value[1..-1])
63
+ end
57
64
  elsif value.is_a? ArrayJavaProxy
58
65
  value.to_a
59
66
  else
data/lib/pacer/loader.rb CHANGED
@@ -97,6 +97,7 @@ require 'pacer/transform/scatter'
97
97
  require 'pacer/transform/has_count_cap'
98
98
  require 'pacer/transform/sort_section'
99
99
  require 'pacer/transform/payload'
100
+ require 'pacer/transform/lookup_ids'
100
101
 
101
102
  require 'pacer/side_effect/aggregate'
102
103
  require 'pacer/side_effect/as'
@@ -6,7 +6,7 @@ module Pacer::Pipes
6
6
  super()
7
7
  @graph = graph
8
8
  @control_block = control_block
9
- @wrapper = Pacer::Wrappers::WrapperSelector.build
9
+ @wrapper = Pacer::Wrappers::WrapperSelector.build graph
10
10
 
11
11
  @expando = ExpandablePipe.new
12
12
  empty = ArrayList.new
@@ -7,8 +7,8 @@ module Pacer
7
7
  def initialize(graph, vertex_extensions = [], edge_extensions = [])
8
8
  super()
9
9
  @graph = graph
10
- @vertex_wrapper = Pacer::Wrappers::WrapperSelector.build :vertex, vertex_extensions || Set[]
11
- @edge_wrapper = Pacer::Wrappers::WrapperSelector.build :edge, edge_extensions || Set[]
10
+ @vertex_wrapper = Pacer::Wrappers::WrapperSelector.build graph, :vertex, vertex_extensions || Set[]
11
+ @edge_wrapper = Pacer::Wrappers::WrapperSelector.build graph, :edge, edge_extensions || Set[]
12
12
  end
13
13
 
14
14
  def getCurrentPath
@@ -8,7 +8,7 @@ module Pacer
8
8
  @graph = graph
9
9
  @element_type = element_type
10
10
  @extensions = extensions || []
11
- @wrapper = Pacer::Wrappers::WrapperSelector.build element_type, @extensions
11
+ @wrapper = Pacer::Wrappers::WrapperSelector.build graph, element_type, @extensions
12
12
  end
13
13
 
14
14
  def getSideEffect
@@ -25,15 +25,15 @@ module Pacer::Routes
25
25
  size ||= target_graph.bulk_job_size
26
26
  counter = 0
27
27
  target_graph.transaction(nesting: true) do |commit, rollback|
28
+ print "Bulk job ->" if Pacer.verbose?
28
29
  each_slice(size) do |slice|
29
- print counter if Pacer.verbose?
30
+ print " #{counter}" if Pacer.verbose?
30
31
  counter += size
31
32
  slice.each do |element|
32
33
  yield element
33
34
  end
34
35
  commit.call
35
36
  end
36
- print '.' if Pacer.verbose?
37
37
  end
38
38
  ensure
39
39
  puts '!' if Pacer.verbose?
@@ -0,0 +1,44 @@
1
+ begin
2
+ require 'awesome_print'
3
+ rescue LoadError
4
+ end
5
+
6
+ # Fix the way ap indents hashes:
7
+
8
+ # for awesome_print <= 0.4.0
9
+ class AwesomePrint
10
+ # for awesome_print >= 1.0.0
11
+ #class AwesomePrint::Formatter
12
+ private
13
+
14
+ # Format a hash. If @options[:indent] if negative left align hash keys.
15
+ #------------------------------------------------------------------------------
16
+ def awesome_hash(h)
17
+ return "{}" if h == {}
18
+
19
+ keys = @options[:sorted_hash_keys] ? h.keys.sort { |a, b| a.to_s <=> b.to_s } : h.keys
20
+ data = keys.map do |key|
21
+ plain_single_line do
22
+ #[ @inspector.awesome(key), h[key] ]
23
+ [ awesome(key), h[key] ]
24
+ end
25
+ end
26
+
27
+ data = data.map do |key, value|
28
+ if @options[:multiline]
29
+ formatted_key = indent + key
30
+ else
31
+ formatted_key = key
32
+ end
33
+ indented do
34
+ #formatted_key << colorize(" => ", :hash) << @inspector.awesome(value)
35
+ formatted_key << colorize(" => ", :hash) << awesome(value)
36
+ end
37
+ end
38
+ if @options[:multiline]
39
+ "{\n" << data.join(",\n") << "\n#{outdent}}"
40
+ else
41
+ "{ #{data.join(', ')} }"
42
+ end
43
+ end
44
+ end
@@ -42,7 +42,7 @@ module Pacer
42
42
  def initialize(from_graph, multi_graph)
43
43
  super()
44
44
  @from_graph = from_graph
45
- @wrapper = Pacer::Wrappers::WrapperSelector.build
45
+ @wrapper = Pacer::Wrappers::WrapperSelector.build from_graph
46
46
  @multi_graph = multi_graph || Pacer::MultiGraph.blank
47
47
  @values_pipes = []
48
48
  @current_keys = []
@@ -133,6 +133,20 @@ module Pacer
133
133
  attr_accessor :existing_multi_graph, :key_route, :values_routes, :from_graph
134
134
  attr_writer :join_on
135
135
 
136
+ # FIXME: the pipe changes the graph. This does not fit with the idea of immutable routes.
137
+ def graph
138
+ @graph or super
139
+ end
140
+
141
+ def run!
142
+ super
143
+ @graph
144
+ end
145
+
146
+ def graph=(g)
147
+ @graph = g
148
+ end
149
+
136
150
  def key(&block)
137
151
  self.key_route = Pacer::Route.block_branch(self, block)
138
152
  self
@@ -0,0 +1,36 @@
1
+ module Pacer
2
+ module Routes
3
+ # TODO: this should only apply to ID routes...do we want to be that granular with route types?
4
+ module RouteOperations
5
+ # args is (optional) extensions followed by an (optional) options hash
6
+ def lookup_ids(*args)
7
+ if args.last.is_a? Hash
8
+ opts = args.pop
9
+ else
10
+ opts = {}
11
+ end
12
+ chain_route({transform: :lookup_ids, element_type: :vertex, extensions: args, wrapper: nil}.merge(opts))
13
+ end
14
+ end
15
+ end
16
+
17
+ module Transform
18
+ module LookupIds
19
+ import com.tinkerpop.gremlin.pipes.transform.IdVertexPipe
20
+ import com.tinkerpop.gremlin.pipes.transform.IdEdgePipe
21
+
22
+ def attach_pipe(end_pipe)
23
+ fail ClientError, 'Can not look up elements without the graph' unless graph
24
+ if element_type == :vertex
25
+ pipe = IdVertexPipe.new graph.blueprints_graph
26
+ elsif element_type == :vertex
27
+ pipe = IdEdgePipe.new graph.blueprints_graph
28
+ else
29
+ fail ClientError, 'Can not look up elements without the element_type'
30
+ end
31
+ pipe.setStarts end_pipe
32
+ pipe
33
+ end
34
+ end
35
+ end
36
+ end
@@ -38,7 +38,9 @@ This is especially useful for graph traversals.
38
38
  # #<E[40]:38-document-id-39>,
39
39
  # #<V[39]>]
40
40
 
41
- See the :paths section for more details and general information about paths.
41
+ See:
42
+ :paths - for more details and general information about paths.
43
+ :arrays - for general operations that work on arrays or paths.
42
44
 
43
45
  HELP
44
46
  else
@@ -15,7 +15,7 @@ module Pacer
15
15
 
16
16
  # The default comparator block is { |prev, current| prev == current }
17
17
  def tree(&block)
18
- wrapped.chain_route transform: :path_tree, element_type: :object, compare: block
18
+ wrapped.chain_route transform: :path_tree, element_type: :array, compare: block
19
19
  end
20
20
  end
21
21
  end
data/lib/pacer/version.rb CHANGED
@@ -1,14 +1,14 @@
1
1
  module Pacer
2
2
  unless const_defined? :VERSION
3
- VERSION = "1.1.1"
3
+ VERSION = "1.2.0"
4
4
 
5
5
  JAR = "pacer-#{ VERSION }-standalone.jar"
6
6
  JAR_PATH = "lib/#{ JAR }"
7
7
 
8
8
  START_TIME = Time.now
9
9
 
10
- BLUEPRINTS_VERSION = "2.1.0"
11
- PIPES_VERSION = "2.1.0"
12
- GREMLIN_VERSION = "2.1.0"
10
+ BLUEPRINTS_VERSION = "2.2.0"
11
+ PIPES_VERSION = "2.2.0"
12
+ GREMLIN_VERSION = "2.2.0"
13
13
  end
14
14
  end
@@ -31,7 +31,7 @@ module Pacer
31
31
  def attach_pipe(end_pipe)
32
32
  pipe = end_pipe
33
33
  @section_visitors = (1..visitor_count).map do
34
- pipe = Pacer::Pipes::SimpleVisitorPipe.new Pacer::Wrappers::WrapperSelector.build(element_type, extensions), graph
34
+ pipe = Pacer::Pipes::SimpleVisitorPipe.new Pacer::Wrappers::WrapperSelector.build(graph, element_type, extensions), graph
35
35
  pipe.setStarts end_pipe if end_pipe
36
36
  end_pipe = pipe
37
37
  end
@@ -18,7 +18,7 @@ module Pacer::Wrappers
18
18
 
19
19
  def wrapper_for(exts)
20
20
  if exts
21
- EdgeWrapper.wrappers[exts] ||= build_edge_wrapper(exts)
21
+ base_edge_wrapper.wrappers[exts] ||= build_edge_wrapper(exts)
22
22
  else
23
23
  fail Pacer::LogicError, "Extensions should not be nil"
24
24
  end
@@ -31,7 +31,7 @@ module Pacer::Wrappers
31
31
  protected
32
32
 
33
33
  def build_edge_wrapper(exts)
34
- build_extension_wrapper(exts, [:Route, :Edge], EdgeWrapper)
34
+ build_extension_wrapper(exts, [:Route, :Edge], base_edge_wrapper)
35
35
  end
36
36
  end
37
37
 
@@ -48,11 +48,11 @@ module Pacer::Wrappers
48
48
  def in_vertex(extensions = nil)
49
49
  v = element.getVertex Pacer::Pipes::IN
50
50
  if extensions.is_a? Enumerable
51
- VertexWrapper.wrapper_for(extensions).new graph, v
51
+ self.class.base_vertex_wrapper.wrapper_for(extensions).new graph, v
52
52
  elsif extensions
53
- VertexWrapper.wrapper_for([extensions]).new graph, v
53
+ self.class.base_vertex_wrapper.wrapper_for([extensions]).new graph, v
54
54
  else
55
- VertexWrapper.new graph, v
55
+ self.class.base_vertex_wrapper.new graph, v
56
56
  end
57
57
  end
58
58
 
@@ -61,11 +61,11 @@ module Pacer::Wrappers
61
61
  def out_vertex(extensions = nil)
62
62
  v = element.getVertex Pacer::Pipes::OUT
63
63
  if extensions.is_a? Enumerable
64
- VertexWrapper.wrapper_for(extensions).new graph, v
64
+ self.class.base_vertex_wrapper.wrapper_for(extensions).new graph, v
65
65
  elsif extensions
66
- VertexWrapper.wrapper_for([extensions]).new graph, v
66
+ self.class.base_vertex_wrapper.wrapper_for([extensions]).new graph, v
67
67
  else
68
- VertexWrapper.new graph, v
68
+ self.class.base_vertex_wrapper.new graph, v
69
69
  end
70
70
  end
71
71
 
@@ -94,7 +94,7 @@ module Pacer::Wrappers
94
94
  # Returns the element with a new simple wrapper.
95
95
  # @return [EdgeWrapper]
96
96
  def no_extensions
97
- EdgeWrapper.new graph, element
97
+ self.class.base_edge_wrapper.new graph, element
98
98
  end
99
99
 
100
100
  # Returns a human-readable representation of the edge using the
@@ -7,6 +7,16 @@ module Pacer::Wrappers
7
7
  include Pacer::Core::Graph::ElementRoute
8
8
 
9
9
  class << self
10
+ attr_accessor :caches
11
+
12
+ def base_vertex_wrapper
13
+ VertexWrapper
14
+ end
15
+
16
+ def base_edge_wrapper
17
+ EdgeWrapper
18
+ end
19
+
10
20
  def wrap(element, exts)
11
21
  wrapper_for(exts).new(element.graph, element.element)
12
22
  end
@@ -22,6 +32,7 @@ module Pacer::Wrappers
22
32
  def clear_cache
23
33
  VertexWrapper.clear_cache
24
34
  EdgeWrapper.clear_cache
35
+ caches.each { |c| c.clear_cache } if caches
25
36
  end
26
37
 
27
38
  def route_conditions
@@ -13,7 +13,7 @@ module Pacer::Wrappers
13
13
  end
14
14
 
15
15
  def wrapper
16
- WrapperSelector.build element_type
16
+ WrapperSelector.build graph, element_type
17
17
  end
18
18
 
19
19
  def first(key, value, extensions = nil)
@@ -10,7 +10,7 @@ module Pacer
10
10
  if back
11
11
  @graph = back.graph
12
12
  end
13
- @wrapper = WrapperSelector.build
13
+ @wrapper = WrapperSelector.build graph
14
14
  end
15
15
 
16
16
  def arity
@@ -18,7 +18,7 @@ module Pacer::Wrappers
18
18
 
19
19
  def wrapper_for(exts)
20
20
  if exts
21
- VertexWrapper.wrappers[exts.to_set] ||= build_vertex_wrapper(exts)
21
+ base_vertex_wrapper.wrappers[exts.to_set] ||= build_vertex_wrapper(exts)
22
22
  else
23
23
  fail Pacer::LogicError, "Extensions should not be nil"
24
24
  end
@@ -31,7 +31,7 @@ module Pacer::Wrappers
31
31
  protected
32
32
 
33
33
  def build_vertex_wrapper(exts)
34
- build_extension_wrapper(exts, [:Route, :Vertex], VertexWrapper)
34
+ build_extension_wrapper(exts, [:Route, :Vertex], base_vertex_wrapper)
35
35
  end
36
36
  end
37
37
 
@@ -64,7 +64,7 @@ module Pacer::Wrappers
64
64
  # Returns the element with a new simple wrapper.
65
65
  # @return [VertexWrapper]
66
66
  def no_extensions
67
- VertexWrapper.new graph, element
67
+ self.class.base_vertex_wrapper.new graph, element
68
68
  end
69
69
 
70
70
  # Checks that the given extensions can be applied to the vertex. If
@@ -3,13 +3,23 @@ module Pacer::Wrappers
3
3
  import com.tinkerpop.blueprints.Vertex
4
4
  import com.tinkerpop.blueprints.Edge
5
5
 
6
- def self.build(element_type = nil, extensions = [])
7
- if element_type == :vertex
8
- Pacer::Wrappers::VertexWrapper.wrapper_for extensions
9
- elsif element_type == :edge
10
- Pacer::Wrappers::EdgeWrapper.wrapper_for extensions
6
+ def self.build(graph, element_type = nil, extensions = [])
7
+ if graph
8
+ if element_type == :vertex
9
+ graph.base_vertex_wrapper.wrapper_for extensions
10
+ elsif element_type == :edge
11
+ graph.base_edge_wrapper.wrapper_for extensions
12
+ else
13
+ new extensions
14
+ end
11
15
  else
12
- new extensions
16
+ if element_type == :vertex
17
+ Pacer::Wrappers::VertexWrapper.wrapper_for extensions
18
+ elsif element_type == :edge
19
+ Pacer::Wrappers::EdgeWrapper.wrapper_for extensions
20
+ else
21
+ new extensions
22
+ end
13
23
  end
14
24
  end
15
25
 
@@ -20,16 +30,24 @@ module Pacer::Wrappers
20
30
  @extensions = extensions
21
31
  end
22
32
 
23
- def wrapper(element)
24
- if element.is_a? Vertex
25
- self.vertex_wrapper ||= Pacer::Wrappers::VertexWrapper.wrapper_for extensions
26
- elsif element.is_a? Edge
27
- self.edge_wrapper ||= Pacer::Wrappers::EdgeWrapper.wrapper_for extensions
33
+ def wrapper(graph, element)
34
+ if graph
35
+ if element.is_a? Vertex
36
+ self.vertex_wrapper ||= graph.base_vertex_wrapper.wrapper_for extensions
37
+ elsif element.is_a? Edge
38
+ self.edge_wrapper ||= graph.base_edge_wrapper.wrapper_for extensions
39
+ end
40
+ else
41
+ if element.is_a? Vertex
42
+ self.vertex_wrapper ||= Pacer::Wrappers::VertexWrapper.wrapper_for extensions
43
+ elsif element.is_a? Edge
44
+ self.edge_wrapper ||= Pacer::Wrappers::EdgeWrapper.wrapper_for extensions
45
+ end
28
46
  end
29
47
  end
30
48
 
31
49
  def new(graph, element)
32
- w = wrapper(element)
50
+ w = wrapper(graph, element)
33
51
  if w
34
52
  w.new graph, element
35
53
  else
@@ -12,7 +12,7 @@ module Pacer
12
12
  @extensions = back.extensions
13
13
  element_type = back.element_type
14
14
  end
15
- @wrapper = WrapperSelector.build element_type, extensions
15
+ @wrapper = WrapperSelector.build graph, element_type, extensions
16
16
  end
17
17
 
18
18
  def arity
@@ -20,14 +20,14 @@ module Pacer
20
20
  end
21
21
 
22
22
  def compute(element)
23
- e = wrapper.new graph, element
23
+ e = wrapper.new graph, element if element
24
24
  block.call e
25
25
  end
26
26
 
27
27
  alias call compute
28
28
 
29
29
  def call_with_args(element, *args)
30
- e = wrapper.new graph, element
30
+ e = wrapper.new graph, element if element
31
31
  block.call e, *args
32
32
  end
33
33