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.
- data/Gemfile +5 -0
- data/lib/pacer/blueprints/tg.rb +2 -2
- data/lib/pacer/core/array_route.rb +80 -0
- data/lib/pacer/core/graph/element_route.rb +13 -13
- data/lib/pacer/core/graph/mixed_route.rb +2 -2
- data/lib/pacer/core/hash_route.rb +25 -1
- data/lib/pacer/core/route.rb +4 -9
- data/lib/pacer/exceptions.rb +6 -5
- data/lib/pacer/filter/property_filter/filters.rb +2 -6
- data/lib/pacer/filter/range_filter.rb +3 -1
- data/lib/pacer/graph/graph_transactions_mixin.rb +48 -12
- data/lib/pacer/graph/pacer_graph.rb +41 -10
- data/lib/pacer/graph/yaml_encoder.rb +8 -1
- data/lib/pacer/loader.rb +1 -0
- data/lib/pacer/pipe/loop_pipe.rb +1 -1
- data/lib/pacer/pipe/path_wrapping_pipe.rb +2 -2
- data/lib/pacer/pipe/wrapping_pipe.rb +1 -1
- data/lib/pacer/route/mixin/bulk_operations.rb +2 -2
- data/lib/pacer/support/awesome_print.rb +44 -0
- data/lib/pacer/transform/join.rb +15 -1
- data/lib/pacer/transform/lookup_ids.rb +36 -0
- data/lib/pacer/transform/path.rb +3 -1
- data/lib/pacer/transform/path_tree.rb +1 -1
- data/lib/pacer/version.rb +4 -4
- data/lib/pacer/visitors/section.rb +1 -1
- data/lib/pacer/wrappers/edge_wrapper.rb +9 -9
- data/lib/pacer/wrappers/element_wrapper.rb +11 -0
- data/lib/pacer/wrappers/index_wrapper.rb +1 -1
- data/lib/pacer/wrappers/path_wrapping_pipe_function.rb +1 -1
- data/lib/pacer/wrappers/vertex_wrapper.rb +3 -3
- data/lib/pacer/wrappers/wrapper_selector.rb +30 -12
- data/lib/pacer/wrappers/wrapping_pipe_function.rb +3 -3
- data/pom.xml +4 -4
- data/spec/pacer/blueprints/neo4j_spec.rb +50 -8
- data/spec/pacer/core/graph/element_route_spec.rb +1 -1
- data/spec/pacer/graph/yaml_encoder_spec.rb +5 -1
- data/spec/pacer/route/mixin/base_spec.rb +4 -1
- data/spec/pacer/wrapper/edge_wrapper_spec.rb +1 -1
- data/spec/pacer/wrapper/element_wrapper_spec.rb +10 -3
- data/spec/pacer/wrapper/vertex_wrapper_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/support/graph_runner.rb +8 -3
- data/spec/support/matchers.rb +1 -1
- 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
|
-
|
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'
|
data/lib/pacer/pipe/loop_pipe.rb
CHANGED
@@ -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
|
data/lib/pacer/transform/join.rb
CHANGED
@@ -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
|
data/lib/pacer/transform/path.rb
CHANGED
@@ -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
|
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: :
|
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.
|
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.
|
11
|
-
PIPES_VERSION = "2.
|
12
|
-
GREMLIN_VERSION = "2.
|
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
|
-
|
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],
|
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
|
-
|
51
|
+
self.class.base_vertex_wrapper.wrapper_for(extensions).new graph, v
|
52
52
|
elsif extensions
|
53
|
-
|
53
|
+
self.class.base_vertex_wrapper.wrapper_for([extensions]).new graph, v
|
54
54
|
else
|
55
|
-
|
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
|
-
|
64
|
+
self.class.base_vertex_wrapper.wrapper_for(extensions).new graph, v
|
65
65
|
elsif extensions
|
66
|
-
|
66
|
+
self.class.base_vertex_wrapper.wrapper_for([extensions]).new graph, v
|
67
67
|
else
|
68
|
-
|
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
|
-
|
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
|
@@ -18,7 +18,7 @@ module Pacer::Wrappers
|
|
18
18
|
|
19
19
|
def wrapper_for(exts)
|
20
20
|
if exts
|
21
|
-
|
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],
|
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
|
-
|
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
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|
-
|
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
|
25
|
-
|
26
|
-
|
27
|
-
|
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
|
|