pacer 1.1.1-java → 1.2.0-java

Sign up to get free protection for your applications and to get access to all the features.
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